使用Python进行Web爬虫开发:从基础到实战
随着互联网的发展,数据变得越来越重要。而网络爬虫(Web Crawler)作为一种自动获取网页数据的技术,被广泛应用于数据分析、市场研究、搜索引擎等多个领域。本文将带领读者从零开始,使用 Python 编写一个简单的 Web 爬虫,并逐步扩展其功能,最终实现一个可以抓取网站内容并存储为结构化数据的爬虫程序。
环境准备
在开始编写爬虫之前,我们需要安装一些必要的 Python 库:
requests
:用于发送 HTTP 请求。BeautifulSoup
:用于解析 HTML 文档。pandas
:用于处理和保存结构化数据。lxml
:用于提高 BeautifulSoup 的解析速度。可以通过以下命令安装这些库:
pip install requests beautifulsoup4 pandas lxml
第一个简单的爬虫:获取网页内容
我们先来编写一个最简单的爬虫,目标是访问百度首页并输出页面标题。
示例代码:
import requestsfrom bs4 import BeautifulSoupurl = "https://www.baidu.com"response = requests.get(url)soup = BeautifulSoup(response.text, 'lxml')title = soup.title.stringprint("页面标题是:", title)
输出示例:
页面标题是: 百度一下,你就知道
这段代码通过 requests
发送 GET 请求获取网页内容,然后用 BeautifulSoup
解析 HTML 并提取 <title>
标签中的文本。
深入解析网页结构
为了抓取更复杂的数据,比如新闻标题或商品价格,我们需要了解 HTML 的结构。通常我们会使用 CSS 选择器或 XPath 来定位元素。
假设我们要从 豆瓣电影 Top250 页面中抓取电影名称和评分。
示例代码:
import requestsfrom bs4 import BeautifulSoupheaders = { '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'}url = "https://movie.douban.com/top250"response = requests.get(url, headers=headers)soup = BeautifulSoup(response.text, 'lxml')movies = soup.find_all('div', class_='info')for movie in movies: title = movie.find('span', class_='title').text rating = movie.find('span', class_='rating_num').text print(f"电影名称:{title},评分:{rating}")
输出示例:
电影名称:肖申克的救赎,评分:9.7电影名称:霸王别姬,评分:9.6...
该代码使用了 CSS 类名来查找对应的标签,并提取电影名称和评分信息。
分页爬取与反爬策略应对
实际应用中,很多网站都采用了分页机制,例如每页显示 25 条记录。我们可以分析 URL 参数,循环请求所有页面。
此外,为了避免被网站封禁,建议设置请求头(User-Agent)、限制请求频率等。
分页爬虫示例:
import requestsfrom bs4 import BeautifulSoupimport timebase_url = "https://movie.douban.com/top250?start="for i in range(0, 250, 25): url = base_url + str(i) response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'lxml') movies = soup.find_all('div', class_='info') for movie in movies: title = movie.find('span', class_='title').text rating = movie.find('span', class_='rating_num').text print(f"电影名称:{title},评分:{rating}") time.sleep(2) # 每次请求后暂停2秒,避免频繁请求
数据持久化:保存为 CSV 文件
我们使用 pandas
将爬取的数据保存为 CSV 文件,便于后续分析。
示例代码:
import pandas as pd# 初始化空列表titles = []ratings = []for i in range(0, 250, 25): url = base_url + str(i) response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'lxml') movies = soup.find_all('div', class_='info') for movie in movies: titles.append(movie.find('span', class_='title').text) ratings.append(movie.find('span', class_='rating_num').text) time.sleep(2)# 构建 DataFramedf = pd.DataFrame({ '电影名称': titles, '评分': ratings})# 保存为 CSV 文件df.to_csv('douban_top250.csv', index=False, encoding='utf-8-sig')print("数据已保存为 douban_top250.csv")
输出文件示例:
电影名称,评分肖申克的救赎,9.7霸王别姬,9.6阿甘正传,9.5...
进阶技巧:使用 Selenium 处理 JavaScript 渲染页面
有些网站的内容是通过 JavaScript 动态加载的,此时 requests
无法获取完整页面。我们可以使用 Selenium
驱动浏览器来获取动态内容。
安装 Selenium 及浏览器驱动:
pip install selenium
下载对应浏览器的 WebDriver(如 ChromeDriver),并将其路径添加到系统环境变量中。
示例代码(以百度为例):
from selenium import webdriverfrom bs4 import BeautifulSoupimport time# 启动浏览器driver = webdriver.Chrome()driver.get("https://www.baidu.com")# 等待页面加载time.sleep(3)# 获取页面源码html = driver.page_sourcesoup = BeautifulSoup(html, 'lxml')# 提取搜索框 placeholder 属性search_box = soup.find('input', id='kw')print("搜索框提示文字:", search_box.get('placeholder'))# 关闭浏览器driver.quit()
输出示例:
搜索框提示文字: 输入关键词
总结与注意事项
本篇文章介绍了使用 Python 进行 Web 爬虫开发的基本流程,包括:
使用requests
和 BeautifulSoup
抓取静态网页内容;分页爬取与反爬策略应对;数据清洗与结构化存储;使用 Selenium
抓取 JavaScript 渲染页面。在实际开发中,还需注意以下几点:
遵守网站规则:查看网站的 robots.txt 文件,确保爬虫行为合法。设置合理的请求间隔:避免对服务器造成过大压力。异常处理:添加超时、重试等机制,提高爬虫稳定性。用户代理轮换:使用 User-Agent 列表模拟不同设备访问。IP 代理池:对于大规模爬取任务,可考虑使用 IP 代理防止被封禁。网络爬虫是一门非常实用且有趣的技术,希望本文能帮助你迈出第一步,开启数据采集与分析的新旅程!