使用Python进行网络爬虫开发:从入门到实践

昨天 1阅读

随着互联网的发展,数据变得越来越重要。网络爬虫(Web Crawler)作为获取网页数据的一种常用手段,在数据分析、机器学习、市场研究等领域都有广泛应用。本文将介绍如何使用 Python 编写一个简单的网络爬虫,并通过实际案例展示其应用过程。


什么是网络爬虫?

网络爬虫是一种自动抓取万维网信息的程序或脚本。它会模拟浏览器访问网页,然后解析返回的 HTML 内容,提取所需的数据。网络爬虫可以用于搜索引擎的索引构建、价格监控、新闻聚合、社交媒体分析等多个场景。


技术选型与工具介绍

我们将使用以下技术栈来实现一个基本的网络爬虫:

Python:一种简洁易读、功能强大的编程语言。Requests:用于发送 HTTP 请求,获取网页内容。BeautifulSoup:用于解析 HTML 或 XML 文档,提取结构化数据。CSV / JSON:用于保存爬取的数据。User-Agent 设置:模拟浏览器访问,避免被网站屏蔽。

实战项目:爬取豆瓣电影 Top250 数据

我们将以 豆瓣电影 Top250 页面为例,编写一个爬虫程序,抓取每部电影的名称、评分、导演和上映年份等信息,并将其保存为 CSV 文件。

3.1 安装依赖库

在开始之前,请确保你已经安装了以下 Python 库:

pip install requests beautifulsoup4 lxml

lxml 是 BeautifulSoup 的一个解析器,速度更快,推荐使用。


3.2 爬虫代码实现

以下是完整的 Python 脚本:

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.0.0 Safari/537.36'}def get_movie_data(url):    response = requests.get(url, headers=headers)    if response.status_code != 200:        print(f"Failed to fetch {url}")        return []    soup = BeautifulSoup(response.text, 'lxml')    movie_list = []    items = soup.find_all('div', class_='item')    for item in items:        rank = item.find('em').text.strip()        title = item.find('span', class_='title').text.strip()        try:            rating = item.find('span', class_='rating_num').text.strip()        except:            rating = ''        director_info = item.find('p', class_='').text.strip().split('\n')[0]        year = director_info.split('/')[-1].strip()        movie_list.append({            'rank': rank,            'title': title,            'rating': rating,            'year': year        })    return movie_listdef save_to_csv(data, filename='douban_top250.csv'):    with open(filename, mode='w', encoding='utf-8-sig', newline='') as f:        writer = csv.DictWriter(f, fieldnames=['rank', 'title', 'rating', 'year'])        writer.writeheader()        writer.writerows(data)def main():    base_url = 'https://movie.douban.com/top250?start={}'    all_movies = []    for i in range(0, 250, 25):        url = base_url.format(i)        print(f"正在爬取第 {i // 25 + 1} 页: {url}")        movies = get_movie_data(url)        all_movies.extend(movies)        time.sleep(2)  # 避免请求频率过高    save_to_csv(all_movies)    print("爬取完成,数据已保存至 douban_top250.csv")if __name__ == '__main__':    main()

3.3 代码说明

1. 发送请求与设置 User-Agent

response = requests.get(url, headers=headers)

我们使用 requests 向目标 URL 发起 GET 请求。为了防止被网站识别为爬虫,我们设置了 User-Agent 模拟浏览器访问。

2. 解析 HTML 内容

soup = BeautifulSoup(response.text, 'lxml')

使用 BeautifulSouplxml 解析器来处理返回的 HTML 内容。接着通过查找特定的类名提取电影信息。

3. 提取字段信息

例如,排名字段在 <em> 标签中;电影标题在 <span class="title"> 中;评分则在 <span class="rating_num"> 中。导演和年份需要进一步处理字符串。

4. 保存为 CSV 文件

使用 Python 内置的 csv.DictWriter 将字典格式的数据写入 CSV 文件。

5. 分页爬取与延迟机制

豆瓣 Top250 分成了 10 页,每页显示 25 条记录。我们通过构造不同的 URL 实现分页爬取,并添加 time.sleep(2) 来控制请求频率,避免触发反爬机制。


注意事项与反爬策略应对

虽然上述代码能正常运行,但在实际部署中还需注意以下几点:

4.1 Robots协议

每个网站都应遵守其 robots.txt 文件中的规则。例如,豆瓣的 robots 协议允许爬取 /top250 页面,但禁止频繁访问 /subject/ 下的内容。

4.2 IP封锁与验证码

如果访问频率过高,可能会导致 IP 被封禁或出现验证码。可以通过以下方式缓解:

添加随机延迟(如 time.sleep(random.uniform(1, 3)))使用代理 IP引入 Selenium 模拟浏览器行为

4.3 数据合法性验证

在解析数据时,建议加入异常处理逻辑,防止因页面结构变化导致程序崩溃。


扩展方向

以上只是一个基础示例,你可以尝试以下进阶操作:

使用 Scrapy 框架重构项目,提升爬虫效率抓取每部电影的详细信息页(如剧情简介、演员表等)存储数据到数据库(如 MySQL、MongoDB)构建可视化图表(使用 Matplotlib、Seaborn 等)

总结

本文介绍了网络爬虫的基本概念,以及使用 Python 进行网页数据抓取的完整流程。通过一个实际案例,展示了如何利用 Requests 和 BeautifulSoup 获取并解析网页内容,并将结果保存为 CSV 文件。

网络爬虫是一项非常实用的技术,但也需要注意合法性和道德规范。希望你能用好这项技能,做出有价值的数据产品。


源码地址:你可以将上述代码保存为 douban_crawler.py 并运行,即可看到效果。

如果你对网络爬虫感兴趣,欢迎继续学习 Scrapy、Selenium、Playwright 等更高级的爬虫框架,它们能应对更复杂的动态网页和反爬机制。

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

目录[+]

您是本站第16006名访客 今日有6篇新文章

微信号复制成功

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