我们之前已经讨论了网络爬虫的解析技术和实战代码可能不太详细。现在希望可以更深入地探讨爬虫的其他关键方面,或者希望获得更系统性的总结。因此,我将从爬虫的核心流程、关键技术点、常见问题及解决方案、进阶方向等角度进行全面梳理,并补充一些高级技巧和实战建议。
下面我通过几个实战代码示例来展示解析过程。
网络爬虫的核心环节是数据解析,主要涉及 HTML/XML 结构解析和数据提取。以下是主流解析技术与实战示例:
技术 | 速度 | 易用性 | 学习曲线 | 适用场景 |
|---|---|---|---|---|
正则表达式 | ⚡⚡⚡⚡ | ⚡ | 陡峭 | 简单文本、无嵌套结构 |
BeautifulSoup | ⚡ | ⚡⚡⚡⚡ | 平缓 | 快速开发、小型项目 |
lxml | ⚡⚡⚡⚡ | ⚡⚡⚡ | 中等 | 大型项目、高性能需求 |
PyQuery | ⚡⚡⚡ | ⚡⚡⚡⚡ | 平缓 | jQuery 用户、类 CSS 选择器 |
import re
import requests
url = "https://books.toscrape.com/"
html = requests.get(url).text
# 提取所有图书标题(匹配<h3>标签内容)
pattern = r'<h3><a title="(.*?)"'
titles = re.findall(pattern, html)
print(titles[:3]) # 输出前3个标题from bs4 import BeautifulSoup
import requests
url = "https://quotes.toscrape.com/"
soup = BeautifulSoup(requests.get(url).text, 'html.parser')
# 提取引用和作者
quotes = []
for quote in soup.select('div.quote'):
text = quote.select_one('span.text').text.strip()
author = quote.select_one('small.author').text
tags = [tag.text for tag in quote.select('a.tag')]
quotes.append({"text": text, "author": author, "tags": tags})
print(quotes[0]) # 输出第一条引用from lxml import html
import requests
url = "https://news.ycombinator.com/"
tree = html.fromstring(requests.get(url).content)
# 使用XPath提取新闻标题和链接
titles = tree.xpath('//tr[@class="athing"]/td[3]/a/text()')
links = tree.xpath('//tr[@class="athing"]/td[3]/a/@href')
scores = tree.xpath('//span[@class="score"]/text()')
for i in range(3):
print(f"{titles[i]} | {links[i]} | {scores[i]}")from pyquery import PyQuery as pq
import requests
url = "https://scrapingclub.com/exercise/list_basic/"
d = pq(requests.get(url).text)
# 类CSS选择器提取数据
products = []
for item in d('div.card-body').items():
name = item.find('h4 a').text()
price = item.find('h5').text()
products.append({"name": name, "price": price})
print(products[:2]) # 输出前两个产品from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://spa1.scrape.center/")
# 等待动态加载完成
driver.implicitly_wait(10)
# 提取AJAX加载的电影数据
movies = []
for element in driver.find_elements(By.CSS_SELECTOR, 'div.el-card'):
name = element.find_element(By.TAG_NAME, 'h2').text
categories = [span.text for span in element.find_elements(By.CLASS_NAME, 'categories')]
movies.append({"name": name, "categories": categories})
driver.quit()
print(movies[0])headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
//div[contains(@class, "result")] - 模糊匹配class//a[starts-with(@href, "/detail/")] - 前缀匹配注意:爬虫需遵守
robots.txt协议,避免高频请求影响目标网站运营。
# crawler.py
import requests
from bs4 import BeautifulSoup
import csv
def crawl_page(url):
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(response.text, 'lxml')
data = []
for item in soup.select('.product-item'):
name = item.select_one('.title').text.strip()
price = item.select_one('.price').text
data.append([name, price])
return data
def save_to_csv(data, filename):
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Product', 'Price'])
writer.writerows(data)
if __name__ == "__main__":
products = crawl_page("https://example-store.com/products")
save_to_csv(products, "products.csv")掌握这些解析技术后,基本可以应对 90% 的网页数据提取需求。我的建议是从静态页面入手(如 toscrape 系列练习站),再逐步挑战动态渲染网站。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。