Python开发简单爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据
Posted 小杜同学的嘚啵嘚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python开发简单爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据相关的知识,希望对你有一定的参考价值。
所谓静态页面是指纯粹的HTML格式的页面,这样的页面在浏览器中展示的内容都在HTML源码中。
目标:爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/top250
1)确定目标网站的请求头:
打开目标网站,在网页空白处点击鼠标右键,选择“检查”。(小编使用的是谷歌浏览器)。
点击“network”,在弹出页面若长时间没有数据显示,则试一下F5刷新。
可以得到目标网页中Host和User-Agent两项。
2)找到爬取目标数据(即电影名称)在页面中的位置
右键“检查”,选择“Elements”。
或者直接找到一个电影名称,比如《肖申克的救赎》,对它右键,选择“检查”。
3)相关代码:
import requests from bs4 import BeautifulSoup def get_movies(): headers={ \'user-agent\':\'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\', \'Host\':\'movie.douban.com\' } #定义爬取目标网页的请求头,务必和我们前面通过‘检查’到的请求头一致 movie_list=[] for i in range(0,10): #目标所包含的250项数据分布在10页之中 link=\'https://movie.douban.com/top250?start=\'+str(i*25) #定义每页的网址 r=requests.get(link,headers=headers,timeout=10) #构建每页中的抓取请求request print (str(i+1),\'页码响应状态码:\',r.status_code) soup=BeautifulSoup(r.text,\'lxml\') #使用BeautifulSoup模块对抓取到的网页内容进行解析 div_list=soup.find_all(\'div\',class_=\'hd\') #将得到的目标电影数据所在的div存储到list中 for each in div_list: movie=each.a.span.text.strip() #获取精确的目标电影数据(即电影名字) movie_list.append(movie) return movie_list movies=get_movies() print(movies)
输出:
1 页码响应状态码: 200 2 页码响应状态码: 200 3 页码响应状态码: 200 4 页码响应状态码: 200 5 页码响应状态码: 200 6 页码响应状态码: 200 7 页码响应状态码: 200 8 页码响应状态码: 200 9 页码响应状态码: 200 10 页码响应状态码: 200 [\'肖申克的救赎\', \'霸王别姬\', \'这个杀手不太冷\', \'阿甘正传\', \'美丽人生\', \'千与千寻\', \'泰坦尼克号\', \'辛德勒的名单\', \'盗梦空间\', \'机器人总动员\', \'海上钢琴师\', \'三傻大闹宝莱坞\', \'忠犬八公的故事\', \'放牛班的春天\', \'大话西游之大圣娶亲\', \'楚门的世界\', \'龙猫\', \'教父\', \'熔炉\', \'星际穿越\', \'乱世佳人\', \'触不可及\', \'无间道\', \'当幸福来敲门\', \'天堂电影院\', \'怦然心动\', \'十二怒汉\', \'搏击俱乐部\', \'少年派的奇幻漂流\', \'鬼子来了\', \'蝙蝠侠:黑暗骑士\', \'指环王3:王者无敌\', \'活着\', \'天空之城\', \'疯狂动物城\', \'罗马假日\', \'大话西游之月光宝盒\', \'飞屋环游记\', \'窃听风暴\', \'两杆大烟枪\', \'飞越疯人院\', \'控方证人\', \'闻香识女人\', \'哈尔的移动城堡\', \'海豚湾\', \'V字仇杀队\', \'辩护人\', \'死亡诗社\', \'教父2\', \'美丽心灵\', \'指环王2:双塔奇兵\', \'指环王1:魔戒再现\', \'情书\', \'饮食男女\', \'摔跤吧!爸爸\', \'美国往事\', \'狮子王\', \'钢琴家\', \'天使爱美丽\', \'七宗罪\', \'素媛\', \'被嫌弃的松子的一生\', \'小鞋子\', \'致命魔术\', \'看不见的客人\', \'音乐之声\', \'勇敢的心\', \'剪刀手爱德华\', \'本杰明·巴顿奇事\', \'低俗小说\', \'西西里的美丽传说\', \'拯救大兵瑞恩\', \'黑客帝国\', \'沉默的羔羊\', \'入殓师\', \'蝴蝶效应\', \'让子弹飞\', \'玛丽和马克思\', \'春光乍泄\', \'大闹天宫\', \'心灵捕手\', \'阳光灿烂的日子\', \'幽灵公主\', \'末代皇帝\', \'第六感\', \'重庆森林\', \'禁闭岛\', \'大鱼\', \'布达佩斯大饭店\', \'狩猎\', \'哈利·波特与魔法石\', \'射雕英雄传之东成西就\', \'致命ID\', \'甜蜜蜜\', \'断背山\', \'一一\', \'告白\', \'猫鼠游戏\', \'阳光姐妹淘\', \'加勒比海盗\', \'上帝之城\', \'摩登时代\', \'穿条纹睡衣的男孩\', \'阿凡达\', \'爱在黎明破晓前\', \'消失的爱人\', \'风之谷\', \'爱在日落黄昏时\', \'侧耳倾听\', \'倩女幽魂\', \'红辣椒\', \'超脱\', \'恐怖直播\', \'萤火虫之墓\', \'驯龙高手\', \'幸福终点站\', \'菊次郎的夏天\', \'小森林 夏秋篇\', \'喜剧之王\', \'岁月神偷\', \'借东西的小人阿莉埃蒂\', \'神偷奶爸\', \'七武士\', \'杀人回忆\', \'海洋\', \'真爱至上\', \'电锯惊魂\', \'贫民窟的百万富翁\', \'谍影重重3\', \'喜宴\', \'东邪西毒\', \'记忆碎片\', \'雨人\', \'怪兽电力公司\', \'疯狂原始人\', \'黑天鹅\', \'英雄本色\', \'燃情岁月\', \'卢旺达饭店\', \'虎口脱险\', \'恋恋笔记本\', \'海边的曼彻斯特\', \'傲慢与偏见\', \'7号房的礼物\', \'哈利·波特与死亡圣器(下)\', \'小森林 冬春篇\', \'萤火之森\', \'完美的世界\', \'教父3\', \'纵横四海\', \'二十二\', \'魂断蓝桥\', \'猜火车\', \'荒蛮故事\', \'穿越时空的少女\', \'玩具总动员3\', \'花样年华\', \'雨中曲\', \'唐伯虎点秋香\', \'超能陆战队\', \'时空恋旅人\', \'我是山姆\', \'蝙蝠侠:黑暗骑士崛起\', \'人工智能\', \'心迷宫\', \'浪潮\', \'冰川时代\', \'香水\', \'朗读者\', \'罗生门\', \'追随\', \'爆裂鼓手\', \'一次别离\', \'撞车\', \'未麻的部屋\', \'可可西里\', \'请以你的名字呼唤我\', \'战争之王\', \'血战钢锯岭\', \'地球上的星星\', \'恐怖游轮\', \'梦之安魂曲\', \'达拉斯买家俱乐部\', \'被解救的姜戈\', \'阿飞正传\', \'牯岭街少年杀人事件\', \'谍影重重\', \'谍影重重2\', \'魔女宅急便\', \'碧海蓝天\', \'忠犬八公物语\', \'惊魂记\', \'头脑特工队\', \'房间\', \'再次出发之纽约遇见你\', \'青蛇\', \'秒速5厘米\', \'哪吒闹海\', \'东京物语\', \'海盗电台\', \'末路狂花\', \'绿里奇迹\', \'终结者2:审判日\', \'源代码\', \'模仿游戏\', \'勇闯夺命岛\', \'新龙门客栈\', \'黑客帝国3:矩阵革命\', \'这个男人来自地球\', \'卡萨布兰卡\', \'一个叫欧维的男人决定去死\', \'城市之光\', \'变脸\', \'荒野生存\', \'迁徙的鸟\', \'你的名字。\', \'E.T. 外星人\', \'初恋这件小事\', \'无耻混蛋\', \'发条橙\', \'美国丽人\', \'黄金三镖客\', \'英国病人\', \'小萝莉的猴神大叔\', \'爱在午夜降临前\', \'燕尾蝶\', \'无人知晓\', \'非常嫌疑犯\', \'叫我第一名\', \'穆赫兰道\', \'疯狂的石头\', \'勇士\', \'无敌破坏王\', \'国王的演讲\', \'步履不停\', \'血钻\', \'上帝也疯狂\', \'彗星来的那一夜\', \'枪火\', \'蓝色大门\', \'大卫·戈尔的一生\', \'遗愿清单\', \'我爱你\', \'千钧一发\', \'荒岛余生\', \'爱·回家\', \'黑鹰坠落\', \'麦兜故事\', \'暖暖内含光\', \'聚焦\']
完成既定目标。
4)进阶拓展
爬取TOP250电影的英文名。
import requests from bs4 import BeautifulSoup def get_movies(): headers={ \'user-agent\':\'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\', \'Host\':\'movie.douban.com\' } movie_list=[] for i in range(0,10): link=\'https://movie.douban.com/top250?start=\'+str(i*25) r=requests.get(link,headers=headers,timeout=10) print (str(i+1),\'页码响应状态码:\',r.status_code) soup=BeautifulSoup(r.text,\'lxml\') div_list=soup.find_all(\'div\',class_=\'hd\') for each in div_list: # movie=each.a.span.text.strip() movie=each.a.contents[3].text.strip() movie=movie[2:] movie_list.append(movie) #print(each.a.contents[3].text.strip()) return movie_list movies=get_movies() print(movies)
注意到更改部分为for循环中的部分。
代码中,
each.a.span只会定位到a标签下第一个span标签的内容。
each.a.contents则会定位到a标签下所有的子标签内容(包括换行符‘\\n’),例如在for循环中添加一句print(each.a.contents),则输出内容为(以“肖申克的救赎一项为例展示”):
[\'\\n\', <span class="title">肖申克的救赎</span>, \'\\n\', <span class="title"> / The Shawshank Redemption</span>, \'\\n\', <span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>, \'\\n\']
即包括换行符“\\n”,所以若用 each.a.contents[0] 定位到的则是开头的换行符,不是我们需要的有价值的信息。
故我们需要的部分的索引应为3(英文名),当我们直接用 movie=each.a.contents[3].text.strip() 进行输出时候,则发现输出的为(以“肖申克的救赎一项为例展示”):
[\'/\\xa0The Shawshank Redemption\',
我们发现在英文名前面有一个“/”(这个是网页页面文本中本来就有的),还有一个“\\xa0”,这个代表不间断空白符
注意:若遇到“\\u3000”,则表示全角的空白符。
参考博客:https://www.cnblogs.com/BlackStorm/p/6359005.html
故需要 movie=movie[2:] 进行截取。
修改后的代码运行结果为:
1 页码响应状态码: 200 2 页码响应状态码: 200 3 页码响应状态码: 200 4 页码响应状态码: 200 5 页码响应状态码: 200 6 页码响应状态码: 200 7 页码响应状态码: 200 8 页码响应状态码: 200 9 页码响应状态码: 200 10 页码响应状态码: 200 [\'The Shawshank Redemption\', \'再见,我的妾 / Farewell My Concubine\', \'Léon\', \'Forrest Gump\', \'La vita è bella\', \'千と千尋の神隠し\', \'Titanic\', "Schindler\'s List", \'Inception\', \'WALL·E\', "La leggenda del pianista sull\'oceano", \'3 Idiots\', "Hachi: A Dog\'s Tale", \'Les choristes\', \'西遊記大結局之仙履奇緣\', \'The Truman Show\', \'となりのトトロ\', \'The Godfather\', \'도가니\', \'Interstellar\', \'Gone with the Wind\', \'Intouchables\', \'無間道\', \'The Pursuit of Happyness\', \'Nuovo Cinema Paradiso\', \'Flipped\', \'12 Angry Men\', \'Fight Club\', \'Life of Pi\', \'Devils on the Doorstep\', \'The Dark Knight\', \'The Lord of the Rings: The Return of the King\', \'人生 / Lifetimes\', \'天空の城ラピュタ\', \'Zootopia\', \'Roman Holiday\', \'西遊記第壹佰零壹回之月光寶盒\', \'Up\', \'Das Leben der Anderen\', \'Lock, Stock and Two Smoking Barrels\', "One Flew Over the Cuckoo\'s Nest", \'Witness for the Prosecution\', \'Scent of a Woman\', \'ハウルの動く城\', \'The Cove\', \'V for Vendetta\', \'변호인\', \'Dead Poets Society\', \'The Godfather: Part Ⅱ\', \'A Beautiful Mind\', \'The Lord of the Rings: The Two Towers\', \'The Lord of the Rings: The Fellowship of the Ring\', \'Love Letter\', \'飲食男女\', \'Dangal\', \'Once Upon a Time in America\', \'The Lion King\', \'The Pianist\', "Le fabuleux destin d\'Amélie Poulain", \'Se7en\', \'소원\', \'嫌われ松子の一生\', \'بچههای آسمان\', \'The Prestige\', \'Contratiempo\', \'The Sound of Music\', \'Braveheart\', \'Edward Scissorhands\', \'The Curious Case of Benjamin Button\', \'Pulp Fiction\', \'Malèna\', \'Saving Private Ryan\', \'The Matrix\', \'The Silence of the Lambs\', \'おくりびと\', \'The Butterfly Effect\', \'让子弹飞一会儿 / 火烧云\', \'Mary and Max分享一个爬虫框架