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。
-
安装fake-useragent
pip install fake-useragent
-
在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())
-
settings中设置‘RANDOM_UA_TYPE’值
RANDOM_UA_TYPE = "chrome"
并在
DOWNLOAD_MIDDLEWARSE
中添加RandomUserAgentMiddlware
:DOWNLOADER_MIDDLEWARES = { 'DouBanSpider.middlewares.RandomUserAgentMiddlware': 2, 'DouBanSpider.mdownloadermiddlewares.useragent.UserAgentMiddleware': None, }
-
测试:
在spiderparse_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
测试结果: