首页 > 编程 > Python > 正文

python爬虫豆瓣近几年的国产好作品

2019-11-08 03:08:17
字体:
来源:转载
供稿:网友

本来是想爬国产电影,但是发现好像不太行,我是按照年份,结果里面什么都有这就比较尴尬了

import requestsimport stringfrom bs4 import BeautifulSoupimport pandasimport timeimport numpy as npimport xlsxwriterimport removie_select=[]#修改请求头文件,避免封iphds=[{'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'},{'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'},{'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'}]def getmovie(str_x):     res=requests.get('https://movie.douban.com/tag/'+str_x+'?start=0&type=T',headers=hds[np.random.randint(0,len(hds))])#GET获取网站资源     res.encoding='utf-8'     soup=BeautifulSoup(res.text, 'html.parser')     #获取一共有多少页数     paginator=soup.select('.article')[0].text     #PRint(paginator)     paginator=soup.select('.paginator a')[-2].text     paginator=int(paginator)     #获取该年所有的电影网页     url='https://movie.douban.com/tag/'+str_x+'?start={}&type=T'     for i in range(0,paginator):          #随机睡眠时间,防止封IP          time.sleep(np.random.rand() * 5)          #um=int(i)          #print('开始进行第'+(um+1)+'页搜索')          movieurl=url.format(i*20)          #随机抓去一个请求头          res1=requests.get(movieurl,headers=hds[np.random.randint(0,len(hds))])          res1.encoding='utf-8'          soup1=BeautifulSoup(res1.text, 'html.parser')          for link in soup1.select('.pl2')[:20]:               #随机睡眠时间,防止封IP               time.sleep(np.random.rand() * 5)               movie = {}               #获取该电影的详情网页               try:                    h2=link.select('a')[0]['href']               except IndexError:                    continue               res2=requests.get(h2)               res2.encoding='utf-8'               soup2=BeautifulSoup(res2.text, 'html.parser')               #获得电影的发行国家/地区               try:                    info = soup2.select('#info')[0]               except IndexError:                    continue               try:                    movie_from=re.findall('(?<=制片国家/地区: ).+?(?=/n)', info.text)[0]               except IndexError:                    continue               #获取该电影的评分               rating_num='0'               try:                    rating_num=link.select('.rating_nums')[0].text               except IndexError:                    continue               #if(movie_from[0]==('中' or '香' or '台')and float(rating_num)>=8.0):               #这个判断是只判断是否评分达到8.0,上面的判断是否为国产的               if(float(rating_num)>=8.0):#满足电影评分达到8.0以上                    #获取电影名称                    try:                         name=soup2.select('#content h1 span')[0].text                    except IndexError:                         continue                    movie['电影评分']=rating_num                    movie['电影名称']=name                    print(name,rating_num)                    movie_select.append(movie)     df=pandas.DataFrame(movie_select)     #保存成Excel文件     df.to_excel(str_x+'高分电视剧/综艺节目/纪录片/电影.xlsx')for x in range(2015,2017):     str_x=str(x)     getmovie(str_x)要是有什么不懂的,我都在必要的位置设置了注释

1.关于被封IP,这个地方我加了一个修改请求头和两个睡眠时间,可以防止封IP,但是豆瓣有API,也就是说,你可以用她的API去爬虫

2.关于爬作品的发行地区,我采取的办法,是一个正则表达式,这样的话就可以找到,因为发行地区那一栏,她没有任何标签,所以比较尴尬


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表