Scrapy设置User-Agent随机代理

User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

一些网站常常通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些爬虫被网站禁止,但通过伪装 UA 可以绕过检测。

常见的User-Agent形式如:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36

本文解决的是Scrapy设置随机用户代理池的方法,使用到的是fake-useragent


  1. 安装fake-useragent
    pip install fake-useragent

  2. 在Scrapy中建立一个RandomUserAgentMiddlware:

    from fake_useragent import UserAgent
    class RandomUserAgentMiddlware(object):
        # 随机更换user-agent
        def __init__(self, crawler):
            super(RandomUserAgentMiddlware, self).__init__()
            self.ua = UserAgent()
            self.ua_type = crawler.settings.get("RANDOM_UA_TYPE", "random")  # random是默认值
    
        @classmethod
        def from_crawler(cls, crawler):
            return cls(crawler)
    
        def process_request(self, request, spider):
            def get_ua():
                return getattr(self.ua, self.ua_type)  # 获取ua的ua_type
    
            request.headers.setdefault('User-Agent', get_ua())
    
  3. settings中设置‘RANDOM_UA_TYPE’值

    RANDOM_UA_TYPE = "chrome"
    

    并在DOWNLOAD_MIDDLEWARSE中添加RandomUserAgentMiddlware

    DOWNLOADER_MIDDLEWARES = {
    	'DouBanSpider.middlewares.RandomUserAgentMiddlware': 2,
    	'DouBanSpider.mdownloadermiddlewares.useragent.UserAgentMiddleware': None,
    	}
    
  4. 测试:
    在spider parse_item方法中每次打印User-Agent值:
    print(response.request.headers['User-Agent'])
    parse_item方法完整代码:

    def parse_book(self, response):
        item_loader = DoubanItemLoader(item=DoubanspiderItem(), response=response)
        url = response.url
        item_loader.add_value("url", url)
        item_loader.add_value("url_object_id", get_md5(url))
        item_loader.add_css("book_name", "#wrapper>h1>span:nth-child(1)::text")
    
        author = response.xpath("//*[@id='info']/span[1]/a[1]/text()").extract()
        if author == []:
            author = response.xpath("//*[@id='info']/a/text()").extract()
        item_loader.add_value("author", author)
    
        item_loader.add_css("content", "#link-report .intro p::text")
        item_loader.add_xpath("comment", "//p[@class='comment-content']/span/text()")
        item_loader.add_value("crawl_time", datetime.now())
        douban_item = item_loader.load_item()
        
        print(response.request.headers['User-Agent'])  # 添加断点,查看每次User-Agent值是否变化
        return douban_item
    

测试结果:
在这里插入图片描述

发布了673 篇原创文章 · 获赞 644 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/zhaohaibo_/article/details/105242805
今日推荐