使用python爬取豆瓣Top250排行榜数据

2024-01-02 23:28:58

目标网址

https://movie.douban.com/top250 

在这里插入图片描述

目标数据,爬取到电影名称,导演名字和年份,评分和评价人数

页面分析

在这里插入图片描述

通过F12可以直接搜索到目标数据,那么说明html结构和数据是一次性加载的,不需要二次记载

代码编写

首先导入模块

import requests
import re

接着编写代码

url="https://movie.douban.com/top250"


resp= requests.get(url)
resp.encoding="utf-8"
print(resp.text)

在这里插入图片描述

运行一下发现并没有拿到数据,那么可能要添加一下请求头

在页面上F12

在这里插入图片描述

把User-Agent拿下来,然后填上header

headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

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

在这里插入图片描述

这个时候就拿到我们要的数据了

提取数据

接下来就只需要提取数据就可以了,可以用正则,也可以用xpath

obj=re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<p class="">.*?导演: (?P<daoyan>.*?)&nbsp;.*?<br>(?P<year>.*?)&nbsp;.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<num>.*?)人评价</span>',re.S)
result=obj.finditer(resp.text)

我这里用正则匹配的方式进行提取

保存数据

接着,只需要将数据保存即可,效果如图:

在这里插入图片描述

完整代码如下:

import requests
import re

headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

f = open("top250.csv", mode="w", encoding="utf-8")

for i in range(0,225,25):
   url="https://movie.douban.com/top250?start="+str(i)+"&filter="
   resp = requests.get(url, headers=headers)
   resp.encoding = "utf-8"

   # 正则匹配
   obj = re.compile(
      r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<p class="">.*?导演: (?P<daoyan>.*?)&nbsp;.*?<br>(?P<year>.*?)&nbsp;.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<num>.*?)人评价</span>',
      re.S)
   result = obj.finditer(resp.text)

   # 提取数据
   for item in result:
      name = item.group("name")
      daoyan = item.group("daoyan")
      year = item.group("year").strip()
      score = item.group("score")
      num = item.group("num")
      f.write(f"{name},{daoyan},{year},{score},{num}\n")
      print(name, daoyan, year, score, num)

f.close()
resp.close()

aoyan},{year},{score},{num}\n")
print(name, daoyan, year, score, num)

f.close()
resp.close()


文章来源:https://blog.csdn.net/2303_81403407/article/details/135329111
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。