Python爬虫 | 什么是反爬虫技术与机制
反爬虫机制详解
1. 理解反爬虫机制
在讨论反爬虫技术之前,我们首先需要了解常见的反爬虫机制:
- IP限制:限制单个IP的访问频率。
- User-Agent检测:禁止非浏览器的访问。
- Cookie/Session验证:要求登录或保持会话。
- 动态内容:使用JavaScript动态加载内容。
- 验证码:要求人工输入验证码。
- 蜜罐陷阱:设置虚假链接诱导爬虫。
2. 反爬虫技术
2.1 IP代理池
使用代理IP是绕过IP限制的有效方法。你可以构建一个代理IP池,并在每次请求时随机选择一个代理IP。
import requests
from random import choice
proxies = [
{'http': 'http://1.2.3.4:80'},
{'http': 'http://5.6.7.8:8080'},
# 添加更多代理IP
]
def get_random_proxy():
return choice(proxies)
url = 'https://example.com'
response = requests.get(url, proxies=get_random_proxy())
2.2 User-Agent轮换
许多网站会检查User-Agent来识别爬虫。通过随机切换User-Agent,我们可以模拟不同的浏览器访问。
import requests
from random import choice
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15',
# 添加更多User-Agent
]
def get_random_ua():
return choice(user_agents)
url = 'https://example.com'
headers = {'User-Agent': get_random_ua()}
response = requests.get(url, headers=headers)
2.3 处理Cookie和Session
对于需要登录的网站,我们可以使用requests的Session对象来维护会话状态。
import requests
session = requests.Session()
# 登录
login_data = {'username': 'your_username', 'password': 'your_password'}
session.post('https://example.com/login', data=login_data)
# 访问需要登录的页面
response = session.get('https://example.com/protected_page')
2.4 处理动态内容
对于使用JavaScript动态加载内容的网站,我们可以使用Selenium等工具来模拟浏览器行为。
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://example.com')
# 等待动态内容加载
driver.implicitly_wait(10)
# 获取动态加载的内容
content = driver.find_element_by_id('dynamic-content').text
driver.quit()
2.5 验证码处理
对于简单的验证码,我们可以使用OCR技术进行识别。对于复杂的验证码,可能需要使用机器学习模型或人工识别服务。
import pytesseract
from PIL import Image
def solve_captcha(image_path):
image = Image.open(image_path)
return pytesseract.image_to_string(image)
captcha_text = solve_captcha('captcha.png')
2.6 处理蜜罐陷阱
为了避免陷入蜜罐陷阱,我们可以实现一个智能的URL过滤器,只访问与目标相关的URL。
import re
# 假设我们只对包含特定关键词的URL感兴趣
url_filter = re.compile(r'\bkeyword\b')
def filter_urls(url):
return url_filter.search(url) is not None