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基本操作基础较弱,只好用笨办法)

[Python] 纯文本查看 复制代码
1
2
3
4
5
start_idx = [0,25,50,75,100,125,150,175,200,225]
for 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.使用正则匹配需要的数据(重点讲解)

[Python] 纯文本查看 复制代码
1
2
3
4
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.附上完整代码,欢迎评论,共同进步

[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 豆瓣250排行榜
# 拿到页面源代码
# 正则提取信息
 
import requests
import re
import csv
start_idx = [0,25,50,75,100,125,150,175,200,225]
 
# 在这里打开csv文件
= open("data.csv",mode="w", encoding="utf-8",newline="")
csvwriter = csv.writer(f)
     
for 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 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()
Posted on 2021-12-03 23:30  污钞vtor  阅读(72)  评论(0编辑  收藏  举报