Scrapy 爬虫中的用户代理池:如何随机切换 User-Agent 避免被封禁 IP?

2023-04-17 00:00:00 爬虫 随机 切换

Scrapy 爬虫中使用用户代理池可以有效避免被封禁 IP 的风险,同时也可以模拟不同的客户端信息,更好地完成爬取任务。

下面是一些实现随机切换 User-Agent 的示例代码,以及一些相关的说明。

  1. 在 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 指定了默认的请求头信息。

  1. 在 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。

  1. 在 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 的风险,除此之外,还需要使用其他方式来规避风险,例如合理设置请求间隔,避免频繁访问同一网站等等。

相关文章