使用Python实现一个简单的Web爬虫
在当今数据驱动的世界中,网络爬虫(Web Crawler)已经成为获取信息的重要工具。通过编写爬虫程序,我们可以自动从网页中提取有用的数据,并用于数据分析、机器学习、商业智能等多个领域。
本文将介绍如何使用 Python 编写一个简单的 Web 爬虫,抓取网页内容并从中提取指定信息。我们将使用 requests
库来发送 HTTP 请求,用 BeautifulSoup
解析 HTML 内容,并使用 pandas
存储和导出数据。
1. 环境准备
首先,确保你已经安装了以下库:
pip install requests beautifulsoup4 pandas
requests
: 发送 HTTP 请求获取网页内容。beautifulsoup4
: 解析 HTML 或 XML 文档。pandas
: 处理结构化数据并导出为 CSV 文件。2. 爬取网页内容的基本流程
Web 爬虫的基本流程如下:
向目标网站发送 HTTP 请求。获取网页的 HTML 内容。使用解析器提取所需的信息。将提取到的数据存储或展示出来。我们以一个示例网站为例:https://books.toscrape.com/ —— 这是一个专门用于练习爬虫技术的测试网站。
3. 示例项目:爬取书籍信息
3.1 抓取单页书籍信息
我们先尝试抓取第一页中的所有书籍名称和价格。
import requestsfrom bs4 import BeautifulSoupimport pandas as pd# 请求目标页面url = "https://books.toscrape.com/"response = requests.get(url)# 判断请求是否成功if response.status_code == 200: # 解析HTML内容 soup = BeautifulSoup(response.text, 'html.parser') # 提取书籍信息 books = [] for item in soup.find_all('article', class_='product_pod'): title = item.h3.a['title'] price = item.find('p', class_='price_color').text books.append({ 'title': title, 'price': price }) # 转换为DataFrame并输出 df = pd.DataFrame(books) print(df.head()) # 导出为CSV文件 df.to_csv("books_page1.csv", index=False)else: print(f"请求失败,状态码: {response.status_code}")
这段代码做了以下几件事:
使用requests.get()
获取网页内容;使用 BeautifulSoup
解析 HTML;查找包含书籍信息的 <article>
标签;提取书名和价格,并保存到字典列表中;最后使用 pandas
将数据导出为 CSV 文件。运行结果如下(示例):
title | price |
---|---|
A Light in the Attic | £51.77 |
Tipping the Velvet | £53.74 |
Soumission | £50.10 |
3.2 分页爬取多个页面
接下来我们扩展功能,爬取所有分页的书籍信息。该网站每页显示 20 本书,总共有大约 50 页。
base_url = "https://books.toscrape.com/catalogue/page-{}.html"all_books = []for page in range(1, 51): # 爬取前50页 url = base_url.format(page) response = requests.get(url) if response.status_code != 200: print(f"第{page}页请求失败") continue soup = BeautifulSoup(response.text, 'html.parser') for item in soup.find_all('article', class_='product_pod'): title = item.h3.a['title'] price = item.find('p', class_='price_color').text all_books.append({ 'title': title, 'price': price })# 转换为DataFrame并保存df_all = pd.DataFrame(all_books)df_all.to_csv("all_books.csv", index=False)print(f"共抓取 {len(all_books)} 本书籍信息")
这个脚本会依次访问每一页,并把所有的书籍信息合并保存。
4. 数据清洗与分析
虽然我们已经获取了数据,但价格字段还带有英镑符号(£),我们可以将其转换为浮点数以便后续分析。
# 清洗价格字段df_all['price'] = df_all['price'].str.replace('£', '').astype(float)# 输出平均价格average_price = df_all['price'].mean()print(f"书籍平均价格为:£{average_price:.2f}")# 统计价格分布price_distribution = pd.cut(df_all['price'], bins=range(0, 101, 10)).value_counts().sort_index()print("\n价格区间分布:")print(price_distribution)
这部分代码将价格字段转换为数值类型,并计算了平均价格和价格区间分布。
5. 完整代码整合
以下是完整的爬虫代码,包括多页爬取和数据清洗部分:
import requestsfrom bs4 import BeautifulSoupimport pandas as pddef fetch_books_from_page(url): response = requests.get(url) if response.status_code != 200: return [] soup = BeautifulSoup(response.text, 'html.parser') books = [] for item in soup.find_all('article', class_='product_pod'): title = item.h3.a['title'] price = item.find('p', class_='price_color').text books.append({ 'title': title, 'price': price }) return booksdef main(): base_url = "https://books.toscrape.com/catalogue/page-{}.html" all_books = [] for page in range(1, 51): url = base_url.format(page) print(f"正在爬取第 {page} 页...") books = fetch_books_from_page(url) all_books.extend(books) df = pd.DataFrame(all_books) df['price'] = df['price'].str.replace('£', '').astype(float) df.to_csv("all_books_cleaned.csv", index=False) print(f"\n共抓取 {len(all_books)} 本书籍信息") print(f"平均价格为:£{df['price'].mean():.2f}") print("\n价格区间分布:") print(pd.cut(df['price'], bins=range(0, 101, 10)).value_counts().sort_index())if __name__ == "__main__": main()
6. 总结与注意事项
通过本文,我们实现了以下功能:
使用 Python 编写了一个基本的 Web 爬虫;爬取了书籍标题和价格;实现了多页爬取;对数据进行了清洗和简单分析;使用 Pandas 导出结构化数据。在实际应用中,还需要注意以下几点:
遵守 robots.txt:查看目标网站的robots.txt
文件,确认是否允许爬虫访问相关路径。设置请求头 User-Agent:避免被服务器识别为机器人。增加异常处理机制:如超时重试、IP 限制等。合理控制频率:避免对服务器造成过大压力。如果你有兴趣进一步深入,可以尝试添加以下功能:
图书分类统计;图书评分抓取;使用代理 IP;使用 Selenium 模拟浏览器操作动态加载内容。参考资料:
Requests官方文档BeautifulSoup官方文档Pandas官方文档Books to Scrape希望这篇文章能帮助你入门 Web 爬虫开发!
免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com