抓取豆瓣电影TOP250标题-年份-评分-评分人数

import csv
import re

import requests

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.56'
}

# 正则
# 需要注意的是这个正则是一层一层的往下写的,不是单独出来的,每一段后面记得要接.*?不然程序会死循环
obj = re.compile(r'<div class="info">.*?<span class="title">.*?(?P<title>.*?)</span>.*?'
                 r'...<br>.*?(?P<year>.*?)&nbsp.*?'
                 r'property="v:average">.*?(?P<score>.*?)</span>.*?'
                 r'<span>(?P<num>.*?)人评价</span>', re.S)

f = open('data.csv', mode='w', encoding='utf-8', newline='')  # newline = ''
#备注:如果没有指定 newline=‘’,则嵌入引号中的换行符将无法正确解析,并且在写入时,使用 \r\n 换行的平台会有多余的 \r 写入。
csvwriter = csv.writer(f)

# 请求前TOP250个电影
# 它的url start是0,25,50最大时250,所以步长25,0开始250结束
for i in range(0, 250, 25):
    url = f'xxx/top250?start={i}'
    print(i)

    # 请求 并返回成text
    resp = requests.get(url=url, headers=headers)
    page_text = resp.text
    # print(page_text)

    result = obj.finditer(page_text)

    for it in result:
        # print(it.group('title'))
        # print(it.group('year').strip())  # 此数据如果不做任何处理会出现前后有很大的空格
        # # strip 去除前后空格 并返回字符串
        # print(it.group('score'))
        # print(it.group('num'))
        dic = it.groupdict()  # 统一返回,返回成字典包装起来
        dic['year'] = dic['year'].strip()  # 老样子,去除前后空格
        # print(dic)
        csvwriter.writerow(dic.values())  # 放到csv文件里

f.close()
resp.close()
print("完成!")

 

posted @ 2023-02-28 08:53  0x1e61  阅读(163)  评论(0编辑  收藏  举报