HOOOS

Python爬虫过五关斩六将:绕过反爬机制的实用技巧

0 11 爬虫小王子 Python爬虫反爬机制爬虫技巧
Apple

想用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:3128http://10.10.1.10:1080替换成你自己的代理IP地址和端口。

4. 验证码识别:应对验证码反爬

有些网站会使用验证码来防止爬虫。验证码的形式多种多样,例如图片验证码、滑动验证码、点选验证码等。

解决方案:

  • 手动输入验证码: 对于简单的验证码,可以手动输入,但这只适用于少量数据的爬取。

  • OCR识别: 使用OCR(Optical Character Recognition,光学字符识别)技术识别图片验证码。常用的OCR库有TesseractPytesseract

    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 PyppeteerPuppeteer的Python版本,Puppeteer是Google Chrome团队开发的Node库,用于控制headless Chrome或Chromium。PyppeteerSelenium更轻量级,效率更高。

    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协议,不要过度爬取,尊重网站的权益。

点评评价

captcha
健康