豆瓣top250爬取-cnblog

豆瓣top250爬取

​ (文末有完整代码)

​ 这是我做的第一个项目,对于初学者来说我觉得这个项目还是很好入手的,首先导入库并且设置好url和请求头image-20260114163318475

然后我们打开网址和开发者工具,找到我们想要查找的具体的单元,因为接下来我们要从中提取数据找到对应的页面源代码。

image-20260114162921771

用惰性匹配对变化的部分进行替换,用(?P<>.*?)的格式对于需要的数据进行命名保存。因为我们要重复精选多次筛洗,所以这里用compile做预加载

image-20260114173654942

访问的结果用循环读取,以迭代器的形式存在result中,先预存到list中,在用.groupdict的方法取出来。这里因为要对数据进行存储,所以就存到dic中,注意这里的data的中因为多了一个空格所以去除,最后的最后不要忘了关上请求image-20260114174239248

这样我们就完成第一页的爬取,通过观察下一页网址发现https://movie.douban.com/top250?start=25&filter=,翻页的网址由中间的数字提供,通过每页25个达到翻页的目的。我们添加一个循环,在循环中插入变量page每次增加25,总计10次,实现250次读取。

为了避免被当作爬虫拦截,记得在第二次读取前加入time.sleep()进行休息,我这里使用了随机数。

完整代码如下

import re
import requests
import csv
import time
import random

url = "https://movie.douban.com/top250"
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.122"
}
f = open("data.csv", mode="w", encoding="utf-8", newline="")
csvwriter = csv.writer(f)    # 创建csv写入对象
page = 0
while page <= 250:
    url_page = url + f"?start={page}&filter="
    resp = requests.get(url_page, headers=headers)
    page_content = resp.text

    obj = re.compile(r' <li>.*?<div class="item".*?<span class="title">(?P<name>.*?)</span>'
                     r'.*? <p>.*?<br>(?P<date>.*?)&nbsp.*?'
                     r'<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                     r'.*?<span>(?P<num>.*?)</span>', re.S)

    result = obj.finditer(page_content)
    for it in result:
        # print(it.group("name"))
        # print(it.group("num"))
        # print(it.group("score"))
        # print(it.group("date").strip())
        dic = it.groupdict()
        dic['date'] = dic['date'].strip()
        csvwriter.writerow(dic.values())
    resp.close()
    waite = random.randint(1, 5)  # 产生随机的休息时间 1~5秒之间
    time.sleep(waite)
    page += 25  # 翻页页号
    print(f"收集到前{page}个")
f.close()
print("over!")



posted @ 2026-01-15 17:16  san_sheng  阅读(0)  评论(0)    收藏  举报