Scrapy 爬虫中的用户代理池:如何随机切换 User-Agent 避免被封禁 IP?
Scrapy 爬虫中使用用户代理池可以有效避免被封禁 IP 的风险,同时也可以模拟不同的客户端信息,更好地完成爬取任务。
下面是一些实现随机切换 User-Agent 的示例代码,以及一些相关的说明。
- 在 settings.py 中添加以下代码,定义 User-Agent 列表和请求头的默认值:
USER_AGENTS = [ 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19', 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110622 Firefox/6.0a2', ] DEFAULT_REQUEST_HEADERS = { 'User-Agent': random.choice(USER_AGENTS), 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'Accept-Encoding': 'gzip, deflate, br', }
上面的代码中,USER_AGENTS
是一个包含多个 User-Agent 的列表,每次请求时随机选择一个使用,DEFAULT_REQUEST_HEADERS
指定了默认的请求头信息。
- 在 settings.py 中添加以下代码,开启下载中间件并定义相关函数:
DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 'myproject.middlewares.RandomUserAgentMiddleware': 543, } class RandomUserAgentMiddleware(object): def process_request(self, request, spider): ua = random.choice(USER_AGENTS) request.headers.setdefault('User-Agent', ua)
上面的代码中,DOWNLOADER_MIDDLEWARES
开启了下载中间件,并指定了使用 RandomUserAgentMiddleware
中间件,process_request
函数用于随机设置 User-Agent。
- 在 spider.py 中添加以下代码,测试随机 User-Agent 是否生效:
import scrapy class MySpider(scrapy.Spider): name = "myspider" start_urls = [ 'http://pidancode.com', 'http://www.pidancode.com', 'http://www.皮蛋编程.com', ] def parse(self, response): print(response.request.headers.get('User-Agent')) print(response.body)
上面的代码中,start_urls
通过列表的方式指定了待爬取的链接列表,parse
方法用于处理请求并输出 User-Agent 和相应内容。
以上就是 Scrapy 爬虫中如何实现随机切换 User-Agent 的示例代码,需要注意的是,仅仅通过随机 User-Agent 并不能完全避免被封禁 IP 的风险,除此之外,还需要使用其他方式来规避风险,例如合理设置请求间隔,避免频繁访问同一网站等等。
相关文章