使用Python构建一个简单的Web爬虫

今天 4阅读

在当今数据驱动的世界中,网络爬虫(Web Crawler)已经成为获取互联网信息的重要工具。通过编写爬虫程序,我们可以自动化地从网页中提取结构化数据,用于数据分析、监控、研究等多个领域。本文将介绍如何使用 Python 编写一个简单的 Web 爬虫,抓取网页内容并进行基本的数据提取。

我们将使用 Python 中的几个常用库来完成这个任务:

requests:发送 HTTP 请求,获取网页内容。BeautifulSoup:解析 HTML 内容,提取所需数据。csv:将提取到的数据保存为 CSV 文件。

准备工作

首先,确保你的环境中安装了必要的库。你可以使用以下命令安装所需的依赖包:

pip install requests beautifulsoup4 lxml

我们选择 lxml 作为 BeautifulSoup 的解析器,因为它速度快且兼容性好。


爬取网页内容

为了演示目的,我们将爬取一个示例网站 https://books.toscrape.com/,这是一个专门用于练习爬虫技术的网站,提供了书籍列表和详细信息。

2.1 发送请求并获取页面内容

下面是一个简单的代码片段,展示如何使用 requests 获取网页内容:

import requestsurl = "https://books.toscrape.com/"response = requests.get(url)if response.status_code == 200:    print("成功获取网页内容")    html_content = response.textelse:    print(f"请求失败,状态码:{response.status_code}")

这段代码向目标 URL 发送了一个 GET 请求,并检查返回的状态码是否为 200(表示成功)。如果成功,则将网页的 HTML 内容存储在变量 html_content 中。


解析HTML内容并提取数据

接下来,我们将使用 BeautifulSoup 解析 HTML 并提取每本书的标题和价格。

3.1 解析HTML文档

from bs4 import BeautifulSoupsoup = BeautifulSoup(html_content, 'lxml')# 查找所有书籍条目books = soup.find_all('article', class_='product_pod')for book in books:    title = book.h3.a['title']    price = book.find('p', class_='price_color').get_text()    print(f"书名:{title},价格:{price}")

在这段代码中,我们:

使用 BeautifulSoup 解析 HTML;使用 find_all() 方法查找所有包含书籍信息的 <article> 标签;对于每个书籍条目,提取其标题(title)和价格(price);打印出每本书的信息。

输出结果类似于:

书名:A Light in the Attic,价格:£51.77书名:Moleskine Classic Notebook Black Soft Cover (X5 Notebook),价格:£33.96...

将数据保存为CSV文件

为了方便后续处理或分析,我们可以将爬取的数据保存为 CSV 文件格式。

4.1 构建数据列表并写入CSV

import csv# 存储提取的数据data = []for book in books:    title = book.h3.a['title']    price = book.find('p', class_='price_color').get_text()    data.append([title, price])# 将数据写入CSV文件with open('books_data.csv', mode='w', newline='', encoding='utf-8') as file:    writer = csv.writer(file)    writer.writerow(['Title', 'Price'])  # 写入表头    writer.writerows(data)  # 写入数据行print("数据已成功保存至 books_data.csv")

运行后,你会在当前目录下看到一个名为 books_data.csv 的文件,里面包含了爬取到的书籍名称和价格。


爬取多个页面

目前我们只爬取了第一页的内容。如果我们想要爬取整个网站中的所有书籍,就需要遍历所有页面。

5.1 自动翻页逻辑

def scrape_all_pages(base_url):    page_number = 1    while True:        url = f"{base_url}catalogue/page-{page_number}.html"        response = requests.get(url)        if response.status_code != 200:            print("没有更多页面了。")            break        soup = BeautifulSoup(response.text, 'lxml')        books = soup.find_all('article', class_='product_pod')        for book in books:            title = book.h3.a['title']            price = book.find('p', class_='price_color').get_text()            data.append([title, price])        print(f"已爬取第 {page_number} 页")        page_number += 1# 调用函数爬取全部页面scrape_all_pages("https://books.toscrape.com/")

上述函数会尝试访问 page-1.htmlpage-2.html 等页面,直到遇到不存在的页面为止。


注意事项与法律合规

虽然 Web 爬虫功能强大,但在实际应用中需要注意以下几点:

遵守 robots.txt:大多数网站都有 /robots.txt 文件,规定哪些页面可以被抓取,哪些不能。爬虫应尊重这些规则。控制请求频率:频繁请求可能会对服务器造成压力,建议使用 time.sleep() 控制请求间隔。使用 User-Agent:某些网站会对爬虫做限制,设置合理的 User-Agent 可以模拟浏览器行为。
headers = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36'}response = requests.get(url, headers=headers)

总结

本文介绍了如何使用 Python 构建一个简单的 Web 爬虫,包括发送请求、解析 HTML、提取数据以及保存为 CSV 文件。此外,我们还实现了多页自动爬取的功能,并讨论了爬虫使用过程中的一些注意事项。

通过掌握这些基础知识,你已经具备了开发更复杂爬虫的能力。你可以进一步学习如 Selenium、Scrapy 框架等高级工具,提升爬虫效率和稳定性。


完整代码汇总

import requestsfrom bs4 import BeautifulSoupimport csvimport timedef scrape_all_pages(base_url):    page_number = 1    data = []    while True:        url = f"{base_url}catalogue/page-{page_number}.html"        headers = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36'        }        response = requests.get(url, headers=headers)        if response.status_code != 200:            print("没有更多页面了。")            break        soup = BeautifulSoup(response.text, 'lxml')        books = soup.find_all('article', class_='product_pod')        for book in books:            title = book.h3.a['title']            price = book.find('p', class_='price_color').get_text()            data.append([title, price])        print(f"已爬取第 {page_number} 页")        page_number += 1        time.sleep(1)  # 避免请求过快    # 保存数据    with open('books_data.csv', mode='w', newline='', encoding='utf-8') as file:        writer = csv.writer(file)        writer.writerow(['Title', 'Price'])        writer.writerows(data)    print("数据已成功保存至 books_data.csv")# 开始爬取scrape_all_pages("https://books.toscrape.com/")

希望这篇文章对你理解 Web 爬虫的工作原理有所帮助!如果你有任何问题或想了解更高级的技术,请随时留言交流。

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第6457名访客 今日有17篇新文章

微信号复制成功

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