scrapy反反爬虫的使用

本文介绍了Scrapy框架中应对网站反爬虫的多种策略,包括动态User-Agent、禁用或设置Cookies、设置延迟下载、使用IP池和代理、利用Crawlera以及结合Selenium。重点讲解了如何在Scrapy中设置下载中间件来处理请求和响应,以及如何设置cookie、user-agent和IP代理,提供了一种全局和局部设置user-agent的方法,并给出了IP池的示例。

通常防止爬虫被反主要有以下几个策略:

  • 动态设置 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,
}

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中打开该中间件。

基于Python Scrapy实现的蜂鸟数据采集爬虫系统 含代理、日志处理和全部源代码等 import scrapy from fengniao.items import FengniaoItem from scrapy.spidermiddlewares.httperror import HttpError from twisted.internet.error import TimeoutError, TCPTimedOutError, DNSLookupError, ConnectionRefusedError class FengniaoclawerSpider(scrapy.Spider): name = 'fengniaoClawer' allowed_domains = ['fengniao.com'] # 爬虫自定义设置,会覆盖 settings.py 文件中的设置 custom_settings = { 'LOG_LEVEL': 'DEBUG', # 定义log等级 'DOWNLOAD_DELAY': 0, # 下载延时 'COOKIES_ENABLED': False, # enabled by default 'DEFAULT_REQUEST_HEADERS': { # 'Host': 'www.fengniao.com', 'Referer': 'https://www.fengniao.com', }, # 管道文件,优先级按照由小到大依次进入 'ITEM_PIPELINES': { 'fengniao.pipelines.ImagePipeline': 100, 'fengniao.pipelines.FengniaoPipeline': 300, }, # 关于下载图片部分 'IMAGES_STORE': 'fengniaoPhoto', # 没有则新建 'IMAGES_EXPIRES': 90, # 图片有效期,已经存在的图片在这个时间段内不会再下载 'IMAGES_MIN_HEIGHT': 100, # 图片最小尺寸(高度),低于这个高度的图片不会下载 'IMAGES_MIN_WIDTH': 100, # 图片最小尺寸(宽度),低于这个宽度的图片不会下载 # 下载中间件,优先级按照由小到大依次进入 'DOWNLOADER_MIDDLEWARES': { 'fengniao.middlewares.ProxiesMiddleware': 400, 'fengniao.middlewares.HeadersMiddleware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, }, 'DEPTH_PRIORITY': 1, # BFS,是以starts_url为准,局部BFS,受CONCURRENT_REQUESTS影响 'SCHEDULER_DISK_QUEUE': 'scrapy.squeues.PickleFifoDiskQueue', 'SCHEDULER_MEMORY_QUEUE': 'scrapy.squeues.FifoMemoryQueue', 'REDIRECT_PRIORITY_ADJUST': 2, # Default: +2 'RETRY_PRIORITY_ADJUST': -1, # Default: -1 'RETRY_TIMES': 8, # 重试次数 # Default: 2, can also be specified per-request using max_retry_times attribute of Request.meta 'DOWNLOAD_TIMEOUT': 30, # This timeout can be set per spider using download_timeout spider attribute and per-request using download_timeout Request.meta key # 'DUPEFILTER_CLASS': "scrapy_redis.dupefilter.RFPDupeFilter", # 'SCHEDULER': "scrapy_redis.scheduler.Scheduler", # 'SCHEDULER_PERSIST': False, # Don't cleanup red
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值