想用Python写个爬虫,结果一不小心就被网站的反爬机制给拦住了?别灰心!反爬虫和反反爬虫就像猫捉老鼠,是个永恒的游戏。今天,我就来分享一些实用的技巧,助你轻松绕过常见的反爬机制,让你的爬虫畅通无阻。
1. 伪装身份:User-Agent
网站可以通过检查请求头中的User-Agent来判断是否是爬虫。User-Agent就像是浏览器的身份证,告诉网站你是谁。默认情况下,Python爬虫的User-Agent会包含"Python"字样,很容易被识别出来。所以,我们需要伪装成真实的浏览器。
解决方案:
手动设置User-Agent: 从网上找一些常见的浏览器User-Agent,例如Chrome、Firefox等,然后在爬虫代码中随机选择一个使用。
import requests import random 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 (Firefox/68.0) Gecko/20100101 Firefox/68.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15' ] url = 'https://www.example.com' headers = {'User-Agent': random.choice(user_agents)} response = requests.get(url, headers=headers) print(response.status_code)
使用
fake-useragent
库: 这是一个专门生成随机User-Agent的库,可以更方便地伪装身份。from fake_useragent import UserAgent import requests ua = UserAgent() url = 'https://www.example.com' headers = {'User-Agent': ua.random} response = requests.get(url, headers=headers) print(response.status_code)
安装方法:
pip install fake-useragent
。 注意: 首次使用可能需要下载数据,如果下载失败,可以尝试更换镜像源或者科学上网。
2. 降低频率:控制爬取速度
如果你的爬虫像机关枪一样疯狂地访问网站,很容易被服务器识别为恶意行为。网站会通过限制你的IP访问频率来阻止你。
解决方案:
time.sleep()
: 在每次请求后暂停一段时间,让爬虫慢下来。import requests import time url = 'https://www.example.com' for i in range(10): response = requests.get(url) print(f'第{i+1}次请求,状态码:{response.status_code}') time.sleep(random.uniform(1, 3)) # 暂停1-3秒
使用
RateLimiter
库: 更精细地控制爬取频率,例如限制每分钟请求次数。from ratelimiter import RateLimiter import requests import time rate_limiter = RateLimiter(max_calls=2, period=1) # 每秒最多请求2次 url = 'https://www.example.com' for i in range(10): with rate_limiter: response = requests.get(url) print(f'第{i+1}次请求,状态码:{response.status_code}')
安装方法:
pip install ratelimiter
3. 更换IP:使用代理IP
如果你的IP被网站封禁了,那就换个IP继续爬!代理IP就像是你的替身,让你的爬虫从不同的IP地址访问网站。
解决方案:
免费代理IP: 网上有很多免费的代理IP,但质量参差不齐,很多都不能用。可以自己写代码去爬取免费代理IP,并进行验证,筛选出可用的。
付费代理IP: 付费代理IP通常更稳定、速度更快,也更容易获取。常见的付费代理IP提供商有:站大爷、蘑菇代理等。(注意: 选择正规的代理IP提供商,避免上当受骗。)
使用
requests
库设置代理:import requests proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', } url = 'https://www.example.com' response = requests.get(url, proxies=proxies) print(response.status_code)
注意: 将
http://10.10.1.10:3128
和http://10.10.1.10:1080
替换成你自己的代理IP地址和端口。
4. 验证码识别:应对验证码反爬
有些网站会使用验证码来防止爬虫。验证码的形式多种多样,例如图片验证码、滑动验证码、点选验证码等。
解决方案:
手动输入验证码: 对于简单的验证码,可以手动输入,但这只适用于少量数据的爬取。
OCR识别: 使用OCR(Optical Character Recognition,光学字符识别)技术识别图片验证码。常用的OCR库有
Tesseract
和Pytesseract
。from PIL import Image import pytesseract # 安装Tesseract:https://github.com/UB-Mannheim/tesseract/wiki # 配置Tesseract环境变量 image = Image.open('captcha.png') text = pytesseract.image_to_string(image) print(text)
安装方法:
pip install pytesseract
和安装Tesseract OCR引擎。注意: OCR识别的准确率有限,对于复杂的验证码效果可能不佳。
第三方验证码识别平台: 使用专业的验证码识别平台,例如超级鹰、打码兔等。这些平台通常提供API接口,可以方便地集成到爬虫代码中。
模拟登录: 如果网站允许用户登录,可以尝试模拟登录,登录后通常可以绕过验证码。
5. 数据动态加载:应对Ajax反爬
有些网站使用Ajax技术动态加载数据,这意味着网页的源代码中可能不包含你需要的数据。你需要分析Ajax请求,找到数据的API接口。
解决方案:
Chrome开发者工具: 打开Chrome开发者工具(F12),切换到Network选项卡,刷新页面,找到包含数据的Ajax请求。分析请求的URL、请求方法、请求头、请求参数等。
requests
库模拟Ajax请求: 使用requests
库发送与Ajax请求相同的请求,获取数据。import requests import json url = 'https://www.example.com/api/data' params = { 'page': 1, 'size': 10 } headers = { 'Content-Type': 'application/json' } response = requests.get(url, params=params, headers=headers) data = json.loads(response.text) print(data)
6. Cookie处理:应对登录状态反爬
有些网站需要用户登录才能访问某些内容,或者使用Cookie来跟踪用户的状态。你需要正确处理Cookie,才能保持登录状态,顺利爬取数据。
解决方案:
requests
库自动处理Cookie:requests
库会自动处理Cookie,你只需要在第一次请求时获取Cookie,然后在后续的请求中使用相同的Session对象。import requests session = requests.Session() # 登录 login_url = 'https://www.example.com/login' login_data = { 'username': 'your_username', 'password': 'your_password' } response = session.post(login_url, data=login_data) # 爬取需要登录才能访问的页面 profile_url = 'https://www.example.com/profile' response = session.get(profile_url) print(response.text)
手动管理Cookie: 可以手动从浏览器中复制Cookie,然后在
requests
请求中设置Cookie。import requests url = 'https://www.example.com/profile' headers = { 'Cookie': 'your_cookie_string' } response = requests.get(url, headers=headers) print(response.text)
7. JavaScript渲染:应对JavaScript反爬
有些网站使用JavaScript生成网页内容,这意味着网页的源代码中可能不包含你需要的数据。你需要执行JavaScript代码,才能获取完整的数据。
解决方案:
Selenium
:Selenium
是一个自动化测试工具,可以模拟浏览器行为,执行JavaScript代码,获取渲染后的网页内容。from selenium import webdriver # 安装ChromeDriver:https://chromedriver.chromium.org/downloads # 配置ChromeDriver环境变量 driver = webdriver.Chrome() url = 'https://www.example.com' driver.get(url) # 等待JavaScript渲染完成 time.sleep(5) # 获取渲染后的网页内容 html = driver.page_source print(html) driver.quit()
安装方法:
pip install selenium
和下载对应版本的ChromeDriver。注意:
Selenium
的效率较低,不适合大规模的爬取。Pyppeteer
:Pyppeteer
是Puppeteer
的Python版本,Puppeteer
是Google Chrome团队开发的Node库,用于控制headless Chrome或Chromium。Pyppeteer
比Selenium
更轻量级,效率更高。import asyncio from pyppeteer import launch async def main(): browser = await launch() page = await browser.newPage() await page.goto('https://www.example.com') await page.waitFor(5000) # 等待5秒 html = await page.content() print(html) await browser.close() asyncio.get_event_loop().run_until_complete(main())
安装方法:
pip install pyppeteer
。 注意: 首次运行会下载Chromium,可能需要科学上网。
8. 字体反爬:应对字体加密反爬
有些网站使用自定义字体来加密数据,例如将数字替换成特殊的符号。你需要找到字体文件,并进行解密,才能获取真实的数据。
解决方案:
找到字体文件: 在Chrome开发者工具中,找到CSS文件中引用的字体文件(通常是
.woff
或.ttf
格式)。使用
fonttools
库解析字体文件:from fontTools.ttLib import TTFont font = TTFont('font.woff') glyph_names = font.getGlyphNames() print(glyph_names)
安装方法:
pip install fonttools
建立映射关系: 根据字体文件中的字形和真实数据的对应关系,建立映射表,将加密的数据替换成真实的数据。
总结
反爬虫和反反爬虫是一场永无止境的战斗。网站的反爬机制会不断升级,你也需要不断学习新的技巧来应对。希望这些技巧能帮助你更好地编写Python爬虫,获取你需要的数据。记住,爬虫要遵守Robots协议,不要过度爬取,尊重网站的权益。