scrapy使用随机User-Agent

作者: alisen | 来源:发表于2018-09-18 01:47 被阅读11次

    scrapy使用随机User-Agent

    众所周知,User-Agent值是用来帮助服务器识别用户使用的操作系统、浏览器、浏览器版本等等信息的,因此也常被用来检测爬虫。

    许多网站会ban掉来自爬虫的请求,来达到反爬的目的。

    正常浏览器的User-Agent值为:

    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0

    使用requests时的默认User-Agent为:

    python-requests/2.18.4

    scrapy的默认值为:

    Scrapy/1.5.0 (+https://scrapy.org)

    服务器可以轻易识别出该请求是否来自爬虫。

    因此为了减小爬虫被ban的几率,我们可以通过设置请求的User-Agent来达到欺骗服务器的目的。

    在scrapy里,设置随机的User-Agent有两种方式

    1. 通过middlware添加
    2. 在spider的request里添加

    首先介绍第一种,通过middleware添加

    1. 安装fake-useragent
      pip install fake-useragent
      这个包里内置了许多浏览器的User-Agent,这样就不用我们自建一个User-Agent池了
    2. 在你的scrapy项目的middlewares.py导入fake-useragent包
      from fake_useragent import UserAgent
      然后将下面的RandomUserAgentMiddlware复制进去
    class RandomUserAgentMiddlware(object):
        #随机更换user-agent
        def __init__(self,crawler):
            super(RandomUserAgentMiddlware,self).__init__()
            self.ua = UserAgent()
    
        @classmethod
        def from_crawler(cls,crawler):
            return cls(crawler)
    
        def process_request(self,request,spider):
            request.headers.setdefault("User-Agent",self.ua.random)
    
    1. 最后在setting.py的DOWNLOADER_MIDDLEWARES里将其添加进去,这里的yourProjectName改为你的项目名称
    DOWNLOADER_MIDDLEWARES = {
        'yourProjectName.middlewares.RandomUserAgentMiddlware': 333,
    }
    
    

    那么这个便设置好了,之后爬虫启动后,每一个request请求的User-Agent都会是一个随机的值。这样便可以欺骗服务器,这是多个浏览器发送过来的请求。达到我们反反爬的目的。

    第二种方法,就是在spider里面添加。

    我们这里以百度首页为例

    1. 同样是先导入fake-useragent包,然后在parse方法里,我们让它请求十次。
    2. 添加一个second_parse做为parse函数的回调函数,处理parse函数里面请求的响应值 。
    3. second_parse里添加 print(response.request.headers['User-Agent'])用来观察我们设置的User-Agent是否生效。具体代码如下:
        def parse(self, response):
            ua = UserAgent()
            for i in range(10):
                header = {'User-Agent':ua.random}
                yield scrapy.Request(url='https://www.baidu.com',headers=header,callback=self.second_parse,dont_filter=True)
        def second_parse(self,response):
            print(response.request.headers['User-Agent'])
    

    运行此爬虫后,我们可以看到爬虫的部分输出如下:

    2018-09-18 01:27:22 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.baidu.com> (referer: https://www.icourse163.org/)
    2018-09-18 01:27:22 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.baidu.com> (referer: https://www.icourse163.org/)
    b'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36'
    b'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36'
    b'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17'
    b'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36'
    b'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36'
    b'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36'
    

    因此,我们的随机User-Agent是已经设置成功了

    结束语

    以上介绍的两种方法都可以用来设置随机User-Agent,只需要根据我们要爬的的网站特性,任选一种便好。不过一般禁止了爬虫User-Agent的页面,一般也是设置了robots协议禁止爬取的,出于职业道德考虑的话,我们应当避免爬取此类页面。
    转载请注明原文链接
    https://blog.csdn.net/Alisen39/article/details/82751313

    相关文章

      网友评论

        本文标题:scrapy使用随机User-Agent

        本文链接:https://www.haomeiwen.com/subject/fvlsnftx.html