Selenium 爬虫

1. 使用 Selenium 处理 JavaScript 渲染

一些网站通过 JavaScript 动态加载内容,这时普通的请求库无法抓取完整数据。通过 Selenium 这样的浏览器自动化工具,可以抓取这些网站的内容。

示例代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time

# 设置 Chrome 浏览器
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# 打开目标网址
driver.get('https://example.com')

# 等待页面加载完成
time.sleep(5)

# 提取 JavaScript 动态加载的内容
element = driver.find_element(By.CSS_SELECTOR, '.dynamic-content')
print(element.text)

# 关闭浏览器
driver.quit()

2. 使用 Scrapy 框架进行分布式爬取

Scrapy 是一个强大的爬虫框架,适用于大型项目,支持高效抓取并行化、自动处理请求错误,还可以轻松扩展成分布式爬虫。

Scrapy 基本架构:

scrapy startproject myproject

Scrapy 示例代码:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    
    def start_requests(self):
        urls = ['http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/']
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('small.author::text').get(),
            }

# 运行: scrapy crawl quotes

3. 使用代理和用户代理轮换防止被封

高端爬虫的一个常见问题是反爬虫机制,如 IP 封锁或用户代理识别。可以通过使用代理池和随机用户代理来避免这些问题。

使用 fake_useragent 随机用户代理:

pip install fake_useragent

示例代码:

import requests
from fake_useragent import UserAgent

# 使用随机用户代理
ua = UserAgent()
headers = {'User-Agent': ua.random}

response = requests.get('https://httpbin.org/headers', headers=headers)
print(response.text)

代理池示例:

proxies = {
    'http': 'http://username:password@proxyserver:port',
    'https': 'https://username:password@proxyserver:port',
}
response = requests.get('https://example.com', proxies=proxies)

4. 爬取大型数据:队列与分布式

对于大规模爬取,可以使用 Redis 这样的队列系统,实现分布式的任务分发和管理。

示例:使用 Redis 作为任务队列

pip install scrapy-redis

settings.py 中:

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

这样可以在多个机器上运行爬虫,自动去重和分发任务。

5. 处理网页验证码与登陆认证

一些网站通过验证码或登陆页面进行限制。这时可以借助 2CaptchaAntiCaptcha 等 API 服务自动处理验证码,并使用 Selenium 或 Requests+Session 进行自动化登陆。

处理验证码的流程:

  1. 捕获验证码图片
  2. 发送到 2Captcha 或 AntiCaptcha API
  3. 解析验证码,输入并提交

验证码处理代码示例:

import requests

captcha_image = 'captcha_image_url'
api_key = 'your_2captcha_api_key'
captcha_id = requests.post('http://2captcha.com/in.php', data={'key': api_key, 'method': 'base64', 'body': captcha_image}).text
captcha_solution = requests.get(f'http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}').text

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值