使用Python进行网络爬虫开发:从入门到实践
随着互联网的发展,数据成为了最宝贵的资源之一。为了获取这些数据,网络爬虫(Web Scraping)技术应运而生。网络爬虫是一种自动化程序,能够模拟浏览器访问网页并提取所需信息的技术。本文将介绍如何使用 Python 编写一个简单的网络爬虫,并通过实际案例展示其应用。
什么是网络爬虫?
网络爬虫(Web Crawler 或 Web Scraper)是指自动抓取互联网上指定网站内容的程序。它可以广泛应用于数据分析、价格监控、新闻聚合、搜索引擎等领域。
⚠️ 注意:在进行网络爬虫时,请务必遵守目标网站的
robots.txt
文件规定和相关法律法规,尊重网站的版权与隐私政策。
Python 中常用的网络爬虫库
Python 提供了多个用于网络爬虫开发的第三方库:
requests
:发送 HTTP 请求,获取网页源码。BeautifulSoup
:解析 HTML 页面,提取数据。lxml
:高效的 XML 和 HTML 解析器。Scrapy
:功能强大的爬虫框架。Selenium
:模拟浏览器操作,适用于 JavaScript 动态加载页面。本文将以 requests
和 BeautifulSoup
为例,演示一个完整的网络爬虫实现过程。
实战项目:爬取豆瓣电影 Top250 数据
我们将编写一个 Python 爬虫程序,从 豆瓣电影 Top250 页面中提取每部电影的名称、评分、导演和年份等信息,并将其保存为 CSV 文件。
3.1 安装依赖库
首先确保你已安装以下库:
pip install requests beautifulsoup4 lxml
3.2 分析页面结构
打开豆瓣电影 Top250 页面,右键点击任意一部电影的标题,选择“检查”查看 HTML 结构。我们会发现每部电影的信息都包含在一个 <div class="item">
标签内。
例如:
<div class="item"> <div class="pic"> <em class="">1</em> <a href="..."> <img width="95" alt="肖申克的救赎" src="..."> </a> </div> <div class="info"> <div class="hd"> <a href="..."> <span class="title">肖申克的救赎</span> ... </a> </div> <div class="bd"> <p class=""> 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins / 摩根·弗里曼 Morgan Freeman <br> 1994 / 美国 / 剧情 </p> <div class="star"> <span class="rating_num" property="v:average">9.3</span> ... </div> </div> </div></div>
我们可以从中提取:
电影名:.title
年份:在 <p>
标签中的文本部分评分:.rating_num
导演:在 <p>
标签中以“导演: ”开头的部分3.3 编写代码
下面是一个完整的 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/119.0 Safari/537.36'}def get_movie_data(url): response = requests.get(url, headers=headers) if response.status_code != 200: print(f"请求失败,状态码:{response.status_code}") return [] soup = BeautifulSoup(response.text, 'lxml') items = soup.find_all('div', class_='item') movies = [] for item in items: title = item.find('span', class_='title').text rating = item.find('span', class_='rating_num').text year_info = item.find('div', class_='bd').find('p').get_text(strip=True, separator=' ') year = year_info.split('/')[0].strip() # 提取导演 director = '' p_text = item.find('div', class_='bd').find('p').text if '导演:' in p_text: director = p_text.split('导演:')[1].split(' ')[0] movies.append({ 'title': title, 'director': director, 'year': year, 'rating': rating }) return moviesdef 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=['title', 'director', 'year', 'rating']) writer.writeheader() writer.writerows(data)def main(): base_url = 'https://movie.douban.com/top250?start={}' all_movies = [] for i in range(0, 250, 25): # 总共10页,每页25条 url = base_url.format(i) print(f'正在爬取第 {i // 25 + 1} 页:{url}') movies = get_movie_data(url) all_movies.extend(movies) time.sleep(2) # 避免请求频率过高被封IP save_to_csv(all_movies) print(f'总共爬取 {len(all_movies)} 部电影信息,已保存至 douban_top250.csv')if __name__ == '__main__': main()
3.4 代码说明
requests.get():向目标 URL 发起 GET 请求。BeautifulSoup:用于解析 HTML 内容。csv.DictWriter:将字典格式的数据写入 CSV 文件。time.sleep(2):设置请求间隔,避免对服务器造成过大压力。headers:伪装成浏览器访问,防止被反爬机制识别。结果展示
运行上述代码后,会在当前目录下生成一个名为 douban_top250.csv
的文件,内容如下:
title | director | year | rating |
---|---|---|---|
肖申克的救赎 | 弗兰克·德拉邦特 | 1994 | 9.3 |
霸王别姬 | 陈凯歌 | 1993 | 9.6 |
阿甘正传 | 罗伯特·泽米吉斯 | 1994 | 9.5 |
你可以用 Excel 打开该文件查看爬取结果。
进阶方向
虽然本文实现的是静态页面爬虫,但在实际应用中,很多网站的内容是通过 JavaScript 动态加载的。此时可以考虑以下进阶方法:
使用 Selenium:模拟浏览器行为,适合动态渲染页面。调用 API 接口:有些网站提供公开 API,直接调用更高效。使用 Scrapy 框架:构建大型爬虫项目,支持异步、分布式等高级特性。处理反爬机制:如 IP 封锁、验证码识别、Cookie 登录等。网络爬虫是一项非常实用的技术,尤其在数据驱动的时代,掌握这项技能可以帮助我们快速获取有价值的信息。通过本文的讲解与示例代码,相信你已经了解了如何使用 Python 实现一个基本的网络爬虫程序。
当然,爬虫只是数据获取的第一步,后续还需要结合数据分析、可视化等技术才能真正发挥数据的价值。
如果你对爬虫感兴趣,不妨尝试扩展这个项目,比如爬取更多字段、加入日志记录、异常处理等功能,甚至将其部署为一个定时任务服务。
参考链接:
Requests 官方文档BeautifulSoup 官方文档豆瓣电影 Top250字数统计:约 1700 字