使用Python进行Web数据抓取:一个完整的实战教程
在当今大数据时代,网络上的信息量极其庞大。对于开发者和研究人员来说,如何从这些海量的网页数据中提取有用的信息成为一个重要的技能。本文将介绍如何使用 Python 进行 Web 数据抓取(Web Scraping),并提供一个完整的代码示例来演示整个流程。
什么是 Web 数据抓取?
Web 数据抓取是一种从网站自动提取结构化数据的技术。它广泛应用于价格监控、市场分析、新闻聚合、学术研究等多个领域。通过编写程序模拟浏览器访问网页,并解析网页内容,可以高效地获取所需的数据。
技术栈介绍
我们将使用以下 Python 库来完成本次任务:
Requests:用于发送 HTTP 请求获取网页内容。BeautifulSoup4:用于解析 HTML 文档并提取数据。Pandas:用于处理和保存抓取到的数据。CSV / JSON:用于保存抓取结果。你可以通过 pip 安装这些库:
pip install requests beautifulsoup4 pandas
实战项目:抓取豆瓣电影 Top250 的标题与评分
我们以豆瓣电影 Top250 页面为例(https://movie.douban.com/top250),抓取每部电影的名称、评分和链接。
3.1 分析网页结构
首先,我们需要查看目标网页的 HTML 结构,找到包含电影标题和评分的标签。
打开豆瓣电影 Top250 页面,右键点击任意一部电影的标题 → 检查元素,可以看到类似如下结构:
<div class="item"> <div class="pic"> <em class="">1</em> <a href="https://www.ippay.cn/zb_system/cmd.php?act=ajax&hk_url=aHR0cHM6Ly9tb3ZpZS5kb3ViYW4uY29tL3N1YmplY3QvMTI5MjA1Mi8=" rel="nofollow"> <img width="95" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" class=""> </a> </div> <div class="info"> <div class="hd"> <a href="https://www.ippay.cn/zb_system/cmd.php?act=ajax&hk_url=aHR0cHM6Ly9tb3ZpZS5kb3ViYW4uY29tL3N1YmplY3QvMTI5MjA1Mi8=" rel="nofollow"> <span class="title">肖申克的救赎</span> <span class="title"> / The Shawshank Redemption</span> <span class="other"> / 月黑高飞(港) / 刺激1995(台)</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> <span property="v:best" content="10.0"></span> <span>265492人评价</span> </div> </div> </div></div>
从中可以看出,每个电影条目都包含在一个 div
标签中,class 为 item
。标题位于 span.title
中,评分位于 span.rating_num
中,链接位于 a
标签的 href
属性中。
3.2 编写爬虫代码
下面是完整的 Python 爬虫代码:
import requestsfrom bs4 import BeautifulSoupimport pandas as pdimport timedef fetch_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36' } response = requests.get(url, headers=headers) if response.status_code == 200: return response.text else: print(f"请求失败,状态码:{response.status_code}") return Nonedef parse_html(html): soup = BeautifulSoup(html, 'html.parser') movies = [] for item in soup.find_all('div', class_='item'): title = item.find('span', class_='title').text rating = item.find('span', class_='rating_num').text link = item.find('a')['href'] movies.append({ 'title': title, 'rating': rating, 'link': link }) return moviesdef save_to_csv(data, filename='douban_top250.csv'): df = pd.DataFrame(data) df.to_csv(filename, index=False, encoding='utf-8-sig') print(f"数据已保存至 {filename}")def main(): base_url = 'https://movie.douban.com/top250?start=' all_movies = [] for i in range(0, 250, 25): # 每页25条,共10页 url = base_url + str(i) print(f"正在抓取第 {i//25 + 1} 页:{url}") html = fetch_page(url) if html: movies = parse_html(html) all_movies.extend(movies) time.sleep(2) # 避免请求过于频繁 save_to_csv(all_movies)if __name__ == '__main__': main()
3.3 代码说明
fetch_page(url):使用 requests 发送 GET 请求,带上 User-Agent 头防止被反爬虫机制拦截。parse_html(html):使用 BeautifulSoup 解析 HTML 内容,提取每部电影的标题、评分和链接。save_to_csv(data):使用 Pandas 将抓取到的数据保存为 CSV 文件。main():主函数控制分页抓取逻辑,循环抓取 10 页内容,并在每次请求后暂停 2 秒,避免对服务器造成过大压力。运行结果
运行以上脚本后,将在当前目录生成一个名为 douban_top250.csv
的文件,内容如下:
title | rating | link |
---|---|---|
肖申克的救赎 | 9.3 | https://movie.douban.com/subject/1292052/ |
霸王别姬 | 9.6 | https://movie.douban.com/subject/1291546/ |
... | ... | ... |
你也可以将其扩展为保存为 JSON 格式或数据库存储。
注意事项与合法性提醒
尊重 robots.txt:在爬取任何网站前,请先查看其robots.txt
文件(如 https://movie.douban.com/robots.txt)了解是否允许爬取。设置合理频率:不要过于频繁地请求同一个网站,建议设置延迟(如 time.sleep()
)。伪装 User-Agent:有些网站会检测请求头,使用合法的浏览器 UA 可以减少被封 IP 的风险。遵守法律法规:请确保你的行为不违反相关法律法规,尤其涉及用户隐私和商业数据时。进阶方向
使用 Selenium 抓取动态页面:当目标网页是通过 JavaScript 动态加载时,可以使用 Selenium 或 Playwright。使用 Scrapy 构建专业爬虫:Scrapy 是一个功能强大的爬虫框架,适合构建大型爬虫项目。数据清洗与可视化:结合 Pandas 和 Matplotlib/Seaborn 对抓取的数据进行分析和可视化。部署定时任务:使用 Cron Job 或 Airflow 实现定期自动抓取更新数据。总结
本文介绍了使用 Python 进行 Web 数据抓取的基本方法,并通过一个实际案例展示了如何从豆瓣电影 Top250 页面中提取电影信息。通过 Requests 和 BeautifulSoup 的组合,我们可以快速实现小型爬虫项目。同时,也强调了合法性和反爬虫策略的重要性。
如果你希望进一步深入学习 Web 数据抓取技术,建议学习 Scrapy 框架、Selenium 自动化测试以及数据清洗与分析等相关知识。
完整源码 GitHub 地址(示例):
https://github.com/example/web-scraping-demo(请替换为你自己的仓库地址)
如需更多帮助,欢迎留言交流!