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

前天 9阅读

在现代的互联网环境中,数据变得越来越重要。无论是进行市场分析、研究趋势还是自动化信息收集,网络爬虫(Web Crawler) 都是一个非常有用的工具。本文将带你一步步使用 Python 构建一个基础但功能完整的 Web 爬虫,并讲解其中的关键技术。

我们将使用以下库:

requests:用于发起 HTTP 请求。BeautifulSoup:用于解析 HTML 内容。csv:将爬取的数据保存为 CSV 文件。time:控制请求频率,避免对服务器造成过大压力。

环境准备

首先确保你已经安装了 Python(建议版本为 3.8 及以上)。接下来安装所需的第三方库:

pip install requests beautifulsoup4

爬虫原理简介

Web 爬虫的基本工作流程如下:

发送 HTTP 请求获取网页内容;解析 HTML 或 JSON 数据;提取所需信息;存储或展示提取的信息;遵守网站的 robots.txt 和设置合理的请求间隔以避免被封禁。

项目目标

我们将在本项目中爬取 https://books.toscrape.com/ 这个专门用于练习爬虫的网站,提取每本书的书名、价格和评分,并将结果保存到 CSV 文件中。


代码实现

1. 导入必要的模块

import requestsfrom bs4 import BeautifulSoupimport csvimport time

2. 定义爬取函数

def fetch_books(url):    headers = {        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0 Safari/537.36'    }    response = requests.get(url, headers=headers)    if response.status_code != 200:        print(f"Failed to fetch {url}")        return []    soup = BeautifulSoup(response.text, 'html.parser')    books = []    for item in soup.select('.product_pod'):        title = item.select_one('h3 a')['title']        price = item.select_one('.price_color').text        rating_class = item.select_one('p')['class'][1]  # 获取星级类名,如 "Three"        rating = convert_rating(rating_class)        books.append({            'title': title,            'price': price,            'rating': rating        })    return books

3. 将星级转换为数字

def convert_rating(rating_str):    ratings = {        'One': 1,        'Two': 2,        'Three': 3,        'Four': 4,        'Five': 5    }    return ratings.get(rating_str, 0)

4. 主函数与分页处理

def scrape_all_pages(base_url):    all_books = []    page_num = 1    while True:        url = f"{base_url}catalogue/page-{page_num}.html"        print(f"Scraping page {page_num}: {url}")        books = fetch_books(url)        if not books:            print("No more pages found.")            break        all_books.extend(books)        time.sleep(1)  # 延迟1秒,防止过快请求        page_num += 1    return all_books

5. 保存数据到 CSV 文件

def save_to_csv(data, filename='books.csv'):    with open(filename, mode='w', newline='', encoding='utf-8') as file:        writer = csv.DictWriter(file, fieldnames=['title', 'price', 'rating'])        writer.writeheader()        writer.writerows(data)    print(f"Saved {len(data)} books to {filename}")

6. 启动爬虫程序

if __name__ == '__main__':    base_url = 'https://books.toscrape.com/'    books_data = scrape_all_pages(base_url)    save_to_csv(books_data)

运行结果示例

运行上述脚本后,会在当前目录下生成一个名为 books.csv 的文件,内容如下:

titlepricerating
A Light in the Attic£51.773
Fifty Shades of Grey£52.151
The Great Gatsby£13.994
.........

注意事项与优化建议

1. 遵守网站规则

在爬取任何网站之前,请务必查看其 robots.txt 文件,例如:https://books.toscrape.com/robots.txt,遵守其允许的路径和频率限制。

2. 异常处理增强

目前代码中没有加入详细的异常捕获机制,实际应用中应考虑加入 try-except 块来处理连接失败、超时等问题。

3. 使用代理和 User-Agent 池

为了更稳定地进行大规模抓取,可以引入随机 User-Agent 和 IP 代理池。

4. 多线程或异步爬虫

如果需要提高效率,可以使用 concurrent.futures 实现多线程爬取,或者使用 aiohttp + asyncio 实现异步非阻塞式爬虫。


总结

通过本文的学习,你已经掌握了一个简单但完整的 Web 爬虫的构建过程。我们使用了 Python 中的 requestsBeautifulSoup 来获取并解析网页数据,并将其存储为结构化的 CSV 文件。

爬虫是通往数据驱动世界的一扇大门,而 Python 是打开这扇门的绝佳钥匙。希望你能在此基础上继续深入学习,比如探索 Scrapy 框架、Selenium 自动化测试等高级主题。


如果你有兴趣进一步了解如何使用 Scrapy 框架来重构这个爬虫,欢迎留言或关注后续文章!


完整源码地址:你可以将上述所有代码段组合成一个 .py 文件即可运行。

如需导出 PDF 或 Markdown 格式,请告诉我,我可以为你整理。

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

目录[+]

您是本站第664名访客 今日有15篇新文章

微信号复制成功

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