3.5 Proxies 和 User Agents


文档摘要

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 地址的频繁请求进行限制或封禁。

3.5 Proxies 和 User Agents

3.5 Proxies 和 User Agents:Scrapy 反爬虫利器

在网络爬虫的世界里,与反爬虫机制的斗智斗勇是永恒的主题。目标网站为了保护自身资源,往往会采取各种手段来阻止爬虫的访问。其中,最常见的两种反爬虫策略就是基于 IP 地址和 User Agent 的识别与限制。因此,在 Scrapy 爬虫中,合理地使用 Proxies(代理)和 User Agents(用户代理)是至关重要的。

3.5.1 为什么需要 Proxies 和 User Agents?

  1. IP 地址限制: 目标网站可能会记录访问者的 IP 地址,并对来自同一 IP 地址的频繁请求进行限制或封禁。

  2. User Agent 识别: 网站可以通过 User Agent 字符串来识别访问者的浏览器类型、操作系统等信息。如果 User Agent 异常(例如,使用默认的 Scrapy User Agent),网站可能会认为这是一个爬虫程序。

通过使用 Proxies 和 User Agents,我们可以有效地规避这些反爬虫策略:

  • Proxies: 允许我们的爬虫通过不同的 IP 地址发送请求,从而避免被目标网站封禁。

  • User Agents: 允许我们伪装成不同的浏览器或设备,从而迷惑目标网站,使其认为我们的爬虫是正常的访问者。

3.5.2 Proxies 的使用

3.5.2.1 获取代理 IP

首先,我们需要获取可用的代理 IP 地址。可以从以下几个途径获取:

  • 免费代理网站: 网上有很多提供免费代理 IP 的网站,但质量参差不齐,稳定性较差。

  • 付费代理服务: 购买专业的代理 IP 服务,通常提供更稳定、高速的代理 IP。

  • 自建代理池: 通过自建服务器或购买云服务器,搭建自己的代理 IP 池。

3.5.2.2 Scrapy 中使用 Proxies

在 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 图示:

3.5.2.3 验证代理 IP 的有效性

在使用代理 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 有效。

3.5.3 User Agents 的使用

3.5.3.1 获取 User Agent 列表

类似于代理 IP,我们需要准备一个 User Agent 列表。可以从以下途径获取:

  • 在线 User Agent 列表: 网上有很多提供 User Agent 列表的网站。

  • 浏览器开发者工具: 使用浏览器开发者工具(例如 Chrome 的开发者工具)可以查看当前浏览器的 User Agent。

  • fake-useragent 库: 使用 fake-useragent 库可以随机生成 User Agent。

3.5.3.2 Scrapy 中使用 User Agents

在 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 图示:

3.5.3.3 使用 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 字符串。

3.5.4 总结

Proxies 和 User Agents 是 Scrapy 爬虫中重要的反爬虫工具。通过合理地使用它们,我们可以有效地规避目标网站的反爬虫策略,提高爬虫的稳定性和成功率。

最佳实践:

  • 定期更新代理 IP 和 User Agent 列表: 确保使用的代理 IP 和 User Agent 仍然有效。

  • 使用高质量的代理 IP: 避免使用免费的、不稳定的代理 IP。

  • 设置合理的请求间隔: 避免过于频繁地发送请求,以免被目标网站识别为爬虫。

  • 结合其他反爬虫技术: 例如,使用验证码识别、Cookie 管理等技术,进一步提高爬虫的隐蔽性。

希望这篇文章能够帮助你更好地理解和使用 Proxies 和 User Agents,构建更健壮的 Scrapy 爬虫。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U