爬取豆瓣网站的电影和电视的信息(可以用selenium)
a.要求10部电影和10部电视剧
b.作品上映时间跨度从2018-2021
c.作品评分7分以上
d.作品分类不限,可以按照地区,或者类型
e.要求运行完程序以后,在源代码文件夹里面,有一个名为douban的文件夹。
f.在douban文件夹中,有2个文件夹,一个文件夹名为movie,另一个名为series,每个文件夹里面的子文件夹以作品发布时间+作品名称作为文件名
g.movie文件夹里面有10个子文件夹,代表10部电影
h.series文件夹里面有10个子文件夹,代表10部电视剧
i.作品文件夹里面的内容有两个,一个是作品在豆瓣的封面图,一个是info.text
j.info.text里面有作品的基本内容,名称,上映年份,导演,主演,作品简介,豆瓣关于这个作品的链接
(不要用xpath,尽量不要用def)
题主要的代码如下,里面有有注释
from bs4 import BeautifulSoup
import os
import requests
import time
#列表接口网址
tmpurl="https://movie.douban.com/j/search_subjects?type={0}&tag=%E7%83%AD%E9%97%A8&sort=time&page_limit=20&page_start={1}"
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
'Referer':'https://movie.douban.com/'}
maxcount=10
score=7
minyear=2018
types={'movie':'movie','tv':'series'}#电影,电视剧类型及目录隐射
for type,value in types.items():
count=0
print('正在下载'+type)
for i in range(10):#由于有评分和时间限制,所以采集10页的结果应该可以够10个页面了
url=tmpurl.format(type,i*20)#填充网址模板需要的数据,如信息类型,采集的页数
#print(url)
data=requests.get(url,headers=headers).json()#列表返回的是json数据,直接获取json对象
for item in data['subjects']:
if item['rate']!='' and float(item['rate'])>score:#满足分数
html=requests.get(item['url'],headers=headers).text#下载详细页面的html
soup=BeautifulSoup(html,'lxml')
#获取年份
year=soup.select('h1 span.year')
#print(year)
if len(year)>0:
year=year[0].text.replace('(','').replace(')','')
if int(year)>=minyear:#满足年份
title=item['title'].replace('/','').replace('\\','')
folder="douban/"+value+"/"+year+title#目录
os.makedirs(folder)#创建目录
#下载封面图片
req=requests.get(item['cover'],headers=headers)
with open(folder+"/"+title+".jpg","wb") as f:
f.write(req.content)
#info.txt文件信息获取
#名称,上映年份,导演,主演,作品简介,豆瓣关于这个作品的链接
s='评分:'+item['rate']+'\r\n链接:'+item['url']+"\r\n"+"名称:"+item['title']
s+=soup.select('#info')[0].text
#作品简介
s+=soup.select('#link-report')[0].text
with open(folder+"/info.txt","w") as f:
f.writelines(s)
print(item['title']+'下载完毕')
count+=1
if count>=maxcount:#满足采集的数量退出
break
time.sleep(5)#暂停5s,要不太快会被反扒禁止ip,需要登录系统
time.sleep(2)#暂停2s
if count>=maxcount:#满足采集的数量退出
break
print(type+'处理完毕')
刚刚不是有CSDN专家贴过答案了吗? 难道我看错啦?