码云地址:https://github.com/xyhcq/top250
模块功能:整合代码,控制是否将信息显示出来。
import requests from bs4 import BeautifulSoup import re import time import sys def getHTMLText(url,k): # 获取网页源代码 try: if(k==0): kw={} else: kw={'start':k,'filter':''} # 保存获取的网页 read = requests.get(url,params=kw,headers={'User-Agent': 'Mozilla/4.0'}) read.raise_for_status() read.encoding = read.apparent_encoding return read.text except: print("获取失败!") def getData(html): # 分析代码信息,提取数据 soup = BeautifulSoup(html, "html.parser") # 找到第一个class属性值为grid_view的ol标签 movieList=soup.find('ol',attrs={'class':'grid_view'}) # 找到所有的li标签 for movieLi in movieList.find_all('li'): # 找到第一个class属性值为hd的div标签 movieHd=movieLi.find('div',attrs={'class':'hd'}) # 找到第一个class属性值为title的span标签 #也可使用.string方法 # 获取电影名字 movieName=movieHd.find('span',attrs={'class':'title'}).getText() if showInfo==1: print movieName else:pass # 写入文件 if writeFile == 1: f.write('电影名:'+movieName.encode('utf-8')+' ') else:pass # 获取电影链接 movieUrl=movieHd.find('a class="" href="') if showInfo==1: print movieUrl else:pass # 写入文件 if writeFile == 1: f.write('链接:'+str(movieUrl)+' ') else:pass # 获取电影导演/演员 movieBd = movieLi.find('div', attrs={'class': 'bd'}) movieSF=movieBd.find('p',attrs={'class':''}).getText() if showInfo==1: print movieSF else:pass # 写入文件 if writeFile == 1: f.write('Staff:'+movieSF.encode('utf-8')+' ') else:pass # 获取电影的评分 movieScore=movieLi.find('span',attrs={'class':'rating_num'}).getText() if showInfo==1: print movieScore else:pass # 写入文件 if writeFile == 1: f.write('评分:'+movieScore.encode('utf-8')+' ') else:pass #获取电影的评论数 movieEval=movieLi.find('div',attrs={'class':'star'}) movieEvalNum=re.findall(r'd+',str(movieEval))[-1] if showInfo==1: print movieEvalNum else:pass # 写入文件 if writeFile == 1: f.write('评论数:'+movieEvalNum.encode('utf-8')+' ') else:pass # 获取电影短评 movieQuote = movieLi.find('span', attrs={'class': 'inq'}) # 有的电影没有短评,为防止报错,加次 if(movieQuote): if showInfo==1: print movieQuote.getText() else:pass # 写入文件 if writeFile == 1: f.write('短评:'+movieQuote.getText().encode('utf-8')+' ') else:pass else: # 写入文件 if writeFile == 1: f.write('短评:'+"这个电影没有短评"+' ') else:pass #print '=================================================================' # 本次抓取的网址 basicUrl='https://movie.douban.com/top250' k=0 i=1 # 一些自定义功能开关,1开启,0关闭 # 控制台输出抓取结果 showInfo = 1 # 写入文件开关 writeFile = 1 # 打开文件 f=open("top250.txt","w") f.write('豆瓣top250信息爬取,by forward团队'+' '+'爬取结果:'+' ') showInfo=raw_input('是否需要在窗口显示结果,是为1,否为0,默认值为1:') if showInfo != '1': showInfo=0 else : showInfo =1 writeFile=raw_input('是否需要将结果输出到文件,是为1,否为0,默认值为1:') if writeFile != '1': writeFile=0 else : writeFile=1 print '===============================魔法开始===============================' while k<=225: html=getHTMLText(basicUrl,k) time.sleep(2) k+=25 getData(html) print '-------第'+str(i)+'轮完成!-------' i+=1 f.write(' '+'爬取完成!') # 关闭文件,否则容易写入不全 f.close() print '完成!'