您的位置:首页 > 编程语言 > Python开发

scrapy项目反爬虫策略

2018-04-06 00:00 253 查看
在scrapy爬虫项目中,可以通过如下方法来避免被所爬的网站禁止:
1、禁止Cookie
2、设置下载延时
3、使用IP池
4、使用用户代理池
5、其他方法,如进行分布式爬取等

1、禁止cookie

有的网站会通过用户的cookie信息对用户进行识别和分析,此时我们可以通过禁用本地的cookie信息让对方网站无法识别出我们的会话信息,从而无法禁止我们的爬取。

要禁止使用cookie,可以修改设置文件settings.py中关于cookie的设置。

COOKIES_ENABLED = False

这样就可以禁用本地的cookie,让那些通过用户的Cookie信息对用户进行识别和分析的网站无法识别我们,无法禁止我们爬取。

2、设置下载延时

有的网站会通过我们对网页的访问频率进行分析,如果爬取频率过快,则判断为爬虫自动爬取行为,识别后对我们进行相应限制,比如禁止我们再爬取该服务器上的网页等。

对于这些网站,我们只需要控制一下爬行时间间隔即可,修改settings.py文件中DOWNLOAD_DELAY项目即可。一般settings.py文件中是将这一项注释掉的。我们可以取消注释,将时间间隔设置为1s:

DOWNLOAD_DELAY = 1

设置好之后,就可以避免被这一类反爬虫机制的网站禁止。

3、使用IP池

有的网站会对用户的IP进行检测,如果同一个IP在短时间内对自己服务器上的网页进行大量的爬取,那么就可以初步判断为网络爬虫的自动爬取行为,如有必要,该网站就可以对该IP进行封禁。

如果ip被封禁了,那么就需要更换ip,我们可以利用不同的代理服务器获取不同的IP,将这些代理服务器的ip组成一个ip池,爬虫每次对网页进行爬虫的时候,可以随机选择ip池中的一个ip进行。为此,我们可以在scrapy爬虫项目中建立一个下载中间件,在下载中间件中设置好ip选择规则,在settings.py设置文件中,置好下载中间件,并配置好ip池。

a、首先创建一个下载中间件,可以在middlewares.py(该文件在创建scrapy爬虫的时候就已经生成了)实现具体程序。在scrapy中,与代理服务器设置相关的下载中间件是HttpProxyMiddleware,同样,在scrapy官方文档中,HttpProxyMiddleware对应类为:

class scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware

所以,在编辑下载中间件的时候需要导入scrapy.contrib.downloadermiddleware.httpproxy下的HttpProxyMiddleware。

#导入随机数模块,目的是随机挑选一个IP池中的IP。
import random
#从settings文件(myfirstpjt.settings为settings文件的地址)中导入设置好的IPPOOL
from myfirstpjt.settings import IPPOOL
#导入官方文档中HttpProxyMiddleware对应的模块
from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware

class IPPOOLS(HttpProxyMiddleware):
#初始化方法
def __init__(self, ip=''):
self.ip = ip
#process_request()方法,主要进行请求处理
def process_request(self, request, spider):
#先随机选择一个IP
thisip = random.choice(IPPOOL)
#输出当前选择的IP,便于调试观察
print("当前使用的IP是:"+thisip["ipaddr"])
#将对应的IP实际添加为具体的代理,用该IP进行爬取
request.meta["proxy"] = "http://"+thisip["ipa
7fe0
ddr"]


b、在settings.py中将代理服务器ip设置到ip池中。

如:

#IP池设置
IPPOOL=[
{'ipaddr':'121.33.226.167:3128'},
{'ipaddr':'181.33.226.167:3128'},
{'ipaddr':'121.33.226.167:3128'},
{'ipaddr':'121.33.23.167:3128'},
{'ipaddr':'34.33.226.167:3128'},
{'ipaddr':'56.33.226.167:3128'},
{'ipaddr':'121.12.226.167:3128'},
{'ipaddr':'197.33.226.167:3128'},
]

IPPOOL就是对应的代理服务器的IP池,外层通过列表的形式存储,里层通过字典的形式存储。

c、编写好下载中间件之后,想让middlewares.py文件作为项目的下载中间文件,还需要在settings.py文件中进行相应的配置。

在settings.py中,作如下修改:

DOWNLOADER_MIDDLEWARES={
#'myfirstpjt.middleware.MyCustomDownloaderMiddleware':543,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':123,
'myfirstpjt.middleware.IPPOOLS':125
}

首先根据官方文档配置了

'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware'这一项内容,随后在配置了下载中间件对应所在的地方以及其内部的类,格式为:"下载中间件所在目录 . 下载中间件文件名 . 下载中间件内部要使用的类",所以配置为'myfirstpjt.middlewares.IPPOOLS','myfirstpjt'为下载中间件所在的目录,‘middlewares’为下载中间件文件名,‘IPPOOLS’为下载中间件内部要使用的类。配置好之后,刚才所编写的python文件正式成了scrapy项目的下载中间件文件,在运行该项目中的爬虫的时候,就可以使用下载中间件进行网页的下载,然后,在爬取网站时就会随机的选择IP池中的IP对网页进行爬取。即使网站屏蔽了其中一个IP,我们还可以随机使用其他的IP进行自动爬取。

但是,上面的IP池中的代理服务器IP个数较少,如果都被禁用了,爬虫就无效了。最好的方法是可以使用一个开源的IP代理池爬取代理代理网站的IP,实时更新代理IP。

开源的代理IP工具:https://github.com/qiyeboy/IPProxyPool

4、使用用户代理池

通常,网站服务器可以识别爬行时候的用户代理(User-Agent)信息,通过用户代理信息可以判断出我们使用的是什么浏览器、什么形式的客户端。所以,对方的网站服务器可以根据我们的User-Agent信息,对我们的爬行行为进行分析,以此来实现反爬虫处理。为了避免被禁止,我们可以使用用户代理池进行处理。

使用用户代理池和IP代理池的处理方法是类似的,可以搜集多种浏览器的信息,以此建立一个用户代理池,然后在建立一个下载中间件,在下载中间件中设置每次随机选择用户代理池中的一个用户代理进行爬行。与IP代理池处理方法不同的是,此时我们要使用的下载中间件类型为UserAgentMiddleware,而在IP代理池中使用的下载中间件类型为HttpProxyMiddleware。

a、首先在settings.py文件中设置好用户代理池,如:

#用户代理(user-agent)池设置
UAPOOL=[
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"
]


b、创建一个下载中间件文件,创建好后,可以编辑该下载中间件文件中的代码来实现对应功能。在scrapy中,用户代理池中使用的下载中间件类型是UserAgentMiddleware,对应的类为:

class scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware

在中间件文件中,需要导入该类。代码编写如下:

#uamid下载中间件
import random
from myfirstpjt.settings import UAPOOL
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware

class Uamid(UserAgentMiddleware):
def __init__(self, ua=''):
self.ua = ua
def process_request(self, request, spider):
thisua = random.choice(UAPOOL)
print('当前使用的user-agent是:'+thisua)
request.headers.setdefault('User-Agent', thisua)

c、还需要在settings.py文件中将该python文件设置为scrapy中的下载中间件,我们可以打开settings.py文件,找到有关下载中间件设置的地方(DOWNLOADER_MIDDLEWARES),修改如下:

DOWNLOADER_MIDDLEWARES={
#'myfirstpjt.middleware.MyCustomDownloaderMiddleware':543,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware':2,
'myfirstpjt.uamid.Uamid':1
}

设置好后,可以运行该scrapy项目下的爬虫文件了,爬虫会通过下载中间件自动的随机切换用户代理进行网页爬取。这样,对方的网站服务器相对来说就比较难通过识别用户代理来屏蔽我们的爬虫。

5、其他方法

除了上面的方法之外,还可以采用分布式爬取的方式或使用谷歌的Cache来避免被禁止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python Scrapy
相关文章推荐