本次python实战,主要目标是利用python爬取豆瓣电影 Top 250信息,如上图所示。这些信息主要包括排名、片名、评分、上映时间、主演等信息。爬取的网址url是https://movie.douban.com/top250,爬取后的结果会保存在csv文件里面。
主要分为三个步骤:
1.分析url
2.分析网站数据
3. 爬取数据
1.分析url 豆瓣电影排行榜250的url很好分析: 格式都是这样子的: http://movie.douban.com/top250?start=(page_num)&filter= 并且当start=0,对应的是排名1到25的电影,start=25对应的是排名25到50的电影,以此类推,我们便可以得到所有的url
http://movie.douban.com/top250?start=0&filter= http://movie.douban.com/top250?start=25&filter= http://movie.douban.com/top250?start=50&filter= http://movie.douban.com/top250?start=75&filter= …
链接测试: 除了第一页,我们随便挑选一页,换直接放在浏览器中访问看看,是否与当前的内容一致,如果没有问题,就可以直接用访问链接的方式,使用python的requests库去代替浏览器请求网页的服务器,返回HTML文件,提取并保存信息,再生成下一页的链接,继续上面请求服务器的操作爬取信息。 生成链接: 只需要写一个for循环,生成从0到225的数字即可,从上面的链接可以看出来,它的间隔为25, for page in range(0, 226, 25) 必须要取超过停止数据225,因为255不包含在其中,25是它的公差,程序表示为:
结果为:
基于此,我们甚至不需要从网站中提取url,只需要每次将start=后的数字更换,便可作为新的url使用了. response=urlopen(urljoin(self.url,‘top250?start=’+str(self.page_num*25)+’&filter=’)) 用str将数字转换成字符串,连接到start=后面,再使用urljoin将前后url连接起来,就可以传入urlopen函数中了.
2.分析网站数据
在这一步中,首先我使用了BeautifulSoup将得到的response对象解析
page_bsObj=BeautifulSoup(response,“lxml”)
然后我们就需要查找豆瓣网页源代码来确定如何找到我们所需要的数据,即电影名称.
可发现电影名称都在span标签中,并且该标签还具有class属性.于是我们便可以利用BeautifulSoup的find_all()函数来找到所有具有class属性的span标签,同时BeautifulSoup是从上到下搜索span标签的,因此可以不用担心排名的问题:
movie_items=page_bsObj.find_all(“span”,{“class”:“title”})
然而在这里我们要注意的是,有些电影有两个span标签,即列出了两个title:中文翻译名字和原作名字,而有些电影是国产电影,只列出了一个名字,对于英文名,是在class=other标签中列出的:
打开网页,右击检查元素,找到每个电影模块对应的序列代码,如下图:
将图中右侧鼠标选中的位置的xpath路径复制下来为: /html/body/div[3]/div[1]/div/div[1]/ol/li[1] 1 依次,第二个的xpath路径为: /html/body/div[3]/div[1]/div/div[1]/ol/li[2] 1 第三个的xpath路径为: /html/body/div[3]/div[1]/div/div[1]/ol/li[3] 1 …… 最后一个的xpath路径为: /html/body/div[3]/div[1]/div/div[1]/ol/li[25] 1 由此可发现,它们的xpath路径是有规律的,即最后一个[]中的数字从1开始,增加到25 接下来用语句表示出 html_etree.xpath(’/html/body/div[3]/div[1]/div/div[1]/ol/li[2]’) 1 将语句后的[数字]删除,便可表示所有的xpath路径 即html_etree.xpath(’/html/body/div[3]/div[1]/div/div[1]/ol/li’) 1 此时运行结果为:
len()函数查看返回值的长度 如下图:
25个路径里面,每个路径里面有10个电影影的名字,共250个
1.li=html_etree.xpath(’/html/body/div[3]/div[1]/div/div[1]/ol/li’)
2.for item in li:
3. name=item.xpath(’’)
item为自己命名的,可理解为电影
name理解为电影名字
整个语句可理解为,从25个xpath路径里面获取得250个电影,然后再从这250个电影(item)的xpath路径里面获取250个电影名(name)
现在复制两个电影名的链接进行分析
第一页的肖申克的救赎:
1./html/body/div[3]/div[1]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]
第一页的霸王别姬:
1./html/body/div[3]/div[1]/div/div[1]/ol/li[2]/div/div[2]/div[1]/a/span[1]
可看出,两个链接只有/li[]中的数字不一样
代码表示:
- li=html_etree.xpath(’/html/body/div[3]/div[1]/div/div[1]/ol/li’)
- for item in li:
- .name=item.xpath(’./div/div[2]/div[1]/a/span[1]’)
li 标签前的作为父级,后面的为子集,./ 代替父级的位置,改写为:
1.li = html_etree.xpath(’//*[@id=“content”]/div/div[1]/ol/li’).
2.for item in li:
3.name = item.xpath(’./div/div[2]/div[1]/a/span[1]/text()’)[0]
4.print (name)
结果:
1.肖申克的救赎
2. 霸王别姬
3. 阿甘正传
4. 这个杀手不太冷
5. 美丽人生
6. 泰坦尼克号
7. 千与千寻
8. 辛德勒的名单
9. 盗梦空间
10. 忠犬八公的故事
11. 海上钢琴师
12. 三傻大闹宝莱坞
13. 楚门的世界
14. 机器人总动员
15. 放牛班的春天
16. 星际穿越
17. 大话西游之大圣娶亲
18. 熔炉
19. 疯狂动物城
20. 无间道
21. 龙猫
22. 教父
23. 当幸福来敲门
24. 怦然心动
25. 触不可及