如 何 使 爬 虫 更像人
如 何 使 爬 虫 更像人
如何使爬虫更像人作业思路昨天在尝试了几次拉勾网的爬取,因为调试了几次后运行,然后IP就被封了谷歌了一番,发现谷歌上还是比较少关于这方面的教程,要么是重复,要么是一笔带过,心塞……
进入正题:一个爬虫如何反Ban?
让请求更像是浏览器发出的之前只是用了一个默认的头,这样很容易被网站给识别出来,毕竟你一个浏览器短时间发出这么多请求,非人也,所以可以联想到用很多个浏览器,这样就降低了一个浏览器发出请求的数量,看起来合理了那么些,列出很多浏览器的头,然后随机选,头哪里来呢?这里推荐一个网站代码在这里:
# -*-coding:utf-8-*-
import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
#初始化头
self.user_agent = user_agent
#通过random函数,随机选择头,然后伪装请求
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
'lagou.middlewares.RotateUserAgentMiddleware':400,
}
让手速慢一点一个爬虫一秒钟请求N次,这不就是告诉别人说:“你看,我是爬虫,我的手速有多快呀”,然后ban的就是你这只爬虫,所以可以设置一下下载延迟(setting.py):
DOWNLOAD_DELAY = 1,虽然是慢一点,但是稳定,保险。
多个地点一起请求如何来改变自己请求的地点?一般来说,我们的IP地址就是我们的地理位置标签,所以只要改变我们的IP,就可以改变我们请求的位置,随机IP请求,就能够模拟出来自全国各地的用户来访问。
所以在这里就需要用到代理IP池了,代理IP可以在通过网站上提供的,更多代理IP请点我
具体如何实现呢?
分析:
在注释中提到request.meta,先来探究一下request.meta中到时有哪些东西,用scrapy shell测试了一下,所返回的内容是:
{'depth': 0,
'download_latency': 16.514000177383423,
'download_slot': 'docs.python-requests.org',
'download_timeout': 180.0,
'handle_httpstatus_list': <scrapy.utils.datatypes.SequenceExclude at 0x45a84b0>,
'proxy': 'http://125.73.40.123:8118'}
如何来获取代理IP
提供获取代理IP的网址 http://www.xicidaili.com 这里来说一下如何批量采集这些IP代理地址。
编写脚本:
但是,问题也来了,如何保证这些IP都是有用的呢?所以需要验证一下代理IP是否有用
验证代理IP是否有效
计算了一下页面上所有的个数,这个个数只和总数相差不超过5个,相较于第一次爬取的结果为50多个好了很多。
作业中的问题
啊...这是学爬虫来研究的最久的一篇...
还有两个问题没有解决
问题一:
上面的代码
encoded_user_pass = base64.encodestring(proxy['user_pass'])
#Base64是一种基于64个可打印字符来表示二进制数据的表示方法
request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
为什么要加encoded_user_pass = base64.encodestring(proxy['user_pass'])
问题二:
在采用了代理IP后,测试过了,正式爬取的时候,还是有一些IP会有这样的信息显示
进入正题:一个爬虫如何反Ban?
让请求更像是浏览器发出的之前只是用了一个默认的头,这样很容易被网站给识别出来,毕竟你一个浏览器短时间发出这么多请求,非人也,所以可以联想到用很多个浏览器,这样就降低了一个浏览器发出请求的数量,看起来合理了那么些,列出很多浏览器的头,然后随机选,头哪里来呢?这里推荐一个网站代码在这里:
# -*-coding:utf-8-*-
import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
#初始化头
self.user_agent = user_agent
#通过random函数,随机选择头,然后伪装请求
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
'lagou.middlewares.RotateUserAgentMiddleware':400,
}
让手速慢一点一个爬虫一秒钟请求N次,这不就是告诉别人说:“你看,我是爬虫,我的手速有多快呀”,然后ban的就是你这只爬虫,所以可以设置一下下载延迟(setting.py):
DOWNLOAD_DELAY = 1,虽然是慢一点,但是稳定,保险。
多个地点一起请求如何来改变自己请求的地点?一般来说,我们的IP地址就是我们的地理位置标签,所以只要改变我们的IP,就可以改变我们请求的位置,随机IP请求,就能够模拟出来自全国各地的用户来访问。
所以在这里就需要用到代理IP池了,代理IP可以在通过网站上提供的,更多代理IP请点我
具体如何实现呢?
分析:
在注释中提到request.meta,先来探究一下request.meta中到时有哪些东西,用scrapy shell测试了一下,所返回的内容是:
{'depth': 0,
'download_latency': 16.514000177383423,
'download_slot': 'docs.python-requests.org',
'download_timeout': 180.0,
'handle_httpstatus_list': <scrapy.utils.datatypes.SequenceExclude at 0x45a84b0>,
'proxy': 'http://125.73.40.123:8118'}
如何来获取代理IP
提供获取代理IP的网址 http://www.xicidaili.com 这里来说一下如何批量采集这些IP代理地址。
编写脚本:
但是,问题也来了,如何保证这些IP都是有用的呢?所以需要验证一下代理IP是否有用
验证代理IP是否有效
计算了一下页面上所有的个数,这个个数只和总数相差不超过5个,相较于第一次爬取的结果为50多个好了很多。
作业中的问题
啊...这是学爬虫来研究的最久的一篇...
还有两个问题没有解决
问题一:
上面的代码
encoded_user_pass = base64.encodestring(proxy['user_pass'])
#Base64是一种基于64个可打印字符来表示二进制数据的表示方法
request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
为什么要加encoded_user_pass = base64.encodestring(proxy['user_pass'])
问题二:
在采用了代理IP后,测试过了,正式爬取的时候,还是有一些IP会有这样的信息显示
小鱼啊- 帖子数 : 3225
注册日期 : 14-07-06
您在这个论坛的权限:
您不能在这个论坛回复主题