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. 处理网页验证码与登陆认证
一些网站通过验证码或登陆页面进行限制。这时可以借助
2Captcha
或
AntiCaptcha
等 API 服务自动处理验证码,并使用 Selenium 或 Requests+Session 进行自动化登陆。
处理验证码的流程:
- 捕获验证码图片
- 发送到 2Captcha 或 AntiCaptcha API
- 解析验证码,输入并提交
验证码处理代码示例:
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
版权归原作者 来吧~ 所有, 如有侵权,请联系我们删除。