首先是程序需要调用的库:
import requests import bs4 import os
然后写一个函数用于解析网页HTML:
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31'} def getUrl(url): r = requests.get(url, headers=headers) r.encoding = r.apparent_encoding r.raise_for_status() return r.text
之后就是程序的主要部分了:
打开豆瓣,进入豆瓣电影 Top 250页面,下滑到最末端可以发现每一个页面最多排列出25部电影,其余电影需要通过翻页才能看到,在点击页数翻页时,可以注意到随着每个页面的转换,网页的URL也随着有规律的变化,例如:
第一页:https://movie.douban.com/top250
第五页:https://movie.douban.com/top250?start=100&filter=
发现每个页面URL是由第一页链接后加入“?start=n&filter”构成的,因此可以有两种方法来实现获得所有页面URL的目的:
1.按规律直接构造出URL链接。
2.解析网页HTML结构,爬取URL后缀。
本文采取第二种方法来获取开始每个页面的URL链接。
def homepage(): URL = 'https://movie.douban.com/top250' html = getUrl(URL) bf = bs4.BeautifulSoup(html, 'html.parser') temp = bf.find('div', attrs = {'class': 'paginator'}) tempList = temp.find_all('a') # print(tempList) linkList = ['https://movie.douban.com/top250'] for list in tempList: link=list.get('href') # print(link) url = 'https://movie.douban.com/top250'+link linkList.append(url) return linkList#获取第1-10页面链接
在获得每一页的URL之后,我们就解决了程序的翻页功能,之后就是进入每一个页面,分别爬取每一部电影剧情简介的URL,并将它们保存下来。这一部分程序的结构与上一部分大致相似。
def partpage(parturl): html = getUrl(parturl) bf = bs4.BeautifulSoup(html, 'html.parser') temp = bf.find_all('div', attrs = {'class': 'hd'}) linkList = [] for list in temp: tempList=list.find('a', attrs = {'class': ''}) link = tempList.get('href') # print(link) linkList.append(link) return linkList
到此为止,程序实现了进入每一个电影剧情简介的功能,之后我们就可以开始爬取每一部电影的剧情简介信息了。
def movie(movieurl): bf = bs4.BeautifulSoup(movieurl, 'html.parser') #获取标题 temp1=bf.find_all('div', id='content') title='' for TITLE in temp1: Title1=TITLE.find('h1').find('span',property='v:itemreviewed') title+=Title1.text Title2=TITLE.find('h1').find('span',class_='year') title+=Title2.text # print(title) temp2=bf.find_all('div', class_='related-info') synopsis_title='' synopsis='' for Synopsis in temp2: #XX剧情简介 tp=Synopsis.find('i',class_='') synopsis_title+=tp.text #剧情简介内容 tn = Synopsis.find('div', class_='indent') synopsis+=tn.text.replace(' ','') return title,synopsis_title+synopsis
通过以上步骤,我们成功将每一部电影的标题和剧情简介保存了下来,接下来就需要将它们存储下来,形成一个个txt文本。
#存储到程序所在地址路径下命名为path的filename.txt文本中 def saveFile(content,path,filename): if not os.path.exists(path): os.makedirs(path) with open(path+filename, 'w', encoding='utf-8') as f: f.write(content)
存储方式也写好了,接下来就可以实现电影简介的爬取与存储了:
def download(): HomePageUrl = homepage() for HomePage in HomePageUrl: AttachedPageUrl = partpage(HomePage) for AttachedPage in AttachedPageUrl: html = getUrl(AttachedPage) title,content = movie(html) content='\n'+content path = 'TOP250/' fileName = title + '.txt' # 保存文件 saveFile(title+content, path,fileName)
最后运行一下:
if __name__ == '__main__': download()
程序结束。
1.有的剧情简介需要点击“展开全部”才能看到完整内容,所以在HTML文本对应的剧情简介的标签中,有的电影包含不完整的剧情简介,在此没有对它进行处理,所以爬取出的文本中,有的电影简介会出现不完整的和完整的两部分内容。
2.程序中需要查找的页码链接后缀和完整剧情简介的标签在每一个网页HTML的较后部分,查找的时候需要仔细。