300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【python教程入门学习】Python爬虫抓取猫眼电影排行榜

【python教程入门学习】Python爬虫抓取猫眼电影排行榜

时间:2018-08-30 10:03:14

相关推荐

【python教程入门学习】Python爬虫抓取猫眼电影排行榜

本节使用 Python 爬虫抓取猫眼电影网 TOP100 排行榜(/board/4)影片信息,包括电影名称、上映时间、主演信息。

在开始编写程序之前,首先要确定页面类型(静态页面或动态页面),其次找出页面的 url 规律,最后通过分析网页元素结构来确定正则表达式,从而提取网页信息。

确定页面类型

点击右键查看页面源码,确定要抓取的数据是否存在于页面内。通过浏览得知要抓取的信息全部存在于源码内,因此该页面输属于静态页面。如下所示:

<p class="name"><a href="/films/186" title="我不是药神" data-act="boarditem-click" data-val="{movieId:186}">我不是药神</a></p><p class="star">主演:徐峥,周一围,王传君</p>

上映时间:-07-05

确定url规律

想要确定 url 规律,需要您多浏览几个页面,然后才可以总结出 url 规律,如下所示:

第一页:/board/4?offset=0

第二页:/board/4?offset=10

第三页:/board/4?offset=20

第n页:/board/4?offset=(n-1)*10

确定正则表达式

通过分析网页元素结构来确定正则表达式,如下所示:

<p class="name"><a href="/films/186" title="我不是药神" data-act="boarditem-click" data-val="{movieId:186}">我不是药神</a></p><p class="star">主演:徐峥,周一围,王传君</p>

上映时间:-07-05

使用 Chrome 开发者调试工具来精准定位要抓取信息的元素结构。之所以这样做,是因为这能避免正则表达式的冗余,提高编写正则表达式的速度。正则表达式如下所示:

.*?title="(.*?)".*?class="star">(.*?).*?releasetime">(.*?)

编写正则表达式时将需要提取的信息使用(.*?)代替,而不需要的内容(包括元素标签)使用.*?代替。

编写爬虫程序

下面使用面向对象的方法编写爬虫程序,主要编写四个函数,分别是请求函数、解析函数、保存数据函数、主函数。

1. from urllib import request2. import re3. import time4. import random5. import csv6. from ua_info import ua_list7. # 定义一个爬虫类8. class MaoyanSpider(object): 9. # 初始化10. # 定义初始页面url11. def __init__(self):12. self.url = '/board/4?offset={}'13. # 请求函数14. def get_html(self,url):15. headers = {'User-Agent':random.choice(ua_list)}16. req = request.Request(url=url,headers=headers)17. res = request.urlopen(req)18. html = res.read().decode()19. # 直接调用解析函数20. self.parse_html(html)21. # 解析函数22. def parse_html(self,html):23. # 正则表达式24. re_bds = '<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)25. </p>.*?class="releasetime">(.*?)</p>'26. # 生成正则表达式对象27. pattern = pile(re_bds,re.S)28. # r_list: [('我不是药神','徐峥,周一围,王传君','-07-05'),...] 列表元组29. r_list = pattern.findall(html)30. self.save_html(r_list)31. # 保存数据函数,使用python内置csv模块32. def save_html(self,r_list):33. #生成文件对象 34. with open('maoyan.csv','a',newline='',encoding="utf-8") as f:35. #生成csv操作对象36. writer = csv.writer(f)37. #整理数据38. for r in r_list:39. name = r[0].strip()40. star = r[1].strip()[3:]41. # 上映时间:-07-0542. # 切片截取时间43. time = r[2].strip()[5:15]44. L = [name,star,time]45. # 写入csv文件46. writer.writerow(L)47. print(name,time,star)48. # 主函数49. def run(self):50. #抓取第一页数据51. for offset in range(0,11,10):52. url = self.url.format(offset)53. self.get_html(url)54. #生成1-2之间的浮点数55. time.sleep(random.uniform(1,2))56. # 以脚本方式启动57. if __name__ == '__main__':58. #捕捉异常错误59. try:60. spider = MaoyanSpider()61. spider.run()62. except Exception as e:63. print("错误:",e)</pre>

输出结果:

我不是药神 -07-05 徐峥,周一围,王传君

肖申克的救赎 1994-09-10 蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿

绿皮书 -03-01 维果·莫腾森,马赫沙拉·阿里,琳达·卡德里尼

海上钢琴师 -11-15 蒂姆·罗斯,比尔·努恩,克兰伦斯·威廉姆斯三世

小偷家族 -08-03 中川雅也,安藤樱,松冈茉优

霸王别姬 1993-07-26 张国荣,张丰毅,巩俐

哪吒之魔童降世 -07-26 吕艳婷,囧森瑟夫,瀚墨

美丽人生 -01-03 罗伯托·贝尼尼,朱斯蒂诺·杜拉诺,赛尔乔·比尼·布斯特里克

这个杀手不太冷 1994-09-14 让·雷诺,加里·奥德曼,娜塔莉·波特曼

盗梦空间 -09-01 莱昂纳多·迪卡普里奥,渡边谦,约瑟夫·高登-莱维特

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。