爬虫练习之爬取豆瓣电影TOP250的电影名称

首先感谢【小甲鱼】极客Python之效率革命。讲的很好,通俗易懂,适合入门。

感兴趣的朋友可以访问https://fishc.com.cn/forum-319-1.html来支持小甲鱼。谢谢大家。
话不多说。直接上代码。
豆瓣TOP250电影第一页链接 https://movie.douban.com/top250?start=0&filter=
第10页链接 https://movie.douban.com/top250?start=225&filter=
我们分析该地址,很快就能找到规律:

  • https:// 代表资源传输协议使用https协议;
  • movie.douban.com/top250 是豆瓣的二级域名,指向豆瓣服务器;
  • /top250 是服务器的某个资源;
  • start=0&filter= 是该URL的两个参数,分别代表开始位置和过滤条件。(最主要是这个)

先来一个只爬取TOP250电影名字的爬虫,在控制台打印输出(注意class后面别忘了有一个下划线,另外可以学习下分页url的写法):

import requests
import bs4

initrequesturl = "https://movie.douban.com/top250?start={}&filter="
urls = (initrequesturl.format(x) for x in range(0, 226, 25))
x = 0
for url in urls:
    res = requests.get(url)
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    targets = soup.find_all("div", class_="hd")
    for each in targets:
        print(each.a.span.text)

输出:

肖申克的救赎
霸王别姬
这个杀手不太冷
阿甘正传
美丽人生
千与千寻
泰坦尼克号
辛德勒的名单
盗梦空间
忠犬八公的故事
机器人总动员
三傻大闹宝莱坞
放牛班的春天
海上钢琴师
楚门的世界
大话西游之大圣娶亲
星际穿越
龙猫
熔炉
教父
无间道
疯狂动物城
当幸福来敲门
怦然心动
触不可及
蝙蝠侠:黑暗骑士
乱世佳人
活着
控方证人
少年派的奇幻漂流
指环王3:王者无敌
摔跤吧!爸爸
天空之城
鬼子来了
十二怒汉
天堂电影院
飞屋环游记
大话西游之月光宝盒
哈尔的移动城堡
搏击俱乐部
罗马假日
末代皇帝
寻梦环游记
闻香识女人
辩护人
素媛
窃听风暴
死亡诗社
两杆大烟枪
飞越疯人院
指环王2:双塔奇兵
教父2
指环王1:魔戒再现
狮子王
V字仇杀队
美丽心灵
饮食男女
海豚湾
情书
何以为家
钢琴家
大闹天宫
本杰明·巴顿奇事
哈利·波特与魔法石
看不见的客人
黑客帝国
西西里的美丽传说
小鞋子
美国往事
拯救大兵瑞恩
让子弹飞
音乐之声
致命魔术
猫鼠游戏
七宗罪
被嫌弃的松子的一生
低俗小说
沉默的羔羊
蝴蝶效应
春光乍泄
勇敢的心
天使爱美丽
穿条纹睡衣的男孩
剪刀手爱德华
心灵捕手
禁闭岛
布达佩斯大饭店
阿凡达
入殓师
幽灵公主
加勒比海盗
摩登时代
致命ID
断背山
阳光灿烂的日子
重庆森林
第六感
狩猎
喜剧之王
玛丽和马克思
消失的爱人
告白
小森林 夏秋篇
大鱼
一一
阳光姐妹淘
爱在黎明破晓前
请以你的名字呼唤我
射雕英雄传之东成西就
甜蜜蜜
侧耳倾听
红辣椒
驯龙高手
倩女幽魂
超脱
杀人回忆
海蒂和爷爷
恐怖直播
菊次郎的夏天
爱在日落黄昏时
7号房的礼物
小森林 冬春篇
风之谷
哈利·波特与死亡圣器(下)
我不是药神
幸福终点站
蝙蝠侠:黑暗骑士崛起
上帝之城
萤火之森
借东西的小人阿莉埃蒂
超能陆战队
唐伯虎点秋香
神偷奶爸
无人知晓
怪兽电力公司
电锯惊魂
岁月神偷
玩具总动员3
血战钢锯岭
谍影重重3
疯狂原始人
七武士
英雄本色
喜宴
真爱至上
萤火虫之墓
东邪西毒
傲慢与偏见
时空恋旅人
贫民窟的百万富翁
黑天鹅
记忆碎片
心迷宫
纵横四海
教父3
荒蛮故事
完美的世界
达拉斯买家俱乐部
雨人
三块广告牌
花样年华
被解救的姜戈
卢旺达饭店
你的名字。
海边的曼彻斯特
我是山姆
头脑特工队
你看起来好像很好吃
恋恋笔记本
哪吒闹海
无敌破坏王
虎口脱险
冰川时代
二十二
海洋
雨中曲
爆裂鼓手
未麻的部屋
模仿游戏
一个叫欧维的男人决定去死
忠犬八公物语
燃情岁月
人工智能
魔女宅急便
房间
穿越时空的少女
天书奇谭
恐怖游轮
魂断蓝桥
黑客帝国3:矩阵革命
海街日记
猜火车
罗生门
完美陌生人
阿飞正传
头号玩家
香水
功夫
可可西里
朗读者
谍影重重2
浪潮
牯岭街少年杀人事件
谍影重重
战争之王
地球上的星星
疯狂的石头
初恋这件小事
青蛇
惊魂记
终结者2:审判日
源代码
爱在午夜降临前
步履不停
新龙门客栈
奇迹男孩
小萝莉的猴神大叔
追随
一次别离
无耻混蛋
再次出发之纽约遇见你
釜山行
血钻
东京物语
撞车
彗星来的那一夜
城市之光
2001太空漫游
梦之安魂曲
新世界
绿里奇迹
疯狂的麦克斯4:狂暴之路
聚焦
E.T. 外星人
这个男人来自地球
末路狂花
黑鹰坠落
发条橙
遗愿清单
变脸
勇闯夺命岛
国王的演讲
我爱你
黄金三镖客
千钧一发
非常嫌疑犯
秒速5厘米
驴得水
卡萨布兰卡
四个春天

哈哈搞定!

最后附上小甲鱼完整的代码:

import requests
import bs4
import re


def open_url(url):
    # 使用代理
    # proxies = {
    #     "http": "127.0.0.1:1080",
    #     "https": "127.0.0.1:1080"
    # }
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
    }
    # res = requests.get(url, headers=headers, proxies=proxies)
    res = requests.get(url, headers=headers)
    return res


def find_movies(res):
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    # 电影名
    movies = []
    targets = soup.find_all("div", class_="hd")
    for each in targets:
        movies.append(each.a.span.text)
    # 评分
    ranks = []
    targets = soup.find_all("span", class_="rating_num")
    for each in targets:
        ranks.append(' 评分:%s' % each.text)
    # 资料
    messages = []
    targets = soup.find_all("div", class_="bd")
    for each in targets:
        try:
            messages.append(each.p.text.split('\n')[1].strip() + each.p.text.split('\n')[2].strip())
        except:
            continue

    result = []
    length = len(movies)
    for i in range(length):
        result.append(movies[i] + ranks[i] + messages[i] + '\n')
    return result


# 找出一共有多少个页面
def find_depth(res):
    soup = bs4.BeautifulSoup(res.text, "html.parser")
    depth = soup.find('span', class_='next').previous_sibling.previous_sibling
    print(depth)
    return int(depth)


def main():
    host = "https://movie.douban.com/top250"
    res = open_url(host)
    depth = find_depth(res)

    result = []
    for i in range(depth):
        url = host + '/?start=' + str(25 * i) + '&filter='
        res = open_url(url)
        result.extend(find_movies(res))

    with open('豆瓣TOP250电影.txt', 'w', encoding="utf-8") as f:
        for each in result:
            f.write(each)


if __name__ == "__main__":
    main()

输出:


豆瓣TOP250电影.png

PS:如果爬虫有问题,可以尝试使用代理的方式,或者在爬取某一页后sleep几秒。不过目前代理IP基本上都要收费了。可以去某些网站上注册会送一些试用的代理IP,效果还不错。

推荐阅读更多精彩内容