栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python网络爬虫:爬取豆瓣电影 Top 250剧情简介

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python网络爬虫:爬取豆瓣电影 Top 250剧情简介

一、爬取程序基本结构介绍

首先是程序需要调用的库:

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的较后部分,查找的时候需要仔细。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/286274.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号