使用python3爬取豆瓣电影top250

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

目标

  • 爬取豆瓣电影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. 单页分析

    • 首先分析原网页代码:
      使用python3爬取豆瓣电影top250_第1张图片
      发现我们所需要的信息都在 li 标签中,所以我们需要定位在li标签中提取信息
      但是,我们又发现:在真正含有我们所需要的信息的li 标签前,还有19个不含我们所需信息的li标签:
      使用python3爬取豆瓣电影top250_第2张图片
      使用python3爬取豆瓣电影top250_第3张图片
      所以,在提取信息的时候需要将前19个 li 标签排除在外
      再对含有我们所需内容的 li 标签进行分析:
      使用python3爬取豆瓣电影top250_第4张图片
      可以看到:影片名为 利用这些信息就可以利用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'}

你可能感兴趣的:(使用python3爬取豆瓣电影top250)