Scrapy应用(三)

爬虫攻防

Scrapy框架在突破反爬虫技术上有十分强大的框架给我们用,
很多时候我们只需要自己改一些设定就能和网站管理员玩“猫捉老鼠”的游戏了
但是想要更多的自定义,需要我们自己写“MIddleWares:中间件”
更多的可以参考一下文档:
下载器中间件

1.突破时间间隔封锁:

很多网站对于人和爬虫的判断,基于访问的速度:爬虫可以做到1s内十次上百次的访问,人类却明显做不到。
scrapy框架只要在settings.py里设置就能改变访问的速度:

DOWNLOAD_DELAY = 1

这里代表:每1s访问一次。
如果不考虑网站管理员的反爬虫,这个值当然越小越快,
但是总是会有一个 阈值 小于这个值,你的spider就要被封锁咯~
所以具体还是得自己实际测试才能知道。

2.突破Cookie封锁:

虽然我们没遇到过,但是众所周知,cookies是来确定用户身份的一长串数据,如果有的网站对cookie进行简单的检验,我们简单的设置一下也能解决:

COOKIES_ENABLED = False

这里我们就禁用了cookie

3.突破user-agent封锁:

这种方式,本质上就是对headers进行判断,在前面的bs4爬虫攻防里我已经具体介绍过了,我就不多说了。
从这里开始就需要我们自己写中间件,才能够完成任务了。
首先,在与settings.py的同级目录建立文件夹:

middlewares

接着,在文件夹下创建:

__init__.py

这样可以让Python认为这个文件是一个可以导入的包
然后,我们开始写中间件:

customUserAgent.py

'''
自定义scrapy框架的
user-agent头
从一个被良好维护的user-agent列表里
随机筛选合适的user-agent
防止封锁
'''
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware

import random



#一个不容易被封锁的user-agent列表
agents = ['Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',
              'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv,2.0.1) Gecko/20100101 Firefox/4.0.1',
              'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
              'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
              'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)']

class RandomUserAgent(UserAgentMiddleware):
    def process_request(self,request,spider):
        '''
        定义下载中间件,
        必须要写这个函数,
        这是scrapy数据流转的一个环节
        具体可以看文档:
        http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/downloader-middleware.html
        '''
        ua = random.choice(agents)
        request.headers.setdefault('User-agent',ua)

这样就能每次发起访问请求的时候,随机选择一个user-agent了。

当然,我们需要在settings.py里激活我们的下载中间件:
* 注意,需要scrapy自身的user-agent中间件关闭! *

DOWNLOADER_MIDDLEWARES = {
‘xxx.middlewares.coustomUserAgent.RandomUserAgent’: 20,
‘scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware’:None,
}

4.突破IP封锁:

终于说道关键的部分了,不说这里,上一张我们弄出来的这么多代理都白费啦!
原理我也不多说了,自然是一个ip的频繁访问,导致被封ip了。
解决办法也很简单,写一个代理中间件,让他每次访问的时候都换一个ip就成:

首先,我们要建立一个单独文件来存储可以用的代理:proxy.py

'''
通过爬取可用的免费代理,
进行测试可用度之后
筛选获得的代理
将静态的资源文件写在功能文件之外
方便及时更新维护。
'''
proxies = [
    '89.36.215.72:1189',
    '94.177.203.123:1189',
    '110.73.11.227:8123',
    '180.183.176.189:8080',
    '109.62.247.81:8080',
]

这里单独写一个文件,是为了方便维护,毕竟免费的代理动不动就不能用啦!user-agent就不会,我们可以硬编码在功能里

接着,创建我们的中间件:coustomProxy.py

'''
从本地文件proxy.py中
读取可以用的代理列表
并从中随机选择一个代理
供给spider使用
'''
from xiubai.middlewares.proxy import proxies
import random

class RandomProxy(object):
    def process_request(self,request,spider):
        # 从文件中随机选择一个代理
        proxy = random.choice(proxies)

        request.meta['proxy'] = 'http://{}'.format(proxy)

最后,设置settings.py,注意,这里和上面不一样,不能关闭scrapy本身的代理中间件,只需要让自己写的在官方之前执行就成。

DOWNLOADER_MIDDLEWARES = {
‘xxx.middlewares.coustomProxy.RandomProxy’:10,
‘xxx.middlewares.coustomUserAgent.RandomUserAgent’: 20,
‘scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware’:None,
‘scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware’:100,
}


   转载规则


《Scrapy应用(三)》 刘坤胤 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录