马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在上一篇文章中,我们学习了怎样利用 Python 构建一个根本的网络爬虫。然而,在实际应用中,许多网站利用动态内容加载或实现反爬机制来制止未经授权的抓取。因此,本篇文章将深入探究以下进阶主题:
- 如那里理动态加载的网页内容
- 应对常见的反爬机制
- 爬虫性能优化
通过详细实例,我们将探究更复杂的网络爬虫开发本领。
一、动态网页爬取
今世网页通常通过 JavaScript 加载动态内容。直接利用 requests 获取的 HTML 大概不包罗目标数据。这时,我们可以利用 selenium 模仿欣赏器举动来抓取动态内容。
1. 安装与设置 Selenium
安装 Selenium 和欣赏器驱动
下载对应欣赏器的驱动步调(如 ChromeDriver),并将其路径添加到体系变量中。
初始化 WebDriver
以下是一个根本的 Selenium 设置:
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver.chrome.service import Service
- from selenium.webdriver.common.keys import Keys
- import time
- # 设置浏览器驱动路径
- driver_path = "path/to/chromedriver"
- service = Service(driver_path)
- # 初始化 WebDriver
- driver = webdriver.Chrome(service=service)
- # 打开网页
- driver.get("http://quotes.toscrape.com/js/")
- time.sleep(2) # 等待动态内容加载
- # 获取网页内容
- print(driver.page_source)
- # 关闭浏览器
- driver.quit()
复制代码 2. 爬取动态加载的名言
通过 Selenium 提取动态内容:
- # 初始化 WebDriver
- driver = webdriver.Chrome(service=Service("path/to/chromedriver"))
- driver.get("http://quotes.toscrape.com/js/")
- # 等待内容加载
- time.sleep(2)
- # 提取名言和作者
- quotes = driver.find_elements(By.CLASS_NAME, "quote")
- for quote in quotes:
- text = quote.find_element(By.CLASS_NAME, "text").text
- author = quote.find_element(By.CLASS_NAME, "author").text
- print(f"名言: {text}\n作者: {author}\n")
- driver.quit()
复制代码 3. 处置惩罚翻页
动态页面通常通过点击“下一页”按钮加载更多内容。我们可以模仿用户利用实现翻页爬取。
- # 自动翻页爬取
- while True:
- quotes = driver.find_elements(By.CLASS_NAME, "quote")
- for quote in quotes:
- text = quote.find_element(By.CLASS_NAME, "text").text
- author = quote.find_element(By.CLASS_NAME, "author").text
- print(f"名言: {text}\n作者: {author}\n")
- # 点击下一页按钮
- try:
- next_button = driver.find_element(By.CLASS_NAME, "next")
- next_button.click()
- time.sleep(2) # 等待页面加载
- except:
- print("已到最后一页")
- break
- driver.quit()
复制代码 二、应对反爬机制
许多网站会通过检测 IP、User-Agent 或频仍访问举动来制止爬虫。以下是一些常见反爬机制和应对计谋:
1. 模仿真实用户举动
设置哀求头
在 HTTP 哀求中,添加 User-Agent 模仿欣赏器。
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.199 Safari/537.36"
- }
- response = requests.get("http://example.com", headers=headers)
复制代码 随机耽误
为制止触发频率限定,爬取时可以随机添加耽误。
- import time
- import random
- time.sleep(random.uniform(1, 3)) # 随机延迟 1 到 3 秒
复制代码 2. 利用署理 IP
通过署理 IP 隐蔽爬虫的真实 IP,防止被封禁。
- proxies = {
- "http": "http://your_proxy:port",
- "https": "http://your_proxy:port"
- }
- response = requests.get("http://example.com", proxies=proxies)
复制代码 主动获取免费署理
可以利用爬虫定期抓取免费署理(如西刺署理),并动态切换 IP。
3. 验证码处置惩罚
部门网站利用验证码拦截爬虫。应对计谋包罗:
- 手动输入:提示用户输入验证码。
- 验证码辨认服务:如 平台 提供的 API。
- 避开验证码:实行通过 API 或其他无需验证码的接口获取数据。
三、性能优化
当必要爬取大量数据时,爬虫的性能优化尤为紧张。
1. 多线程或多进程
利用多线程或多进程进步爬取服从:
多线程示例
- import threading
- def fetch_data(url):
- response = requests.get(url)
- print(f"{url} 完成")
- urls = ["http://example.com/page1", "http://example.com/page2"]
- threads = []
- for url in urls:
- thread = threading.Thread(target=fetch_data, args=(url,))
- threads.append(thread)
- thread.start()
- for thread in threads:
- thread.join()
复制代码 2. 异步爬取
利用 aiohttp 和 asyncio 实现异步爬取。
- import aiohttp
- import asyncio
- async def fetch(session, url):
- async with session.get(url) as response:
- return await response.text()
- async def main():
- urls = ["http://example.com/page1", "http://example.com/page2"]
- async with aiohttp.ClientSession() as session:
- tasks = [fetch(session, url) for url in urls]
- results = await asyncio.gather(*tasks)
- for content in results:
- print(content)
- asyncio.run(main())
复制代码 3. 数据去重
制止重复爬取类似数据,可以利用哈希或数据库纪录已访问 URL。
- visited = set()
- if url not in visited:
- visited.add(url)
- # 执行爬取
复制代码 四、实战案例:动态商品代价爬取
以下示例演示怎样抓取电商网站动态加载的商品代价,并应对翻页和反爬机制。
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- import time
- driver = webdriver.Chrome(service=Service("path/to/chromedriver"))
- driver.get("https://example-ecommerce.com")
- # 等待加载
- time.sleep(3)
- # 爬取商品信息
- while True:
- items = driver.find_elements(By.CLASS_NAME, "product-item")
- for item in items:
- name = item.find_element(By.CLASS_NAME, "product-title").text
- price = item.find_element(By.CLASS_NAME, "product-price").text
- print(f"商品: {name}, 价格: {price}")
- # 尝试翻页
- try:
- next_button = driver.find_element(By.CLASS_NAME, "next-page")
- next_button.click()
- time.sleep(2) # 等待页面加载
- except:
- print("已到最后一页")
- break
- driver.quit()
复制代码 五、总结
通过本篇文章,你学习了以下进阶爬虫本领:
- 利用 Selenium 处置惩罚动态网页。
- 应对常见反爬机制,如设置署理、随机耽误等。
- 提拔爬取性能的方法,包罗多线程和异步爬取。
下一步,发起实行构建一个完备的爬虫项目,如爬取消息网站、商品代价监控 等,并学习如那里理复杂的反爬场景。祝你爬虫之路越走越远!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |