分享

如何使用 Python 爬取豆瓣电影 Top250?

 老马的程序人生 2020-08-17

经过一个多星期的学习,对 python 的语法有了一定了解,马上动手做了一个爬虫,检验学习效果。

这次爬取数据的目标是:豆瓣电影 Top250 中每一部电影的名称、排名、链接、名言 和 评分。

准备工作

  • 运行平台:windows10

  • IDE:PyCharm

  • requests、BeautifulSoup库(使用pip进行安装)

第一步:向服务器发送请求,获得响应

由于豆瓣电影 Top250 上信息均在 html 源码中,故需获取其源码,使用 requests 库。代码如下:

import requests
def get_html(url):
    response = requests.get(url)  # 发送get请求
    if response.status_code == 200:  # 如果服务器响应成功,返回网页源代码
        return response.text
    else:
        print("访问失败")

第二步:对源码进行解析,提取

  1. 单页分析

  • 首先分析原网页代码:

    img01

发现我们所需要的信息都在li标签中,所以我们需要定位。在li标签中提取信息。但是,我们又发现:在真正含有我们所需要的信息的li标签前,还有19个不含我们所需信息的li标签:

img02

img03

所以,在提取信息的时候需要将前19个li标签排除在外,在对含有我们所需内容的li标签进行分析:

可以看到:

  • 影片名为<span class="title"标签的文本内容;

  • 排名为<em 标签的文本内容;

  • 链接是<a 标签中href属性对应的值;

  • 名言为标签<span class="inq" 的文本内容;

  • 评分为<span class="rating_num" property="v:average" 的文本内容;

利用这些信息就可以利用find()函数定位信息,进行提取。

代码如下:

from bs4 import BeautifulSoup
def parse_html(html):
soup = BeautifulSoup(html, 'lxml'# 创建BeautifulSoup对象,使用lxml解析库
items = soup.find_all(name='li')  # 查询名称为li的元素,以列表形式输出
for item in items[19:]:
# 注意这里的[19:],对网页源码分析后发现前19个li标签中并没有我们需要的数据,所以将其排除在外
    yield {
        # 利用find()函数定位我们需要的数据,并作为生成器元素
        'title': item.span.get_text(),    # 影片名
        'index': item.find(name='em').text,   # 影片排名
        'image': item.find(name='a')['href'],        # 影片链接
        'quote': item.find(class_="inq").text,    # 影片名言
        'score': item.find(class_="rating_num").text    # 影片评分
    }  
    # 构造生成器,作为函数的返回结果
    # 获取Tag对象的文本信息有三种方法,.string、.text、.get_text()

以上完成了对豆瓣电影一页源代码的解析,接下来进行多页的解析,将250部电影的信息全部爬取下来:

多页爬取

在换页的时候,我们发现网页的 URL 发生了改变:

  • 第二页的URL:https://movie.douban.com/top250?start=25&filter=

  • 第三页的URL:https://movie.douban.com/top250?start=50&filter=

我们发现,每跳一页,URL中参数start的值就增加25,所以可将start作为偏移量,来定位每一页网址。

代码如下:

# 解析源码
def main(start):
    url = 'https://movie.douban.com/top250?start=' + str(start) + '&filter'  # 定位top250的url
    html = get_html(url)  # 获取源码
    for item in parse_html(html):
        print(item)

 if __name__ == '__main__':
     for page in range(10):
         main(page * 25)   # 遍历10页,250部电影

将爬取到的信息写入txt文件:

定义如下函数,实现将数据写入txt文件的操作

def write_to_file(content):
    with open("movies.txt"'a', encoding='utf-8'as file:  #以追加的权限打开文件movies.txt
        file.write(json.dumps(content, ensure_ascii=False) + '\n')  # ensure_ascii设为False,保证输出是中文形式,而不是ASCII编码
        # json.dumps()序列化时默认对中文使用ascii编码

这样就实现了豆瓣电影top250的爬取。

全部代码:

# 爬取豆瓣top250
import requests
import json
from bs4 import BeautifulSoup

# 获取源码
def get_html(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    else:
        print("访问失败")

# 解析源码
def parse_html(html):
    soup = BeautifulSoup(html, 'lxml'# 创建BeautifulSoup对象,使用lxml解析库
    items = soup.find_all(name='li')  # 查询名称为li的元素,以列表形式输出
    for item in items[19:]:
    # 注意这里的[19:],对网页源码分析后发现前19个li标签中并没有我们需要的数据,所以将其排除在外
        yield {
            # 利用find()定位我们需要的数据,并作为生成器元素
            'title': item.span.get_text(),
            'index': item.find(name='em').text,
            'image': item.find(name='a')['href'],
            'quote': item.find(class_="inq").text,
            'score': item.find(class_="rating_num").text
        }
        # 构造生成器,作为函数的返回结果

# 将数据转化为json字符串并写入到文件中
def write_to_file(content):
    with open("movies.txt"'a', encoding='utf-8'as file:  # 以追加的权限打开文件movies.txt
        file.write(json.dumps(content, ensure_ascii=False) + '\n')  # ensure_ascii设为False,保证输出是中文形式,而不是ASCII编码
        # json.dumps()序列化时默认对中文使用ascii编码

def main(start):
    url = 'https://movie.douban.com/top250?start=' + str(start) + '&filter'  # 定位top250的url
    html = get_html(url)
    for item in parse_html(html):
        print(item)
        write_to_file(item)

# 执行函数,完成爬取
if __name__ == '__main__':
    for i in range(10):
        main(i * 25)

从中的感觉就是,基本的语法、函数的使用是比较简单的;关键之处在于对网页源码的分析,找到合适的提取信息的方式。

输出结果

{'title''肖申克的救赎''index''1''image''https://movie.douban.com/subject/1292052/''quote''希望让人自由。''score''9.6'}
{'title''霸王别姬''index''2''image''https://movie.douban.com/subject/1291546/''quote''风华绝代。''score''9.6'}
{'title''这个杀手不太冷''index''3''image''https://movie.douban.com/subject/1295644/''quote''怪蜀黍和小萝莉不得不说的故事。''score''9.4'}
{'title''阿甘正传''index''4''image''https://movie.douban.com/subject/1292720/''quote''一部美国近现代史。''score''9.4'}
{'title''美丽人生''index''5''image''https://movie.douban.com/subject/1292063/''quote''最美的谎言。''score''9.5'}
{'title''泰坦尼克号''index''6''image''https://movie.douban.com/subject/1292722/''quote''失去的才是永恒的。 ''score''9.3'}
{'title''千与千寻''index''7''image''https://movie.douban.com/subject/1291561/''quote''最好的宫崎骏,最好的久石让。 ''score''9.3'}
{'title''辛德勒的名单''index''8''image''https://movie.douban.com/subject/1295124/''quote''拯救一个人,就是拯救整个世界。''score''9.4'}
{'title''盗梦空间''index''9''image''https://movie.douban.com/subject/3541415/''quote''诺兰给了我们一场无法盗取的梦。''score''9.3'}
{'title''机器人总动员''index''10''image''https://movie.douban.com/subject/2131459/''quote''小瓦力,大人生。''score''9.3'}
{'title''忠犬八公的故事''index''11''image''https://movie.douban.com/subject/3011091/''quote''永远都不能忘记你所爱的人。''score''9.3'}
{'title''三傻大闹宝莱坞''index''12''image''https://movie.douban.com/subject/3793023/''quote''英俊版憨豆,高情商版谢耳朵。''score''9.2'}
{'title''海上钢琴师''index''13''image''https://movie.douban.com/subject/1292001/''quote''每个人都要走一条自己坚定了的路,就算是粉身碎骨。 ''score''9.2'}
{'title''放牛班的春天''index''14''image''https://movie.douban.com/subject/1291549/''quote''天籁一般的童声,是最接近上帝的存在。 ''score''9.2'}
{'title''大话西游之大圣娶亲''index''15''image''https://movie.douban.com/subject/1292213/''quote''一生所爱。''score''9.2'}
{'title''楚门的世界''index''16''image''https://movie.douban.com/subject/1292064/''quote''如果再也不能见到你,祝你早安,午安,晚安。''score''9.2'}
{'title''教父''index''17''image''https://movie.douban.com/subject/1291841/''quote''千万不要记恨你的对手,这样会让你失去理智。''score''9.2'}
{'title''龙猫''index''18''image''https://movie.douban.com/subject/1291560/''quote''人人心中都有个龙猫,童年就永远不会消失。''score''9.1'}
{'title''星际穿越''index''19''image''https://movie.douban.com/subject/1889243/''quote''爱是一种力量,让我们超越时空感知它的存在。''score''9.2'}
{'title''熔炉''index''20''image''https://movie.douban.com/subject/5912992/''quote''我们一路奋战不是为了改变世界,而是为了不让世界改变我们。''score''9.2'}
.......
.......
{'title''荒野生存''index''230''image''https://movie.douban.com/subject/1905462/''quote''出门必备:本草纲目。''score''8.6'}
{'title''英国病人''index''231''image''https://movie.douban.com/subject/1291853/''quote''In memory, love lives forever...''score''8.5'}
{'title''血钻''index''232''image''https://movie.douban.com/subject/1428175/''quote''每个美丽事物背后都是滴血的现实。''score''8.5'}
{'title''聚焦''index''233''image''https://movie.douban.com/subject/25954475/''quote''新闻人的理性求真。''score''8.8'}
{'title''国王的演讲''index''234''image''https://movie.douban.com/subject/4023638/''quote''皇上无话儿。''score''8.3'}
{'title''迁徙的鸟''index''235''image''https://movie.douban.com/subject/1292281/''quote''最美的飞翔。''score''9.1'}
{'title''非常嫌疑犯''index''236''image''https://movie.douban.com/subject/1292214/''quote''我不信仰上帝,但我敬畏上帝。''score''8.6'}
{'title''勇士''index''237''image''https://movie.douban.com/subject/3217169/''quote''热血沸腾,相当完美的娱乐拳击大餐。''score''8.9'}
{'title''燕尾蝶''index''238''image''https://movie.douban.com/subject/1307793/''quote''现实与童话交相辉映的旅程。''score''8.6'}
{'title''黑鹰坠落''index''239''image''https://movie.douban.com/subject/1291824/''quote''还原真实而残酷的战争。''score''8.6'}
{'title''遗愿清单''index''240''image''https://movie.douban.com/subject/1867345/''quote''用剩余不多的时间,去燃烧整个生命。''score''8.5'}
{'title''穆赫兰道''index''241''image''https://movie.douban.com/subject/1292217/''quote''大卫·林奇的梦境迷宫。''score''8.3'}
{'title''我爱你''index''242''image''https://movie.douban.com/subject/5908478/''quote''你要相信,这世上真的有爱存在,不管在什么年纪 ''score''9.0'}
{'title''叫我第一名''index''243''image''https://movie.douban.com/subject/4798888/''quote''乐观比一切都有力量。''score''8.6'}
{'title''枪火''index''244''image''https://movie.douban.com/subject/1300741/''quote''一群演技精湛的戏骨,奉献出一个精致的黑帮小品,成就杜琪峰群戏的巅峰之作。''score''8.6'}
{'title''荒岛余生''index''245''image''https://movie.douban.com/subject/1298653/''quote''一个人的独角戏。''score''8.5'}
{'title''2001太空漫游''index''246''image''https://movie.douban.com/subject/1292226/''quote''现代科幻电影的开山之作,最伟大导演的最伟大影片。''score''8.7'}
{'title''上帝也疯狂''index''247''image''https://movie.douban.com/subject/1297478/''quote''纯净原始的笑与感动。''score''8.6'}
{'title''千钧一发''index''248''image''https://movie.douban.com/subject/1300117/''quote''一部能引人思考的科幻励志片。''score''8.7'}
{'title''大卫·戈尔的一生''index''249''image''https://movie.douban.com/subject/1305725/''quote''捍卫人权只是信仰,一点不妨碍其行为的残忍。''score''8.6'}
{'title''蓝色大门''index''250''image''https://movie.douban.com/subject/1308575/''quote''青春的窃窃私语。 ''score''8.3'}

是不是很有趣,好了今天就到这里吧!See You!

本篇图文由团队 郭维强 同学提供,他的 CSDN Blog 地址为:

https://blog.csdn.net/qq_43271202


经过8年多的发展,LSGO软件技术团队在地理信息系统、数据统计分析、计算机视觉领域积累了丰富的研发经验,也建立了人才培养的完备体系。

  • 欢迎对算法设计与实现感兴趣的同学加入,与我们共同成长进步。

  • 团队寻求论文合作,我们可以辅助对方构建模型,验证算法。

  • 团队寻求项目合作,我们可以辅助对方搭建软件系统。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多