3.5 Proxies 和 User Agents 3.5 Proxies 和 User Agents:Scrapy 反爬虫利器 在网络爬虫的世界里,与反爬虫机制的斗智斗勇是永恒的主题。目标网站为了保护自身资源,往往会采取各种手段来阻止爬虫的访问。其中,最常见的两种反爬虫策略就是基于 IP 地址和 User Agent 的识别与限制。因此,在 Scrapy 爬虫中,合理地使用 Proxies(代理)和 User Agents(用户代理)是至关重要的。 3.5.1 为什么需要 Proxies 和 User Agents? IP 地址限制: 目标网站可能会记录访问者的 IP 地址,并对来自同一 IP 地址的频繁请求进行限制或封禁。
在网络爬虫的世界里,与反爬虫机制的斗智斗勇是永恒的主题。目标网站为了保护自身资源,往往会采取各种手段来阻止爬虫的访问。其中,最常见的两种反爬虫策略就是基于 IP 地址和 User Agent 的识别与限制。因此,在 Scrapy 爬虫中,合理地使用 Proxies(代理)和 User Agents(用户代理)是至关重要的。
IP 地址限制: 目标网站可能会记录访问者的 IP 地址,并对来自同一 IP 地址的频繁请求进行限制或封禁。
User Agent 识别: 网站可以通过 User Agent 字符串来识别访问者的浏览器类型、操作系统等信息。如果 User Agent 异常(例如,使用默认的 Scrapy User Agent),网站可能会认为这是一个爬虫程序。
通过使用 Proxies 和 User Agents,我们可以有效地规避这些反爬虫策略:
Proxies: 允许我们的爬虫通过不同的 IP 地址发送请求,从而避免被目标网站封禁。
User Agents: 允许我们伪装成不同的浏览器或设备,从而迷惑目标网站,使其认为我们的爬虫是正常的访问者。
首先,我们需要获取可用的代理 IP 地址。可以从以下几个途径获取:
免费代理网站: 网上有很多提供免费代理 IP 的网站,但质量参差不齐,稳定性较差。
付费代理服务: 购买专业的代理 IP 服务,通常提供更稳定、高速的代理 IP。
自建代理池: 通过自建服务器或购买云服务器,搭建自己的代理 IP 池。
在 Scrapy 中,可以使用 HttpProxyMiddleware 中间件来设置代理。
1. 修改 settings.py 文件:
# settings.py DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750, } # 代理 IP 地址(可以是一个列表) PROXY_LIST = [ 'http://10.10.1.10:3128', 'http://127.0.0.1:8000', ]
2. 创建自定义的 HttpProxyMiddleware:
# middlewares.py import random from scrapy.exceptions import NotConfigured class RandomProxyMiddleware: def __init__(self, proxy_list): self.proxy_list = proxy_list @classmethod def from_crawler(cls, crawler): proxy_list = crawler.settings.getlist('PROXY_LIST') if not proxy_list: raise NotConfigured return cls(proxy_list) def process_request(self, request, spider): proxy = random.choice(self.proxy_list) request.meta['proxy'] = proxy
3. 在 settings.py 中启用自定义中间件:
# settings.py DOWNLOADER_MIDDLEWARES = { 'your_project.middlewares.RandomProxyMiddleware': 750, # 替换 your_project 为你的项目名称 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None, # 禁用默认的 HttpProxyMiddleware }
代码详解:
RandomProxyMiddleware 类实现了随机选择代理 IP 的逻辑。
from_crawler 方法用于从 Scrapy 的配置中读取代理 IP 列表。
process_request 方法在每个请求发送前被调用,它会随机选择一个代理 IP,并将其设置到 request.meta['proxy'] 中。
HttpProxyMiddleware 是 Scrapy 默认的代理中间件,我们通过禁用它来使用自定义的中间件。
Mermaid 图示:
在使用代理 IP 之前,最好先验证其有效性,以避免使用无效的代理 IP 导致爬虫失败。
1. 创建一个验证代理 IP 的 Spider:
# verify_proxy.py import scrapy class VerifyProxySpider(scrapy.Spider): name = 'verify_proxy' start_urls = ['http://httpbin.org/ip'] # 使用 httpbin.org 来获取 IP 地址 def parse(self, response): yield { 'ip': response.json()['origin'], 'proxy': response.request.meta['proxy'] }
2. 运行 Spider 并检查输出:
scrapy crawl verify_proxy
如果输出的 IP 地址与你的本地 IP 地址不同,且与你设置的代理 IP 地址相同,则说明代理 IP 有效。
类似于代理 IP,我们需要准备一个 User Agent 列表。可以从以下途径获取:
在线 User Agent 列表: 网上有很多提供 User Agent 列表的网站。
浏览器开发者工具: 使用浏览器开发者工具(例如 Chrome 的开发者工具)可以查看当前浏览器的 User Agent。
fake-useragent 库: 使用 fake-useragent 库可以随机生成 User Agent。
在 Scrapy 中,可以使用 UserAgentMiddleware 中间件来设置 User Agent。
1. 修改 settings.py 文件:
# settings.py DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, # 禁用默认的 UserAgentMiddleware 'your_project.middlewares.RandomUserAgentMiddleware': 400, # 替换 your_project 为你的项目名称 } USER_AGENT_LIST = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36', ]
2. 创建自定义的 UserAgentMiddleware:
# middlewares.py import random from scrapy.exceptions import NotConfigured class RandomUserAgentMiddleware: def __init__(self, user_agent_list): self.user_agent_list = user_agent_list @classmethod def from_crawler(cls, crawler): user_agent_list = crawler.settings.getlist('USER_AGENT_LIST') if not user_agent_list: raise NotConfigured return cls(user_agent_list) def process_request(self, request, spider): user_agent = random.choice(self.user_agent_list) request.headers['User-Agent'] = user_agent
3. 在 settings.py 中启用自定义中间件:
# settings.py DOWNLOADER_MIDDLEWARES = { 'your_project.middlewares.RandomUserAgentMiddleware': 400, # 替换 your_project 为你的项目名称 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, # 禁用默认的 UserAgentMiddleware }
代码详解:
RandomUserAgentMiddleware 类实现了随机选择 User Agent 的逻辑。
from_crawler 方法用于从 Scrapy 的配置中读取 User Agent 列表。
process_request 方法在每个请求发送前被调用,它会随机选择一个 User Agent,并将其设置到 request.headers['User-Agent'] 中。
UserAgentMiddleware 是 Scrapy 默认的 User Agent 中间件,我们通过禁用它来使用自定义的中间件。
Mermaid 图示:
fake-useragent 库fake-useragent 库可以方便地生成 User Agent。
1. 安装 fake-useragent 库:
pip install fake-useragent
2. 修改 middlewares.py 文件:
# middlewares.py from fake_useragent import UserAgent class RandomUserAgentMiddleware: def __init__(self): self.ua = UserAgent() def process_request(self, request, spider): request.headers['User-Agent'] = self.ua.random
代码详解:
UserAgent() 创建了一个 UserAgent 对象,可以随机生成 User Agent。
self.ua.random 返回一个随机的 User Agent 字符串。
Proxies 和 User Agents 是 Scrapy 爬虫中重要的反爬虫工具。通过合理地使用它们,我们可以有效地规避目标网站的反爬虫策略,提高爬虫的稳定性和成功率。
最佳实践:
定期更新代理 IP 和 User Agent 列表: 确保使用的代理 IP 和 User Agent 仍然有效。
使用高质量的代理 IP: 避免使用免费的、不稳定的代理 IP。
设置合理的请求间隔: 避免过于频繁地发送请求,以免被目标网站识别为爬虫。
结合其他反爬虫技术: 例如,使用验证码识别、Cookie 管理等技术,进一步提高爬虫的隐蔽性。
希望这篇文章能够帮助你更好地理解和使用 Proxies 和 User Agents,构建更健壮的 Scrapy 爬虫。