一 前言
在本篇文章中,我们将探讨如何使用Python的asyncio
和aiohttp
库来异步抓取豆瓣电影Top 250中的电影数据,并将这些数据保存到CSV文件中,最后使用matplotlib
库对评分趋势进行可视化。
目标网站:https://movie.douban.com/top250
二 环境准备
首先确保你的环境中已经安装了必要的Python库。你可以通过pip安装它们:
pip install aiohttp matplotlib
三 项目概览
我们的项目主要分为以下几个步骤:
- 定义一个异步函数来从豆瓣网站上抓取指定年份的电影数据。
- 在主函数中创建一系列异步任务,用于并发地抓取不同年份的数据。
- 将收集到的数据写入CSV文件。
- 对数据进行可视化处理,展示每年电影评分的变化趋势。
四 代码详解
4.1 异步抓取数据
我们定义了一个名为fetch_data
的异步函数,它接受一个HTTP会话对象和一个年份作为参数。这个函数负责构造URL、发送请求、解析响应内容并提取所需的信息。
import re
async def fetch_data(session, year):
url = f"https://movie.douban.com/top250?start=0&filter=&year={
year}"
async with session.get(url) as resp:
page_content = await resp.text()
# 正则表达式匹配模式
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)'
r'</span>.*?<p class="">.*?<br>(?P<year>.*?)'
r' / (?P<country>.*?) '
r';/ (?P<plot>.*?)'
r'</p>.*?<span class="rating_num" property="v:average">(?P<evaluate>.*?)'
r'</span>.*?<span>(?P<numbers>.*?)人评价</span>', re.S)
result = obj.finditer(page_content)
data = []
for it in result:
dic = it.groupdict()
dic['year'] = dic['year'].strip()
dic['plot'] = dic['plot'].strip('"')
data.append(dic)
return data
4.2 主函数与并发执行
main
函数是程序的入口点,它初始化时间记录、设置要抓取的年份范围,并创建一个ClientSession
以发起网络请求。接着,为每个年份创建一个fetch_data
的任务,并使用asyncio.gather
并发执行所有任务。
import asyncio
import aiohttp
import csv
import time
async def main(
标签:异步,Python,抓取,dic,year,import,data
From: https://blog.csdn.net/2301_78198846/article/details/142892332