本节使用 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 莱昂纳多·迪卡普里奥,渡边谦,约瑟夫·高登-莱维特