爬取豆瓣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>.*?) '
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()
我爬了多次,豆瓣直接给封了ip,是不是得弄个虚拟登录和控制时间间隔的 y以后可能学习爬虫 这个有用:lol 感谢分享,正适合入门小白练手:lol Soar119 发表于 2021-11-21 14:36
我爬了多次,豆瓣直接给封了ip,是不是得弄个虚拟登录和控制时间间隔的
你说的虚拟登录之类的我不知道,毕竟我也是个小白。。
在这个项目中,重点就是正则的运用,如果被封了,这个就别做了吧
以后的项目requests获取数据之后要resp.close就行,切记啊! paypojie 发表于 2021-11-21 14:41
y以后可能学习爬虫 这个有用
我这篇帖子更像是我的一个学习笔记,
如果想系统学习,你可以去帖子开头的那个bilibili网址一起学习 你好,年份的正则表达式是不是有问题呢,我爬下来的书籍中没有年份 githubi 发表于 2021-11-21 22:03
你好,年份的正则表达式是不是有问题呢,我爬下来的书籍中没有年份
你可以按f12查看网页源代码,(截图到论坛,我会看的)
可能略有差异,反正你发到论坛,我自会帮你查看正则的~ Soar119 发表于 2021-11-21 14:36
我爬了多次,豆瓣直接给封了ip,是不是得弄个虚拟登录和控制时间间隔的
上代{过}{滤}理,然后就是设置一下sleep,不然你一秒看一页,谁都知道你不是人{:301_1001:}
封ip的话,要是那种可以付费的说不定买个东西就好了,也有的就是解不了了,推荐还是要用代{过}{滤}理池爬东西。
页:
[1]