使用Python进行Web数据抓取:从零开始的技术实践

今天 3阅读

在当今数据驱动的时代,网络爬虫(Web Crawler)已经成为获取公开数据的重要工具之一。本文将带领读者使用 Python 编写一个简单的 Web 爬虫,演示如何从网页中提取结构化数据,并将其存储到本地文件中。我们将使用 requestsBeautifulSoup 两个主要的库来实现这一目标。


什么是Web爬虫?

Web爬虫是一种自动访问网页并提取信息的程序。它模拟浏览器的行为,向服务器发送请求,接收响应内容,然后解析和提取所需的数据。爬虫广泛应用于搜索引擎、价格监控、数据分析、舆情监测等多个领域。


准备工作

1. 安装必要的库

首先确保你的 Python 环境已经安装了以下库:

pip install requests beautifulsoup4 lxml
requests:用于发送 HTTP 请求。beautifulsoup4:用于解析 HTML 文档。lxml:作为 BeautifulSoup 的解析器,速度快且容错性好。

项目目标

我们将以 https://books.toscrape.com/ 这个网站为例,爬取其所有图书的名称、价格和评分信息,并保存为 CSV 文件。

该网站是专门为练习爬虫技术设计的测试站点,非常适合入门学习。


代码实现

1. 发送请求与解析HTML

我们先尝试访问首页并提取一本书的信息。

import requestsfrom bs4 import BeautifulSoupurl = "https://books.toscrape.com/"response = requests.get(url)soup = BeautifulSoup(response.text, 'lxml')# 查找第一本书book = soup.find('article', class_='product_pod')title = book.h3.a['title']price = book.find('p', class_='price_color').textrating = book.p['class'][1]  # 获取评分等级,如 One, Two...print(f"书名: {title}")print(f"价格: {price}")print(f"评分: {rating}")

输出示例:

书名: A Light in the Attic价格: £51.77评分: Three

2. 遍历所有书籍页面

接下来,我们要遍历所有的书籍页面。每页有 20 本书,共有 50 页。

all_books = []for page_num in range(1, 51):    url = f"https://books.toscrape.com/catalogue/page-{page_num}.html"    response = requests.get(url)    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').text        rating = book.p['class'][1]        all_books.append({            'title': title,            'price': price,            'rating': rating        })print(f"总共抓取 {len(all_books)} 本书")

3. 将数据保存为CSV格式

为了便于后续分析,我们可以将抓取到的数据保存为 CSV 文件。

import csvcsv_file = 'books_data.csv'with open(csv_file, mode='w', newline='', encoding='utf-8') as file:    writer = csv.DictWriter(file, fieldnames=['title', 'price', 'rating'])    writer.writeheader()    writer.writerows(all_books)print("数据已成功写入 CSV 文件")

完整代码整合

以下是完整的爬虫脚本,包含异常处理和基本的反反爬策略。

import requestsfrom bs4 import BeautifulSoupimport csvimport timeheaders = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0 Safari/537.36'}all_books = []for page_num in range(1, 51):    url = f"https://books.toscrape.com/catalogue/page-{page_num}.html"    try:        response = requests.get(url, headers=headers, timeout=10)        response.raise_for_status()  # 检查是否有HTTP错误        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').text            rating = book.p['class'][1]            all_books.append({                'title': title,                'price': price,                'rating': rating            })        print(f"第 {page_num} 页抓取完成")        time.sleep(1)  # 延迟防止被封IP    except requests.RequestException as e:        print(f"请求失败: {e}")# 写入CSVcsv_file = 'books_data.csv'with open(csv_file, mode='w', newline='', encoding='utf-8') as file:    writer = csv.DictWriter(file, fieldnames=['title', 'price', 'rating'])    writer.writeheader()    writer.writerows(all_books)print("数据抓取完成并已保存至 CSV 文件")

反反爬机制简介

尽管我们的目标网站没有严格的反爬机制,但在实际项目中,你可能会遇到以下情况:

IP封锁:频繁访问会被暂时或永久封禁;验证码:需要用户交互;JavaScript渲染:部分网页依赖 JS 动态加载内容;User-Agent限制:识别非浏览器请求。

应对方法包括:

使用代理 IP;设置合理的请求间隔;使用 Selenium 或 Playwright 处理动态网页;模拟浏览器行为(设置 Headers);

总结

通过本文的学习,我们掌握了使用 Python 构建一个简单但功能完整的 Web 爬虫的方法。我们学会了:

如何发送 HTTP 请求;如何解析 HTML 页面;如何提取结构化数据;如何将数据保存为 CSV;如何处理常见的异常和延迟策略。

当然,真正的爬虫项目远比这个复杂得多。随着技能的提升,你可以尝试更复杂的框架如 Scrapy、Selenium,甚至结合数据库、API 接口等构建完整的数据采集系统。


参考资料

BeautifulSoup官方文档Requests官方文档Books to ScrapePython爬虫实战教程

如果你对进阶内容感兴趣,比如分布式爬虫、异步爬虫、爬取 JavaScript 渲染页面等,请继续关注我的后续文章!

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

目录[+]

您是本站第60022名访客 今日有31篇新文章

微信号复制成功

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