注册
登录
提问时间:2016/10/16 21:38:35
用python写的爬虫,设置了headers,包括host和useragent,设置了cookies,访问的结果是“访问过于频繁,请输入验证码”,但是用浏览器访问怎么刷新都没有问题。我认为对方并没有封IP,否则为何浏览器怎么能访问呢?我的判断对么?怎么解决这个问题?谢谢!
另外,我在windows上使用requests package,里面有代理功能,就是传入一个代理ip作为参数,我的方法是找网络上速度很好的代理ip(ping过)作为参数传入,但是不能用,总是显示超时,意思是不是说我不能简单粗暴的把参数传入,而是应该设置下代理服务器(自己准备代理服务器)?
1楼(站大爷用户)

把header里的数据填充好,应该就没问题的了。 还有timeout值设置一下,不然过快的访问也会有问题
2楼(未知网友)

ip 被封了?那就开个代理,改变自己的IP 了。

如果是在学校就好办了,去网络中心改变自己绑定的IP ,然后记得要伪造不同的cookie了。

我印象中可以直接修改自己发出请求的伪IP,但如果采用伪IP,需要再截取发到伪IP的response.所以很麻烦,已经超出了我的吨位,但是如果可以实现,请教教我。
3楼(站大爷用户)

薅羊毛时要记得换羊,别盯着一只
4楼(未知网友)

简单来讲,你通过代码向服务器发送的请求与浏览器向服务器发送的请求不一样,所以你可以通过浏览器获取数据,但是无法通过代码。

首先建议你打开浏览器的开发者工具,推荐使用Chrome浏览器。选中Network一栏之后重新通过浏览器向服务器发送一次请求,然后,你就可以看到你刚才通过浏览器访问服务器资源的流程和数据流向。其中,数据流向包括:

浏览器向服务器发送的请求头
浏览器向服务器发送的请求体
(可能)服务器向浏览器发送的重定向地址及浏览器重新向新的地址发送请求
服务器返回的响应头
服务器返回的响应体

---
你面临的问题很可能是在模拟浏览器发送请求这一步(1、2)。检查代码,修复之。

至于解决方案,既然你可以通过浏览器访问,说明你的IP并没有被服务器禁封,加上你提到用了requests库,我猜测你通过requests.Session()来获取了一个对象或者指定了headers中的Cookie字段来发送请求。这两种方法,服务器都会认为你的多次请求来自同一个客户端,自然访问过快之后,服务器会向此客户端弹验证码(服务器端通过Session确认某一个用户,客户端通过Cookie[中的某一条]告诉服务器自己是某Session对应的用户)。

所以,你可以尝试切换一个新的requests.Session()对象来发送请求。更甚之,你可以通过代理IP,使用代理IP需要注意的是,最好选择高匿的IP,并在使用前校验有效性。通过requests使用代理:

import requests

proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}

requests.get("http://example.org", proxies=proxies)
5楼(站大爷用户)

网站根据cookie ip和header其他部分判断用户的
可以把你浏览器的cookie导入python的爬虫里,firefox是以数据库的方式存储cookie,要用sqlite读一下,ie是按不同网站分不同文件存储。
导入对应的cookie之后,如果爬虫被封,就进对应的浏览器填个验证码。
这样可以轮流切换不同的cookie,网站可能会判断为不同的用户(douban可以这样爬)
立即注册站大爷用户,免费试用全部产品
立即注册站大爷用户,免费试用全部产品