鱼C论坛

 找回密码
 立即注册
查看: 1491|回复: 11

[已解决]爬虫大佬可以进来瞧瞧 帮忙小弟 顺便给自己巩固一下

[复制链接]
发表于 2020-4-22 22:12:34 | 显示全部楼层 |阅读模式
6鱼币
图片url已经被我获得了
使用遍历进行文件保存时候 访问图片url 返回的是404

第一次遇见这样的
我以为代码敲错了

所以我就使用断点测试发现返回404了
如图1所示


目标网站:http://zhainanba.net/category/zhainanfuli/jinrimeizi
下面是代码:
import os,requests
from lxml import etree

count = 1
url = "http://zhainanba.net/category/zhainanfuli/jinrimeizi"
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
}
response = requests.get(url=url,headers=headers)
response.encoding = "utf-8"
html = response.text


tree = etree.HTML(html)
url = tree.xpath('//article[@class="excerpt excerpt-one"]')


list2 = []
for li in url:
        url_list = li.xpath('./p[1]/a/@href')[0]
        list2.append(url_list)
print("url采集完毕!")

list3 = []
for each in list2:
        response = requests.get(url=each,headers=headers)
        response.encoding = "utf-8"
        html = response.text

        tree = etree.HTML(html)
        imgs = tree.xpath('//article[@class="article-content"]/p/img/@src')[0]
        list3.append(imgs)
        print("正在采集图片中……")
print("采集完毕!")

if not os.path.exists('./test'):
        os.mkdir('./test')

Connection = {
        "Connection": "keep-alive"
}

Server = {
        "Server": "nginx/1.7.7"
}

for src in list3:
        #请求到了图片的二进制数据
        img_data = requests.get(url=src,headers=headers).content
        img_name = str(count) + ".jpg"#
        count = int(count)#
        count += 1#
        imgPath = "./test/" + img_name
        with open(imgPath,"wb") as fp:
            fp.write(img_data)
            print(img_name + '下载成功!')

在网站时候可以正常请求图片 但是你只要刷新一下  马上404送给我 = =
大佬们   一共只有7个币 最多给你们6个 还有一个交税了  救救me!
最佳答案
2020-4-22 22:12:35
本帖最后由 Stubborn 于 2020-4-24 00:06 编辑

好可爱的妹子啊 ,测试10张没有问题,速度好慢,不得行,得加代理池用Scrapy取搞


这里额外说一句,
for m in D:
    session.headers["Referer"] = data[0]

关于跟新headers的Referer,还是重新用一个headers用于新的请求,有代测试,这里就爬了一个连接,不测试了


微信截图_20200424000009.png
# -*- coding: utf-8 -*-
# !/usr/bin/python3
"""
@ version: ??
@ author: Alex
@ file: test
@datetime: 2020/4/23 - 23:30
@explain:
"""

import requests
import re
import os

session = requests.session()

domain = "http://zhainanba.net"
params = {
    'Accept': 'text/html, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Host': 'zhainanba.net',
    'Pragma': 'no-cache',
    'Referer': 'http://zhainanba.net/category/zhainanfuli/jinrimeizi',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}

data = []
for page in range(1, 5):
    url = f"http://zhainanba.net/category/zhainanfuli/jinrimeizi/page/{page}"
    resp = session.get(url, params=params)
    data += re.findall(r"http://zhainanba\.net/\d+\.html", resp.text)

param = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36',

}

# for urls in data:

resp = session.get(data[0])
D = re.findall("https://ac\.meijiecao\.net/ac/img/znb/meizitu/.*?\.jpg", resp.text)
for m in D:
    session.headers["Referer"] = data[0]
    resp = session.get(m)

    *_, path_, name = m.split("/")
    file_path = os.path.abspath(path_)
    img_path = os.path.join(file_path, name)
    if not os.path.exists(file_path):
        os.mkdir(file_path)

    with open(img_path, "wb") as f:
        f.write(resp.content)
1.png

最佳答案

查看完整内容

好可爱的妹子啊 ,测试10张没有问题,速度好慢,不得行,得加代理池用Scrapy取搞 这里额外说一句, for m in D: session.headers["Referer"] = data[0] 关于跟新headers的Referer,还是重新用一个headers用于新的请求,有代测试,这里就爬了一个连接,不测试了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-22 22:12:35 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Stubborn 于 2020-4-24 00:06 编辑

好可爱的妹子啊 ,测试10张没有问题,速度好慢,不得行,得加代理池用Scrapy取搞


这里额外说一句,
for m in D:
    session.headers["Referer"] = data[0]

关于跟新headers的Referer,还是重新用一个headers用于新的请求,有代测试,这里就爬了一个连接,不测试了


微信截图_20200424000009.png
# -*- coding: utf-8 -*-
# !/usr/bin/python3
"""
@ version: ??
@ author: Alex
@ file: test
@datetime: 2020/4/23 - 23:30
@explain:
"""

import requests
import re
import os

session = requests.session()

domain = "http://zhainanba.net"
params = {
    'Accept': 'text/html, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Host': 'zhainanba.net',
    'Pragma': 'no-cache',
    'Referer': 'http://zhainanba.net/category/zhainanfuli/jinrimeizi',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}

data = []
for page in range(1, 5):
    url = f"http://zhainanba.net/category/zhainanfuli/jinrimeizi/page/{page}"
    resp = session.get(url, params=params)
    data += re.findall(r"http://zhainanba\.net/\d+\.html", resp.text)

param = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36',

}

# for urls in data:

resp = session.get(data[0])
D = re.findall("https://ac\.meijiecao\.net/ac/img/znb/meizitu/.*?\.jpg", resp.text)
for m in D:
    session.headers["Referer"] = data[0]
    resp = session.get(m)

    *_, path_, name = m.split("/")
    file_path = os.path.abspath(path_)
    img_path = os.path.join(file_path, name)
    if not os.path.exists(file_path):
        os.mkdir(file_path)

    with open(img_path, "wb") as f:
        f.write(resp.content)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 07:34:33 From FishC Mobile | 显示全部楼层
加代理换ip地址,或者每个请求之间加2-3秒的延时,而且你写的headers参数的server和connection也没加入到headers,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 10:22:52 | 显示全部楼层
- 404一般不会是反爬,如果封ip,cookie之类的都是500这一类的
- 我一般从页面节点中解析出来的url都需要与网站域名进行拼接
- 你应该把你在请求图片url之前把你的url打印出来看看,复制到浏览器中看看能不能打开

- 如果上面我说的没有问题,就需要你把最后说的什么一刷新就404的问题描述清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-23 12:00:42 From FishC Mobile | 显示全部楼层
小小小菜菜菜 发表于 2020-4-23 07:34
加代理换ip地址,或者每个请求之间加2-3秒的延时,而且你写的headers参数的server和connection也没加入到he ...

这个地方可能是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-23 12:01:15 From FishC Mobile | 显示全部楼层
会计的会怎么念 发表于 2020-4-23 10:22
- 404一般不会是反爬,如果封ip,cookie之类的都是500这一类的
- 我一般从页面节点中解析出来的url都需要 ...

我晚点试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-23 15:51:47 | 显示全部楼层
会计的会怎么念 发表于 2020-4-23 10:22
- 404一般不会是反爬,如果封ip,cookie之类的都是500这一类的
- 我一般从页面节点中解析出来的url都需要 ...

url打印出来看看,复制到浏览器中打不开的 会报404
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 16:13:53 | 显示全部楼层
要不试试在headers那里多添加一些东西,有些网站只有useragent是爬不了的,比如cookie什么的还是去踩踩点吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-23 17:35:27 From FishC Mobile | 显示全部楼层
兔子BUNNY 发表于 2020-4-23 16:13
要不试试在headers那里多添加一些东西,有些网站只有useragent是爬不了的,比如cookie什么的还是去踩踩点吧

网站我发上面了  要不你看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 18:20:17 | 显示全部楼层
97766819 发表于 2020-4-23 15:51
url打印出来看看,复制到浏览器中打不开的 会报404

按照我的经验,404不是他们说的这几个反爬的问题,加不加headers,ip,cookie都不是。
- 你既然打印出来的url就不能用,看看是为什么?
- 你是没有和网站域名拼接?
- 还是和在站点中打开的url有不同?
- 自己观察发现url中的规律是爬虫的基本功

- 如果是反爬,也是url加密或者映射反爬,你现在根本解决不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 18:29:12 | 显示全部楼层
关于反爬虫的问题,我有几点想说的
1. 我经常回复求助帖,只要是涉及爬虫的,张嘴就是,你加个headers,我从学爬虫到现在,headers里只改user—agent,其他从来没改过
2. 封ip返回的不会是404一般是500这一类的,但是返回的状态码,一定要具体问题具体分析
3. 需要添加cookie的,是需要登陆的网站,因为html无状态,登录信息是需要cookie传递。封cookie换个说法,叫封账号。

- 最后推荐一个视频课程,里面有讲前端基础。
python爬虫_从入门到精通(基础篇)
- 如果想系统学习,崔庆才的书值得买!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-24 18:08:23 | 显示全部楼层
Stubborn 发表于 2020-4-22 22:12
好可爱的妹子啊 ,测试10张没有问题,速度好慢,不得行,得加代理池用Scrapy取搞

我晚点试试嘿嘿 老哥  6666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 20:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表