处理反爬策略是在线Python爬虫开发中的一个重要环节。以下是一些常见的反爬策略及其应对方法:
策略:服务器通过检查HTTP请求头中的User-Agent字段来识别和阻止爬虫。
应对方法:
User-Agent,使请求看起来像是一个正常的浏览器访问。import random
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 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
# 添加更多User-Agent
]
headers = {'User-Agent': random.choice(user_agents)}
策略:服务器通过限制单个IP地址的请求频率来阻止爬虫。
应对方法:
import requests
proxies = {
'http': 'http://proxy.example.com:8080',
'https': 'http://proxy.example.com:8080',
}
response = requests.get('http://example.com', headers=headers, proxies=proxies)
策略:服务器通过要求用户输入验证码来阻止自动化工具。
应对方法:
from PIL import Image
import pytesseract
def recognize_captcha(image_path):
img = Image.open(image_path)
text = pytesseract.image_to_string(img)
return text.strip()
策略:服务器通过限制请求频率来防止爬虫过载。
应对方法:
time.sleep()函数控制请求频率。import time
for url in urls:
response = requests.get(url, headers=headers)
time.sleep(1) # 暂停1秒
策略:服务器通过返回JavaScript代码来动态加载内容,而不仅仅是HTML。
应对方法:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://example.com')
content = driver.page_source
driver.quit()
策略:服务器通过检查Cookie和Session来识别和阻止爬虫。
应对方法:
headers['Cookie'] = 'key=value'
策略:服务器通过在表单中添加动态生成的令牌来防止跨站请求伪造(CSRF)。
应对方法:
import re
def extract_csrf_token(html):
token_pattern = re.compile(r'name="csrf_token" value="(.*?)"')
match = token_pattern.search(html)
if match:
return match.group(1)
return None
html = requests.get('http://example.com').text
csrf_token = extract_csrf_token(html)
if csrf_token:
headers['X-CSRFToken'] = csrf_token
通过以上方法,可以有效地应对常见的反爬策略,提高爬虫的稳定性和效率。