Python 爬虫经典项目介绍 - 豆瓣 Top250(requests)

Python 爬虫经典项目介绍 - 豆瓣 Top250(requests)
最新回答
我萌怪我咯

2026-04-17 14:49:18

豆瓣Top250爬虫项目(requests版)是一个经典的Python爬虫实践案例,通过requests库获取网页数据,结合正则表达式提取结构化信息并保存为CSV文件。以下是项目核心解析:

1. 项目流程
  • 获取数据:使用requests发送HTTP请求,获取豆瓣Top250页面HTML内容。
  • 解析数据:通过正则表达式匹配电影名称、年份等关键字段。
  • 存储数据:将提取的数据写入CSV文件,便于后续分析。
2. 代码详解2.1 请求网页import requestsurl = '
https://movie.douban.com/top250'headers
= {"user-agent": "Mozilla/5.0..."} # 模拟浏览器访问resp = requests.get(url, headers=headers)page_content = resp.text # 获取HTML文本
  • 关键点:

    设置User-Agent头避免被反爬机制拦截。

    resp.text返回解码后的字符串,便于正则处理。

2.2 正则表达式匹配import reobj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)' r'</span>.*?<p class="">.*?<br>(?P<year>.*?)&nbsp', re.S)result = obj.finditer(page_content)
  • 正则设计:

    re.S使.匹配换行符,处理多行HTML。

    (?P<name>.*?)命名分组,提取电影名称和年份。

    非贪婪模式.*?避免过度匹配。

2.3 数据存储import csvf = open("data1.csv", mode='w')csvwriter = csv.writer(f)for it in result: dic = it.groupdict() dic['year'] = dic['year'].strip() # 清理年份数据 csvwriter.writerow(dic.values())f.close()
  • 输出文件:

    CSV格式,每行包含电影名称和年份(如肖申克的救赎,1994)。

    可通过追加字段扩展评分、评论数等(需修改正则表达式)。

3. 正则表达式扩展

若需提取更多字段(如评分、评价人数),可调整正则表达式:

obj = re.compile(r'<li>.*?<span class="title">(?P<name>.*?)</span>.*?' r'<span class="rating_num" property="v:average">(?P<rating>.*?)</span>.*?' r'<span>(?P<votes>.*?)人评价</span>', re.S)
  • 新增字段:

    rating:匹配评分(如9.7)。

    votes:匹配评价人数(如2800000)。

4. 注意事项
  • 反爬机制:豆瓣可能限制频繁请求,建议:

    添加随机延迟(time.sleep)。

    使用代理IP池(如requests.Session)。

  • 数据完整性:正则表达式需根据网页结构调整,若豆瓣改版可能导致匹配失败。
  • 异常处理:添加try-except块处理网络请求或文件写入错误。
5. 完整代码示例import requestsimport reimport csvimport timeurl = '
https://movie.douban.com/top250'headers
= {"user-agent": "Mozilla/5.0..."}resp = requests.get(url, headers=headers)page_content = resp.textobj = re.compile(r'<li>.*?<span class="title">(?P<name>.*?)</span>.*?' r'<span class="rating_num" property="v:average">(?P<rating>.*?)</span>.*?' r'<span>(?P<votes>.*?)人评价</span>.*?' r'<p class="">.*?<br>(?P<year>.*?)&nbsp', re.S)with open("douban_top250.csv", 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['名称', '评分', '评价人数', '年份']) # 写入表头 for it in obj.finditer(page_content): dic = it.groupdict() dic['year'] = dic['year'].strip() writer.writerow(dic.values()) time.sleep(2) # 礼貌性延迟6. 总结
  • 优势:requests简洁高效,正则表达式灵活适配复杂HTML。
  • 局限:正则表达式维护成本较高,复杂结构建议改用BeautifulSoup或lxml。
  • 进阶方向:

    多页爬取(分析URL规律,如start=25参数)。

    数据可视化(用pandas+matplotlib分析评分分布)。

通过本项目,可掌握requests基础用法、正则表达式实战及数据存储流程,为更复杂的爬虫项目奠定基础。