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

今天 3阅读

在互联网时代,数据是最宝贵的资源之一。Web 爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析、价格监控等领域。本文将介绍如何使用 Python 编写一个简单的 Web 爬虫,并展示其核心实现原理。

我们将使用 Python 中的 requestsBeautifulSoup 两个库来完成这个任务。如果你还没有安装这些库,可以通过以下命令安装:

pip install requests beautifulsoup4

Web 爬虫的基本工作原理

Web 爬虫的工作流程大致如下:

发起请求:向目标网站发送 HTTP 请求。接收响应:获取服务器返回的 HTML 页面内容。解析页面:提取感兴趣的数据。保存数据:将提取到的数据进行存储或进一步处理。

我们将在下面的示例中逐步实现上述步骤。


构建爬虫项目结构

为了使代码结构清晰,我们可以创建一个基本的项目结构:

web_crawler/│├── crawler.py        # 主程序文件├── requirements.txt  # 依赖库列表└── output/    └── results.csv   # 存储抓取结果

编写爬虫代码

3.1 导入必要的模块

import requestsfrom bs4 import BeautifulSoupimport csvimport time
requests:用于发送网络请求。BeautifulSoup:用于解析 HTML 文档。csv:用于将数据保存为 CSV 文件。time:用于设置请求间隔,避免频繁访问目标网站。

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

def fetch_page(url):    headers = {        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'    }    try:        response = requests.get(url, headers=headers, timeout=10)        if response.status_code == 200:            return response.text        else:            print(f"Failed to fetch page: {url}, status code: {response.status_code}")            return None    except Exception as e:        print(f"Error fetching page: {e}")        return None

此函数用于获取指定 URL 的 HTML 内容,并设置了 User-Agent 避免被识别为爬虫。


3.3 解析 HTML 并提取数据

假设我们要从一个书籍信息页面中提取书名和价格。HTML 结构如下(简化版):

<div class="book">    <h3>Python编程入门</h3>    <span class="price">¥59.90</span></div><div class="book">    <h3>深入理解机器学习</h3>    <span class="price">¥89.00</span></div>

对应的解析代码如下:

def parse_books(html):    soup = BeautifulSoup(html, 'html.parser')    books = []    for item in soup.find_all('div', class_='book'):        title = item.find('h3').get_text(strip=True)        price = item.find('span', class_='price').get_text(strip=True)        books.append({            'title': title,            'price': price        })    return books

该函数会遍历所有包含书籍信息的 <div> 标签,并提取标题和价格。


3.4 保存数据到 CSV 文件

def save_to_csv(data, filename='output/results.csv'):    with open(filename, mode='w', newline='', encoding='utf-8') as file:        writer = csv.DictWriter(file, fieldnames=['title', 'price'])        writer.writeheader()        writer.writerows(data)

3.5 整合主函数逻辑

def main():    base_url = "https://example.com/books?page={}"    all_books = []    for page in range(1, 4):  # 抓取前3页        url = base_url.format(page)        print(f"Fetching page: {url}")        html = fetch_page(url)        if html:            books = parse_books(html)            all_books.extend(books)            time.sleep(2)  # 设置延迟,避免触发反爬机制    if all_books:        save_to_csv(all_books)        print(f"成功抓取 {len(all_books)} 条书籍信息,并保存至 output/results.csv")    else:        print("未抓取到任何书籍信息。")if __name__ == '__main__':    main()

这段代码实现了完整的爬取流程:循环抓取多页内容、解析每一页、合并所有书籍信息并保存到 CSV 文件中。


注意事项与优化建议

4.1 反爬机制应对策略

设置请求头(Headers):模拟浏览器访问。设置请求间隔(time.sleep):避免短时间内大量请求。使用代理 IP 池:防止 IP 被封禁。使用 Selenium 或 Playwright:模拟浏览器行为,绕过 JavaScript 渲染限制。

4.2 数据清洗与异常处理

对提取字段做非空判断。使用正则表达式清理价格字段中的符号。添加日志记录功能以便调试。

4.3 合法性说明

在实际部署爬虫之前,请确保你已阅读并遵守目标网站的 robots.txt 协议以及相关法律法规,尊重网站的爬取政策,避免对目标服务器造成压力。


总结

本文通过一个完整的示例介绍了如何使用 Python 编写一个基础的 Web 爬虫程序。我们使用了 requests 获取网页内容,用 BeautifulSoup 提取所需数据,并将其保存为 CSV 文件。虽然这是一个简单的实现,但它展示了爬虫开发的基本思路和技术栈。

随着需求的复杂化,你可以进一步扩展功能,例如支持异步请求(使用 aiohttp)、分布式爬取(使用 Scrapy + Redis)、持久化存储(MySQL、MongoDB)等。希望这篇文章能为你开启 Web 爬虫技术的大门。


完整代码仓库地址(可选):[GitHub 示例链接]

如需进一步学习,推荐查看:

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

目录[+]

您是本站第13275名访客 今日有28篇新文章

微信号复制成功

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