通常防止爬虫被反主要有以下几个策略:
- 动态设置 User-Agent( 随机切换 User-Agent, 模拟不同用户的浏览器信息)
- 禁用 Cookies( 也就是不启用 cookies middleware, 不向 Server 发送 cookies, 有些网站 通过cookie 的使用发现爬虫行为),可以通过 COOKIES_ENABLED 控制 CookiesMiddleware 开启或关闭
- 设置cookies,有的网站必须要带着cookie才可以访问
- 设置延迟下载( 防止访问过于频繁, 设置为 2 秒 或更高)
- Google Cache 和 Baidu Cache: 如果可能的话, 使用谷歌/百度等搜索引擎服务器页面 缓存获取页面数据。
- 使用 IP 地址池: VPN 和代理 IP, 现在大部分网站都是根据 IP 来办的。
- 使用 Crawlera( 专用于爬虫的代理组件), 正确配置和设置下载中间件后, 项目所有的 request 都是通过 crawlera发出。
- 使用selenium模块
使用 反反爬就需要使用到下载中间件,更改其中的设置。
设置下载中间件( Downloader Middlewares)
下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层
组件, 可以有多个下载中间件被加载运行。
当引擎传递请求给下载器的过程中, 下载中间件可以对请求进行处理 ( 例如增加 http
header 信息, 增加 proxy 信息等);
在下载器完成 http 请求, 传递响应给引擎的过程中, 下载中间件可以对响应进行处理
( 例如进行 gzip 的解压等)
首先要激活下载器中间件组件, 将其加入到 DOWNLOADER_MIDDLEWARES 设置中。
该设置是一个字典(dict), 键为中间件类的路径, 值为其中间件的顺序优先级(order)。

编写下载器中间件十分简单。 每个中间件组件是一个定义了以下一个或多个方法的
Python 类:
class scrapy.contrib.downloadermiddleware.DownloaderMiddleware
def process_request(self, request, spider)
当每个 request 通过下载中间件时, 该方法被调用。
process_request() 必须返回以下其中之一: 一个 None 、 一个 Response 对象、 一个
Request 对象或 raise IgnoreRequest。
- 如果其返回 None , Scrapy 将继续处理该 request, 执行其他的中间件的相应方法,
直到合适的下载器处理函数(download handler)被调用, 该 request 被执行(其 response 被下载)。 - 如果其返回 Response 对象, Scrapy 将不会调用 任何 其他的 process_request() 或
process_exception() 方法, 或相应地下载函数; 其将返回该 response。 已安装的中间件的process_response() 方法则会在每个 response 返回时被调用。 - 如果其返回 Request 对象, Scrapy 则停止调用 process_request 方法并重新调度返回的 request。当新返回的 request 被执行后, 相应地中间件链将会根据下载的 response 被调用。
- 如果其 raise 一个 IgnoreRequest 异常, 则安装的下载中间件的 process_exception() 方法会被调用。 如果没有任何一个方法处理该异常, 则 request 的 errback(Request.errback)方 法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那 样)。
参数:
request (Request 对象) – 处理的 request
spider (Spider 对象) – 该 request 对应的 spider
def process_response(self, request, response, spider)
当下载器完成 http 请求, 传递响应给引擎的时候调用
process_request() 必 须 返回 以 下 其中 之 一 : 返 回 一个 Response 对 象 、 返 回 一个
Request 对象或 raise 一个 IgnoreRequest 异常。
- 如果其返回一个 Response (可以与传入的 response 相同, 也可以是全新的对象), 该 response会被在链中的其他中间件的 process_response() 方法处理。
- 如果其返回一个 Request 对象, 则中间件链停止, 返回的 request 会被重新调度下载。 处理类似于process_request() 返回 request 所做的那样。
- 如果其抛出一个 IgnoreRequest 异常, 则调用 request 的 errback(Request.errback)。 如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那样)。
参数:
request (Request 对象) – response 所对应的 request
response (Response 对象) – 被处理的 response
spider (Spider 对象) – response 所对应的 spider
在这里只介绍有关cookie,user-agent,proxy的设置,因为最为常见。
scrapy中设置cookie的三种方式:
-
1.settings
settings文件中给Cookies_enabled=False解注释
settings的headers配置的cookie就可以用了
这种方法最简单,同时cookie可以直接粘贴浏览器的。
后两种方法添加的cookie是字典格式的,需要用json反序列化一下,
而且需要设置settings中的Cookies_enabled=True -
2.DownloadMiddleware
settings中给downloadmiddleware解注释
去中间件文件中找downloadmiddleware这个类,修改process_request,添加request.cookies={}即可,注意是字典格式,要将cookie中的等于换成冒号。 -
3.爬虫主文件中重写start_request
def start_requests(self):
yield scrapy.Request(url,dont_filter=True,cookies={自己的cookie},callback=self.parser)
scrapy中设置user-agent的两种方式:
- 1.在每个spider中设置(只针对单个spider)
class TencentSpider(scrapy.Spider):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',}
def parse(self, response):
yield scrapy.Request(url=url, headers=TencentSpider.headers, callback=self.parse)
- 2.在中间件中设置(全局)
#fake_useragent 是一个用户代理模块,可以让我们模拟多个浏览器访问
from fake_useragent import UserAgent
class MyDownloadMiddleWare(object):
def process_request(self,request,spider):
user_agent = UserAgent()
#随机选择用户代理
request.headers['User-Agent'] = user_agent.random()
scrapy中设置IP代理的方式:
- 1.在settings.py文件中新增ip池(也可以不在settings.py中),里面放置多个IP
IPPOOL=[
{“ipaddr”:“61.129.70.131:8080”},
{“ipaddr”:“61.152.81.193:9100”},
{“ipaddr”:“120.204.85.29:3128”},
{“ipaddr”:“219.228.126.86:8123”},
{“ipaddr”:“61.152.81.193:9100”},
{“ipaddr”:“218.82.33.225:53853”},
{“ipaddr”:“223.167.190.17:42789”}
]
from demo2.settings import IPPOOL
class GuaziIP(object):
def process_request(self,request,spider):
print('代理IP设置中-------------------------')
request.meta['proxy'] = 'https://' + IPPOOL[0]['ipaddr']
如果单独写在一个类中就要在settings.py文件中设置
# Enable or disable downloader middlewares
# # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
'demo2.mymiddle.MyMiddleWare': 543,
'demo2.mymiddle.MyIP': 100,
}
- 更多设置IP的方式可以见这篇文章https://www.jianshu.com/p/8449b9c397bb
scrapy中对接selenium的方式:
中间件中设置:
from selenium import webdriver
from scrapy.http import HtmlResponse
class SeleniumMiddleware():
def process_request(self, request, spider):
if request.meta.get("phantomjs",None):
driver = webdriver.PhantomJS()
driver.get(request.url)
time.sleep(2)
html = driver.page_source
driver.quit()
return HtmlResponse(url=request.url,encoding="utf-8",body=html,request=request)
spider.py文件中在使用yield时,meta传值要加上键值对"phantomjs":True
最后在settings.py中打开该中间件。
本文介绍了Scrapy框架中应对网站反爬虫的多种策略,包括动态User-Agent、禁用或设置Cookies、设置延迟下载、使用IP池和代理、利用Crawlera以及结合Selenium。重点讲解了如何在Scrapy中设置下载中间件来处理请求和响应,以及如何设置cookie、user-agent和IP代理,提供了一种全局和局部设置user-agent的方法,并给出了IP池的示例。
3477

被折叠的 条评论
为什么被折叠?



