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

ghost · February 26, 2019 · Last by PPPeanut replied at April 19, 2019 · 3244 hits

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

问题:
目前不太清楚天眼查是根据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() 封装了代理网站获取IPAPI
new_ip_pool = get_https_ip.get_IP()
for data in new_ip_pool:
print('添加一次',data)
ip_pool.append(data)

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

共收到 21 条回复 时间 点赞

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

设置访问代理啊

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

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

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

PyTest 回复

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

Kevin 回复

没毛病

就是不让你干,嘿嘿

黑山老妖 回复

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

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

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

ip代理池,或人工打码

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

ghost #14 · February 28, 2019 作者

还是有问题

ghost #15 · February 28, 2019 作者
X1be 回复

已经在这么操作了

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

ghost #17 · March 01, 2019 作者
飞狐 回复

已经设置蛮多header信息了

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

ghost #19 · March 03, 2019 作者
王小夫 回复

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

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

ghost #20 · March 04, 2019 作者
王小夫 回复

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

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up