将豆瓣电影Top250爬虫,和下载电影的爬虫结合,获取到所有电影的下载链接
import requests,bs4,time
from urllib.request import quote
text = str()
def movielink(movie):
gbkmovie=movie.encode('gbk')
#将汉字,用gbk格式编码,赋值给gbkmovie
urlmovie = quote(gbkmovie)
try:
#阳光电影是一个小网站,并不稳定,批量执行程序容易报错终止,所以加一个try语句
res =requests.get('http://s.ygdy8.com/plus/so.php?kwtype=0&searchtype=title&keyword='+urlmovie)
bsmovie = bs4.BeautifulSoup(res.text,'html.parser')
link = bsmovie.select('.co_content8 b a')
if len(link)==2:
return '这个电影暂时没有下载资源,不好意思奥~'
else:
finallink = 'http://www.ygdy8.com' + link[0].get('href')
xiazai = requests.get(finallink)
gbkxiazai = xiazai.content.decode('gbk')
bsxiazai = bs4.BeautifulSoup(gbkxiazai,'html.parser')
download = bsxiazai.select('table tbody tr a')
if len(download)==1:
return '电影下载链接:\n'+download[0].get('href')
else:
return '电影下载链接:\n'+'【1】'+download[1].get('href')+'\n【2】'+download[0].get('href')
except:
return '在查找这个电影的下载链接时发生了诡异的报错,所以我推荐你自己寻找它的下载链接。'
def printlist(url):
#爬取网页上的电影名单
global text
#这里,涉及到了一个关于函数的知识点,全局变量和局部变量。你可以搜索这个知识
#这句代码意思是:在函数printlist()内,变量text和函数外的变量text是同个
list = requests.get(url)
bslist = bs4.BeautifulSoup(list.text,'html.parser')
for x in range(25):
#每页有25个电影
movie = bslist.select('.grid_view li')[x]
#查找了当前页面所有的电影,是一个list,list里的第[x]个元素。
bsmovie = bs4.BeautifulSoup(str(movie),'html.parser')
#movie是tag对象,但str(movie)就可以作为字符串了。
num_movie = bsmovie.select('em')
title_movie = bsmovie.select('a .title')
mark_movie = bsmovie.select('.rating_num')
inq_movie = bsmovie.select('.inq')
link_movie = movielink(title_movie[0].getText())
if len(inq_movie) != 0:
text = text+num_movie[0].getText()+'. '+title_movie[0].getText()+'——'+mark_movie[0].getText()+'分\n推荐语:'+inq_movie[0].getText()+'\n'+link_movie+'\n\n'
else:
text = text+num_movie[0].getText()+'. '+title_movie[0].getText()+'——'+mark_movie[0].getText()+'分\n推荐语:'+'\n'+link_movie+'\n\n'
def fanye(num):
#写一个翻页的函数,参数是你想查询的电影总数
page = int(num/25)
#豆瓣电影每页显示25个,所有相除得到页数
#除法得到的结果是浮点数,要用int()转换为整数才能range()
for y in range(page):
url = 'https://movie.douban.com/top250?start='+str(y*25)
#这是电影排行榜网址的组成形式
printlist(url)
#调用printlist函数
time.sleep(2)
#休息两秒钟,防止被反爬虫
num = int(input('你想要输出多少个电影名单?请输入25的整数倍:'))
fanye(num)
#执行爬虫,此时text内有了内容
print(text)