Python网页爬取与解析完全教程
一、网页爬取基础
网页爬取是指通过程序自动从互联网获取网页内容的过程。在Python中,我们通常使用requests库来实现这一功能。
1.1 安装requests库
pip install requests
1.2 发送HTTP请求
import requests # 发送GET请求 response = requests.get('https://example.com') # 检查请求是否成功 if response.status_code == 200: print('请求成功!') html_content = response.text else: print(f'请求失败,状态码: {response.status_code}')
二、HTML解析技术
获取HTML内容后,我们需要解析文档结构来提取有用信息。BeautifulSoup是最常用的HTML解析库。
2.1 安装BeautifulSoup
pip install beautifulsoup4
2.2 解析HTML文档
from bs4 import BeautifulSoup # 创建BeautifulSoup对象 soup = BeautifulSoup(html_content, 'html.parser') # 提取页面标题 page_title = soup.title.string print(f'页面标题: {page_title}') # 查找所有链接 links = soup.find_all('a') for link in links: print(link.get('href'))
三、CSS选择器使用
BeautifulSoup支持使用CSS选择器定位元素,这是最常用的元素定位方式。
3.1 基本选择器
# 选择所有段落 paragraphs = soup.select('p') # 选择特定class的元素 special_items = soup.select('.special-class') # 选择特定id的元素 header = soup.select('#main-header')
3.2 复杂选择器
# 选择直接子元素 children = soup.select('div > p') # 选择相邻兄弟元素 siblings = soup.select('h2 + p') # 选择属性符合要求的元素 images = soup.select('img[src^="https://"]')
四、实际爬取案例
下面是一个完整的爬取示例,获取书籍信息:
import requests from bs4 import BeautifulSoup def scrape_books(): url = 'https://books.toscrape.com/' response = requests.get(url) if response.status_code != 200: print("无法获取网页内容") return soup = BeautifulSoup(response.text, 'html.parser') books = [] # 提取所有书籍信息 for article in soup.select('article.product_pod'): title = article.h3.a['title'] price = article.select('p.price_color')[0].get_text() rating = article.p['class'][1] # 例如: Three, Four, Five books.append({ 'title': title, 'price': price, 'rating': rating }) # 打印前5本书籍 for book in books[:5]: print(f"标题: {book['title']}") print(f"价格: {book['price']}") print(f"评分: {book['rating']}星") print('-' * 50) if __name__ == "__main__": scrape_books()
五、爬虫最佳实践
5.1 设置请求头
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept-Language': 'zh-CN,zh;q=0.9' } response = requests.get('https://example.com', headers=headers)
5.2 处理异常
try: response = requests.get('https://example.com', timeout=10) response.raise_for_status() # 检查HTTP错误 except requests.exceptions.RequestException as e: print(f"请求发生错误: {e}")
5.3 遵守robots.txt
在爬取任何网站前,检查其robots.txt文件:
import requests from urllib.robotparser import RobotFileParser rp = RobotFileParser() rp.set_url('https://example.com/robots.txt') rp.read() if rp.can_fetch('MyBot', 'https://example.com/some-page'): print("允许爬取") else: print("禁止爬取")
六、处理动态内容
对于JavaScript渲染的内容,可以使用Selenium或Playwright:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 设置无头浏览器 options = webdriver.ChromeOptions() options.add_argument('--headless') # 初始化浏览器 driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=options ) # 访问页面 driver.get('https://example.com') # 获取渲染后的HTML html_content = driver.page_source # 关闭浏览器 driver.quit() # 使用BeautifulSoup解析 soup = BeautifulSoup(html_content, 'html.parser') # 后续解析代码...
七、总结
网页爬取与解析是数据获取的重要技术,Python提供了强大的工具链:
- requests - 发送HTTP请求
- BeautifulSoup - 解析HTML/XML文档
- Selenium/Playwright - 处理JavaScript渲染页面
实际应用中,请务必遵守目标网站的爬取规则,尊重robots.txt,设置合理的请求间隔,避免对目标网站造成过大压力。
发表评论