Python 语言 用 Scrapy 中间件绕过反爬 随机代理 + 延迟请求 + 模拟浏览器指纹 + JS 渲染

Python阿木 发布于 1 天前 2 次阅读


Scrapy 中间件实现 Python 爬虫绕过反爬策略

随着互联网的快速发展,数据获取的需求日益增长,爬虫技术应运而生。许多网站为了保护自身数据,设置了各种反爬机制,使得爬虫工作变得困难。本文将围绕Python语言,使用Scrapy框架,通过中间件实现绕过反爬策略,包括随机代理、延迟请求、模拟浏览器指纹和JS渲染等技术。

Scrapy 简介

Scrapy是一个快速、高效率的爬虫框架,用于抓取网站数据。它具有以下特点:

- 高性能:Scrapy使用异步I/O,可以同时处理多个请求。
- 易于扩展:Scrapy提供了丰富的中间件和扩展插件,方便用户自定义功能。
- 灵活:Scrapy支持多种数据提取方式,如XPath、CSS选择器等。

中间件概述

Scrapy中间件分为下载中间件和过程中间件。下载中间件主要处理请求和响应,而过程中间件则处理爬虫的信号。

随机代理

代理服务器可以隐藏爬虫的真实IP,从而绕过网站的IP封禁。在Scrapy中,我们可以通过自定义下载中间件来实现随机代理。

1. 安装代理IP库

我们需要安装一个代理IP库,如`requests`。

python
pip install requests

2. 创建代理中间件

接下来,创建一个名为`ProxyMiddleware.py`的文件,并添加以下代码:

python
import random

class ProxyMiddleware:
def __init__(self, ip_list):
self.ip_list = ip_list

@classmethod
def from_crawler(cls, crawler):
ip_list = crawler.settings.get('PROXY_LIST')
return cls(ip_list)

def process_request(self, request, spider):
request.meta['proxy'] = random.choice(self.ip_list)

3. 配置代理IP列表

在Scrapy项目的`settings.py`文件中,添加以下配置:

python
PROXY_LIST = [
'http://192.168.1.1:8080',
'http://192.168.1.2:8080',
... 其他代理IP
]

4. 启用代理中间件

在`settings.py`文件中,启用代理中间件:

python
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.ProxyMiddleware': 543,
}

延迟请求

延迟请求可以降低爬虫的访问频率,避免触发网站的防爬机制。

1. 创建延迟中间件

创建一个名为`DelayMiddleware.py`的文件,并添加以下代码:

python
import time

class DelayMiddleware:
def __init__(self, delay):
self.delay = delay

@classmethod
def from_crawler(cls, crawler):
delay = crawler.settings.get('DELAY')
return cls(delay)

def process_request(self, request, spider):
time.sleep(self.delay)

2. 配置延迟时间

在`settings.py`文件中,添加以下配置:

python
DELAY = 2 延迟2秒

3. 启用延迟中间件

在`settings.py`文件中,启用延迟中间件:

python
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.DelayMiddleware': 544,
}

模拟浏览器指纹

浏览器指纹是指浏览器在访问网站时,留下的各种信息,如用户代理、屏幕分辨率、操作系统等。模拟浏览器指纹可以降低被网站识别为爬虫的风险。

1. 创建用户代理中间件

创建一个名为`UserAgentMiddleware.py`的文件,并添加以下代码:

python
import random

class UserAgentMiddleware:
def __init__(self, user_agents):
self.user_agents = user_agents

@classmethod
def from_crawler(cls, crawler):
user_agents = crawler.settings.get('USER_AGENTS')
return cls(user_agents)

def process_request(self, request, spider):
request.headers['User-Agent'] = random.choice(self.user_agents)

2. 配置用户代理列表

在`settings.py`文件中,添加以下配置:

python
USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15',
... 其他用户代理
]

3. 启用用户代理中间件

在`settings.py`文件中,启用用户代理中间件:

python
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.UserAgentMiddleware': 545,
}

JS 渲染

许多网站使用JavaScript动态生成内容,直接爬取无法获取到完整数据。在这种情况下,我们需要使用工具如Selenium或Puppeteer来模拟浏览器行为,实现JS渲染。

1. 安装Selenium

我们需要安装Selenium库。

python
pip install selenium

2. 创建Selenium中间件

创建一个名为`SeleniumMiddleware.py`的文件,并添加以下代码:

python
from selenium import webdriver

class SeleniumMiddleware:
def __init__(self, driver_path):
self.driver_path = driver_path

@classmethod
def from_crawler(cls, crawler):
driver_path = crawler.settings.get('DRIVER_PATH')
return cls(driver_path)

def process_request(self, request, spider):
driver = webdriver.Chrome(executable_path=self.driver_path)
driver.get(request.url)
... 处理页面内容
driver.quit()

3. 配置Selenium驱动路径

在`settings.py`文件中,添加以下配置:

python
DRIVER_PATH = '/path/to/chromedriver'

4. 启用Selenium中间件

在`settings.py`文件中,启用Selenium中间件:

python
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.SeleniumMiddleware': 546,
}

总结

本文介绍了使用Scrapy中间件实现Python爬虫绕过反爬策略的方法,包括随机代理、延迟请求、模拟浏览器指纹和JS渲染等技术。通过这些技术,我们可以有效地降低爬虫被识别的风险,提高爬取数据的成功率。在实际应用中,可以根据具体需求选择合适的技术组合,实现高效、稳定的爬虫工作。