使用Python实现一个简单的Web爬虫

昨天 6阅读

在当今数据驱动的世界中,网络爬虫(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 文件。

运行结果如下(示例):

titleprice
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

目录[+]

您是本站第1699名访客 今日有18篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!