当前位置: 首页 > article >正文

python常见反爬思路详解

以下是一份较为详细的 Python 反爬思路总结,涵盖了常见的反爬策略及其应对方法。请注意,反爬虫技术应在合法合规的前提下使用,尊重目标网站的 robots.txt 协议和相关法律法规。

一、常见反爬策略

1. 基于用户行为的检测

请求频率限制:短时间内大量请求可能被识别为爬虫。
鼠标移动和点击模式:有些网站通过 JavaScript 监听用户的鼠标移动、点击等行为。
页面停留时间:过短的页面停留时间可能被怀疑为爬虫。

2. 基于请求头的检测

缺少或异常的 User-Agent:未设置或使用默认的 User-Agent 可能被识别为爬虫。
缺少 Referer:某些网站会检查请求的来源页面。
其他自定义头部:如 X-Requested-With 等。

3. 基于 Cookie 和 Session 的检测

缺少必要的 Cookie:有些网站依赖 Cookie 来验证用户身份或会话状态。
Cookie 过期或无效:动态变化的 Cookie 需要及时更新。

4. 基于 JavaScript 的检测

动态内容加载:通过 AJAX 或前端框架动态加载的数据,直接请求 HTML 可能无法获取完整数据。
JavaScript 渲染:部分内容需要通过执行 JavaScript 才能显示。
验证码:在检测到可疑行为时,弹出验证码要求用户验证。

5. 基于 IP 的检测

IP 封禁:频繁请求的 IP 可能被暂时或永久封禁。
IP 地址信誉:使用代理池中的 IP 若被标记为恶意,也可能被封禁。

6. 基于验证码的防护

图形验证码:需要人工识别,增加爬取难度。
滑动验证码:需要模拟人类的滑动行为。
行为验证码:如 Google reCAPTCHA。

7. 其他技术手段

请求参数加密:参数经过复杂的加密算法处理,难以直接伪造。
请求签名:需要对请求参数进行签名验证。
WebAssembly:使用 WebAssembly 执行复杂的逻辑,增加逆向难度。

二、应对反爬的策略

1. 合理设置请求头

User-Agent:使用常见浏览器的 User-Agent,避免使用默认的爬虫 User-Agent。可以通过随机选择不同的 User-Agent 来模拟不同用户。
Referer:设置合理的 Referer,模拟从合法页面跳转过来的请求。
其他头部:根据目标网站需要,添加 Accept-LanguageConnection 等头部信息。

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    'Referer': 'https://www.example.com/',
    # 其他必要的头部
}

response = requests.get('https://www.example.com/data', headers=headers)

2. 控制请求频率

设置延时:在连续请求之间添加随机延时,模拟人类浏览行为。
分布式爬取:使用多个 IP 和多个爬虫实例分散请求压力。

import time
import random

for url in urls:
    response = requests.get(url, headers=headers)
    # 处理响应
    time.sleep(random.uniform(1, 3))  # 随机延时1到3秒

3. 处理 Cookies 和 Session

维护会话:使用 requests.Session() 来保持会话,自动处理 Cookies。
动态获取 Cookies:有些网站会在首次访问时生成 Cookies,需先请求特定页面获取。

session = requests.Session()
login_url = 'https://www.example.com/login'
login_data = {
    'username': 'your_username',
    'password': 'your_password'
}
session.post(login_url, data=login_data, headers=headers)

# 后续请求使用同一个 session
response = session.get('https://www.example.com/data')

4. 处理 JavaScript 渲染

使用 Selenium:模拟真实浏览器行为,执行 JavaScript 代码。
使用 Pyppeteer 或 Playwright:更高效的浏览器自动化工具,支持异步操作。
使用 API:如果目标网站提供数据接口,优先使用接口获取数据。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')  # 无头模式
driver = webdriver.Chrome(options=chrome_options)

driver.get('https://www.example.com')
html = driver.page_source
driver.quit()

5. 应对 IP 封禁

使用代理池:轮换使用多个代理 IP,避免单一 IP 被封。
选择高质量代理:优先使用数据中心代理或住宅代理,避免使用免费代理。
IP 地理位置选择:根据目标网站的区域限制选择合适的 IP 地理位置。

proxies = {
    'http': 'http://proxy_ip:proxy_port',
    'https': 'https://proxy_ip:proxy_port',
}

response = requests.get('https://www.example.com/data', headers=headers, proxies=proxies)

6. 破解验证码

手动输入:在爬虫中暂停,等待用户手动输入验证码。
OCR 技术:使用 Tesseract 等 OCR 库自动识别简单验证码。
第三方服务:使用打码平台(如超级鹰、云打码)进行验证码识别。
机器学习:针对特定类型的验证码,训练模型进行自动识别。

import pytesseract
from PIL import Image

# 下载验证码图片
captcha_url = 'https://www.example.com/captcha'
captcha_response = requests.get(captcha_url)
with open('captcha.png', 'wb') as f:
    f.write(captcha_response.content)

# 使用 Tesseract 识别
image = Image.open('captcha.png')
captcha_text = pytesseract.image_to_string(image)

7. 处理请求参数加密和签名

逆向工程:分析前端 JavaScript 代码,理解参数加密和签名的逻辑,然后在爬虫中实现相同的逻辑。
动态执行 JavaScript:使用 PyExecJS 或类似库在 Python 中执行 JavaScript 代码,生成必要的参数。
中间人代理:使用 mitmproxy 等工具拦截和修改请求,自动处理加密参数。

import execjs

# 加载 JavaScript 文件
with open('encrypt.js', 'r', encoding='utf-8') as f:
    js_code = f.read()

ctx = execjs.compile(js_code)
# 调用 JavaScript 函数生成签名
signature = ctx.call('generate_signature', params)

8. 使用 API 接口

查找官方 API:有些网站提供官方的数据接口,使用这些接口可以避免很多反爬问题。
遵守 API 限制:注意 API 的请求频率限制和使用条款,避免被封禁。

api_url = 'https://api.example.com/data'
response = requests.get(api_url, headers=headers)
data = response.json()

9. 分布式爬虫

多进程/多线程:利用 Python 的 multiprocessingthreading 模块实现并发爬取。
分布式框架:使用 Scrapy-Redis 等分布式爬虫框架,将任务分配到多个节点执行。
消息队列:使用 RabbitMQ、Kafka 等消息队列协调多个爬虫实例。

from multiprocessing import Pool

def fetch(url):
    response = requests.get(url, headers=headers)
    # 处理响应

urls = ['https://www.example.com/data1', 'https://www.example.com/data2']

if __name__ == '__main__':
    with Pool(processes=4) as pool:
        pool.map(fetch, urls)

三、法律与道德考量

遵守 robots.txt 协议:在爬取前检查目标网站的 robots.txt 文件,了解哪些页面允许爬取,哪些页面禁止爬取。
尊重网站的版权和隐私政策:避免爬取受版权保护的内容或用户的私人信息。
控制爬取频率:避免对目标网站造成过大的访问压力,影响其正常运行。
避免恶意爬取:不利用爬虫进行 DDoS 攻击、数据窃取等非法行为。

四、常用工具与库

请求库
requests:简单易用的 HTTP 库。
httpx:支持异步请求的现代 HTTP 客户端。

解析库
BeautifulSoup:用于解析和提取 HTML 内容。
lxml:高效的 HTML/XML 解析库。
parsel:基于 lxml 的解析库,支持 XPath 和 CSS 选择器。

自动化工具
Selenium:模拟浏览器操作,处理动态内容。
Playwright:现代化的浏览器自动化工具,支持多语言。
Pyppeteer:基于 Python 的 Puppeteer 实现,控制无头浏览器。

代理管理
• 自建代理池,或使用第三方代理服务(如快代理、芝麻代理等)。

验证码识别
Tesseract:开源 OCR 引擎。
• 打码平台 API:如超级鹰、云打码等。

数据存储
SQLiteMySQLMongoDB 等数据库。
• 文件存储:如 JSON、CSV 文件。

五、示例代码

以下是一个综合运用上述策略的简单爬虫示例:

import requests
from bs4 import BeautifulSoup
import time
import random
from fake_useragent import UserAgent

# 使用 fake_useragent 生成随机 User-Agent
ua = UserAgent()

# 代理池示例(实际使用时需维护有效的代理列表)
proxies = [
    'http://proxy1_ip:proxy1_port',
    'http://proxy2_ip:proxy2_port',
    # 添加更多代理
]

def get_random_proxy():
    return random.choice(proxies)

def fetch(url):
    headers = {
        'User-Agent': ua.random,
        'Referer': 'https://www.example.com/',
        # 其他必要的头部
    }
    proxy = get_random_proxy()
    try:
        response = requests.get(url, headers=headers, proxies={'http': proxy, 'https': proxy}, timeout=10)
        response.raise_for_status()
        return response.text
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return None

def parse(html):
    soup = BeautifulSoup(html, 'lxml')
    # 根据实际页面结构解析数据
    items = soup.select('.item-class')
    for item in items:
        title = item.select_one('.title').get_text(strip=True)
        print(title)

def main():
    base_url = 'https://www.example.com/data?page={}'
    for page in range(1, 6):
        url = base_url.format(page)
        html = fetch(url)
        if html:
            parse(html)
        time.sleep(random.uniform(1, 3))  # 随机延时

if __name__ == '__main__':
    main()

注意事项
代理池维护:确保代理 IP 的有效性和稳定性,定期检测和更新代理列表。
异常处理:在实际应用中,需更完善的异常处理机制,如重试策略、日志记录等。
法律合规:确保爬虫行为符合相关法律法规和目标网站的使用条款。

六、进阶技术

1. 浏览器自动化与无头模式

对于需要执行复杂 JavaScript 或处理动态内容的网站,可以使用 Selenium 或 Playwright 等工具进行自动化操作。无头模式(Headless Mode)可以在不启动浏览器界面的情况下运行,提高效率。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=chrome_options)

driver.get('https://www.example.com')
html = driver.page_source
driver.quit()

2. 分布式爬虫框架

使用 Scrapy 等爬虫框架结合 Redis 实现分布式爬取,可以大幅提升爬取效率。Scrapy-Redis 是一个常用的分布式爬虫扩展。

3. 动态参数破解

针对一些网站通过前端 JavaScript 动态生成请求参数(如加密签名),可以使用 PyExecJS 或 Node.js 来执行相应的 JavaScript 代码,生成合法的请求参数。

import execjs

with open('encrypt.js', 'r', encoding='utf-8') as f:
    js_code = f.read()

ctx = execjs.compile(js_code)
params = {
    'param1': 'value1',
    # 其他参数
}
signature = ctx.call('generate_signature', params)
params['signature'] = signature

4. 验证码自动化处理

对于简单的验证码,可以使用 OCR 技术进行识别;对于复杂的验证码,建议使用第三方打码平台或机器学习模型进行处理。但需注意,复杂的验证码破解可能涉及法律风险。

七、总结

编写高效且稳定的反爬虫应对策略需要综合运用多种技术和工具,同时需时刻关注目标网站的反爬措施变化,及时调整爬虫策略。此外,务必确保爬虫行为的合法性和道德性,避免对目标网站造成不必要的影响或违反相关法律法规。

如果你有具体的目标网站或更详细的爬取需求,可以提供更多信息,以便获得更有针对性的建议。


http://www.kler.cn/a/600415.html

相关文章:

  • 网络基础梳理
  • OWASP Top漏洞说明
  • Python爬虫获取1688商品(按图搜索)接口的返回数据说明
  • vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag
  • 蓝桥杯——————数位排序(java)
  • uniapp自身bug | uniapp+vue3打包后 index.html无法直接运行
  • Android Compose 框架基本状态管理(mutableStateOf、State 接口)深入剖析(十四)
  • Unity将运行时Mesh导出为fbx
  • 基于websocketpp实现的五子棋项目
  • MIPI 详解:XAPP894 D-PHY Solutions
  • 北京交通大学第三届C语言积分赛
  • 新手如何使用 Milvus
  • 大数据学习(83)-数仓建模理论
  • 新版 eslintrc 文件弃用 .eslintignore已弃用 替代方案
  • x-cmd install | Wuzz - Web 开发与安全测试利器,交互式 HTTP 工具
  • 基于javaweb的SpringBoot公司财务管理设计与实现(源码+文档+部署讲解)
  • Linux上位机开发实战(编写API库)
  • VitePress由 Vite 和 Vue 驱动的静态站点生成器
  • Python:单例模式魔法方法
  • 【机器学习】--二分类