使用Python构建一个简单的Web爬虫
在当今数据驱动的世界中,网络爬虫(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.html
、page-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 爬虫的工作原理有所帮助!如果你有任何问题或想了解更高级的技术,请随时留言交流。