🎉 🎂 🍰 TesterHome 创立 9 周年纪念日 🍰 🎂 🎉

Python 求指教!! 爬取天眼查数据的时候,脚本运行一段时间,就会被天眼查的反爬取搞出来。怎么能躲过这个检测

ghost · 2019年02月26日 · 最后由 lishihang 回复于 2021年01月11日 · 1456 次阅读

爬虫脚本执行一段时间以后,后续就会报错。
手动访问天眼查页面,发现页面提示确认是否是机器人。请大神指导怎么能躲过反爬取检测。

问题:
目前不太清楚天眼查是根据 IP,还是根据 cookie 来做的反爬取限制。

尝试过的操作:
1、延长每次请求的时间,设置为 3s 中爬取一次,结果中途也断了。
2、将请求的时间设置为随机时间在 0~5s 之内,结果也中途断了。

-----------------------------------------分割线--------2019.02.08 更新 ---------------------【代理池报错问题】-------------------------------------

r = s.get(city_url, headers=my_heads, proxies=params_file.proxies)

增加了 IP 地址池,IP 地址数据如下(购买的 IP 数据):
proxies = {
"https":"https://112.87.71.162:9999",
"https":"https://125.123.139.163:9999",
"https":"https://116.209.55.229:9999",
"https":"https://104.248.99.101:3128",
"https":"https://116.209.52.240:9999",
"https":"https://116.192.171.51:31742",
"https":"https://113.121.146.70:9999",
"https": "https://112.85.129.166:9999",
"https": "https://1.10.188.100:59164",
}

结果页面有报错:接口返回值为 403

目前陷入了停滞状态,我尝试过去掉地址池,页面访问正常
所以有点尴尬,去掉地址池,爬一段时间,就要被封。用了地址池,程序跑不起来😂 😂 😂 😂 😂

hreader 信息:

-----------------------------------------分割线--------2019.03.04 更新 --------------【代理 IP 以后,依然被封】--------------------------------------------
1、解决上面的代理池报错问题
使用以下命令获取当前运行请求的 IP 信息,发现一直是一个固定 IP 在运行,所以会被封掉。

print(r.raw._connection.sock.getpeername()[0])

修改方案:
每次 requests 请求前初始化一个 proxy

# 设置proxy,每次从ip_pool里面随机取ip 
IP = ip_pool[random.randint(0, len(ip_pool)-1)]
print(IP)
proxies = {"https": IP, }
# 调用proxy
r = s.get(city_url, headers=my_heads, proxies=proxies, stream=True, timeout=10)

2、 解决 IP 代理可用性不高的问题。
由于免费的 IP 速度都比较慢,并且需要自己手动去爬,可用性贼低。所以最终还是买了收费版的 IP。
从使用体验来看,芝麻代理<西瓜代理<蘑菇代理。但是以上的 IP 可用性都应该不到 90% 吧(个人感觉),所以也会出现爬一段时间以后,由于连接有问题,导致程序暂定。
所以中间应该加一段异常处理和重试,另外不可用的 IP 需要从 IP 池剔除。

#异常处理:
        while True:
            # time.sleep(1)
            # 设置proxy
            IP = ip_pool[random.randint(0, len(ip_pool)-1)]
            print(IP)
            proxies = {"https": IP, }

            # 访问
            try:
                r = s.get(city_url, headers=my_heads, proxies=proxies, stream=True, timeout=10)
                # r = s.get(city_url, headers = my_heads, proxies = proxies, timeout = 10)
                print('r.status_code', r.status_code)
                # 具体爬虫部分太长,pass
                break
            except Exception as e:
                # 当前运行失败,说明IP出了问题;1、删除失效IP。 2、判断IP池的大小,如果小于20,自动添加IP
                ip_pool.remove(IP)
                if len(ip_pool)<20:
                                        # get_https_ip.get_IP() 封装了代理网站获取IP的API
                    new_ip_pool = get_https_ip.get_IP()
                    for data in new_ip_pool:
                        print('添加一次',data)
                        ip_pool.append(data)

3、新的问题。
使用 IP 代理之后,发现爬一段时间,账号依然会被封。不知道什么原因?
是因为一直使用一个 cookie 吗?这么搞的话,是不是得使用多个账号交替去爬?

共收到 23 条回复 时间 点赞

可以爬取不到数据的时候,让代码 sleep 一段时间,再重新爬取吗?不知道是否可行

设置访问代理啊

躲不过吧,爬虫都是见招拆招的,哪里有一劳永逸的事情……

爬虫是个深水坑,不是个好的练手项目,虽然我们有专人做数据挖掘和数据爬虫

既然有爬虫,那当然就有反爬虫,这是一个此消彼长的过程。你得先清楚他的反爬虫措施,然后再对症下药。

PyTest 回复

这个不太可行,必须得等到手动验证后,才能继续操作

没毛病

就是不让你干,嘿嘿

黑山老妖 回复

嗯,正在尝试这么干,有点菜😂

换 ip 比较稳吧,可以买一点

  • 这是个测试论坛,应该不是专门解决这种问题的,没问对对方

ip 代理池,或人工打码

判断出打吗时候换 ip,有卖代理 ip 的

ghost #14 · 2019年02月28日 Author

还是有问题

ghost #15 · 2019年02月28日 Author
e4rljia 回复

已经在这么操作了

header 填充的参数是不是少了?多伪造点进去

ghost #17 · 2019年03月01日 Author
CC 回复

已经设置蛮多 header 信息了

使用 http 代理可以完美搞定,之前爬过携程、艺龙等网站

ghost #19 · 2019年03月03日 Author
WY 回复

发现网上的代理 IP 质量都不高,响应也比较慢。

我在什么芝麻代理和西瓜代理上都付费买过,每次都总是有一些 IP 是有问题的,没法响应。

ghost #20 · 2019年03月04日 Author
WY 回复

使用代理以后还是有问题,还有其他解决方法吗?

这个被封的意思是,这个 ip 地址永远访问不了吗,还是说出现验证机器人那个页面

你是用代理 ip cookie 更新了,我看你的 cookie 是固定的

目前有什么解决方案吗

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册