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基本操作基础较弱,只好用笨办法)
[Python] 纯文本查看 复制代码
start_idx = [0,25,50,75,100,125,150,175,200,225]
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.使用正则匹配需要的数据(重点讲解)
[Python] 纯文本查看 复制代码
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)
每个电影在一个<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] 纯文本查看 复制代码 # 豆瓣250排行榜
# 拿到页面源代码
# 正则提取信息
import requests
import re
import csv
start_idx = [0,25,50,75,100,125,150,175,200,225]
# 在这里打开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()
|