vtor 发表于 2021-11-21 11:46

爬取豆瓣top250榜

vtor-python学习之路-爬取豆瓣top250榜单基本信息0.说明
在上篇帖子中提到了python中requesets库与re库等的使用
现在来实操一下,爬取豆瓣top250榜单基本信息
此贴编辑&发布于20211121日,114440秒
如有错误,欢迎指正,共同进步
视频教程网址
https://www.bilibili.com/video/BV1i54y1h75W

1.导入相关的库,这点不多说,见源码即可
2.确定要爬取的网址
这是第1个page的网址:”https://movie.douban.com/top250“
第2个page的网址:“https://movie.douban.com/top250?start=25&filter=”
第3个page的网址:“https://movie.douban.com/top250?start=50&filter=”
可以看到就是start这个变量在变化,将这个变量设置为0,刚好能访问的第1个page
那么,网址确定完成(源码内使用for in进行循环,我python基本操作基础较弱,只好用笨办法)

start_idx =
for i in start_idx:
        # 先确定网址与ua
# 可以格式化字符串,将变量放进字符串内
        url = f"https://movie.douban.com/top250?start={i}&filter="

3.创建ua,导入字典,不清楚的可以见上一个帖子
4.使用requests获取数据,然后关闭resp
resp = requests.get(url,headers = header)
page_text = resp.text
resp.close()
5.使用正则匹配需要的数据(重点讲解)

        info_re = re.compile(r'<li>.*?<span class="title">(?P<name>.*?)</span>'
                r'.*?<div class="bd">.*?<br>(?P<year>.*?)&nbsp'
                r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                r'.*?<span>(?P<people_num>.*?)</span>'
                ,re.S)

每个电影在一个<li>.*?</li>内,然后中间按回车可以继续输入正则,
记得在正则前面输入.*?这样才能正确匹配,
python内的re模块使用(?P<group_name>)可以获得<>内的数据(不懂请见上一帖)
这里要注意年份会是“   1994”,前面有空格,需要使用tstrip()清除空格



6.打印与csv文件保存
f = open("data.csv",mode="w", encoding="utf-8",newline="")
csvwriter = csv.writer(f)
        # 输出到控制台 或者 写入到文件中
        for i in info_iter:
                print(i.group("name"),i.group("year").strip(),i.group("score"),i.group("people_num"))

                dic = i.groupdict()
                dic['year'] = dic['year'].strip()
                csvwriter.writerow(dic.values())
# 最后关闭文件
f.close()


7.附上完整代码,欢迎评论,共同进步
# 豆瓣250排行榜
# 拿到页面源代码
# 正则提取信息

import requests
import re
import csv
start_idx =

# 在这里打开csv文件
f = open("data.csv",mode="w", encoding="utf-8",newline="")
csvwriter = csv.writer(f)
       
for i in start_idx:
        # 先确定网址与ua
        # 可以格式化字符串,将变量放进字符串内
        url = f"https://movie.douban.com/top250?start={i}&filter="
        header = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44"
        }
        resp = requests.get(url,headers = header)
        page_text = resp.text
        print(resp.url)
        # 一定要记得colse
        resp.close

        # 预先确定正则
        info_re = re.compile(r'<li>.*?<span class="title">(?P<name>.*?)</span>'
                r'.*?<div class="bd">.*?<br>(?P<year>.*?) '
                r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                r'.*?<span>(?P<people_num>.*?)</span>'
                ,re.S)
        # 返回含有数据的迭代器
        info_iter = info_re.finditer(page_text)
       
        # 输出到控制台 或者 写入到文件中
        for i in info_iter:
                print(i.group("name"),i.group("year").strip(),i.group("score"),i.group("people_num"))

                dic = i.groupdict()
                dic['year'] = dic['year'].strip()
                csvwriter.writerow(dic.values())
# for到此结束
# 最后关闭文件
f.close()


Soar119 发表于 2021-11-21 14:36

我爬了多次,豆瓣直接给封了ip,是不是得弄个虚拟登录和控制时间间隔的

甜萝 发表于 2021-11-21 14:41

y以后可能学习爬虫 这个有用:lol

qiubai2022 发表于 2021-11-21 15:36

感谢分享,正适合入门小白练手:lol

vtor 发表于 2021-11-21 16:06

Soar119 发表于 2021-11-21 14:36
我爬了多次,豆瓣直接给封了ip,是不是得弄个虚拟登录和控制时间间隔的

你说的虚拟登录之类的我不知道,毕竟我也是个小白。。
在这个项目中,重点就是正则的运用,如果被封了,这个就别做了吧
以后的项目requests获取数据之后要resp.close就行,切记啊!

vtor 发表于 2021-11-21 16:08

paypojie 发表于 2021-11-21 14:41
y以后可能学习爬虫 这个有用

我这篇帖子更像是我的一个学习笔记,
如果想系统学习,你可以去帖子开头的那个bilibili网址一起学习

githubi 发表于 2021-11-21 22:03

你好,年份的正则表达式是不是有问题呢,我爬下来的书籍中没有年份

vtor 发表于 2021-11-22 08:53

githubi 发表于 2021-11-21 22:03
你好,年份的正则表达式是不是有问题呢,我爬下来的书籍中没有年份

你可以按f12查看网页源代码,(截图到论坛,我会看的)
可能略有差异,反正你发到论坛,我自会帮你查看正则的~

楚子沦i 发表于 2021-11-22 09:27

Soar119 发表于 2021-11-21 14:36
我爬了多次,豆瓣直接给封了ip,是不是得弄个虚拟登录和控制时间间隔的

上代{过}{滤}理,然后就是设置一下sleep,不然你一秒看一页,谁都知道你不是人{:301_1001:}
封ip的话,要是那种可以付费的说不定买个东西就好了,也有的就是解不了了,推荐还是要用代{过}{滤}理池爬东西。
页: [1]
查看完整版本: 爬取豆瓣top250榜