前言:
上篇文章使用Scrapy框架简单爬取并下载了某瓣Top250首页的排名前25个电影的电影名。
太寒酸了,这篇文章咱就来仔细搞一搞,搞到更加详细的信息!!!
目录:
- 1.分析
- 2.使用scrapy shell提取电影详细信息
- 2.1 终端进入scrapy shell交互式界面命令:
- 2.2 首先,确认下最开始的分析是否正确(每个电影的信息都藏在class属性值为info的div中)
- 2.3 分析如何获取到电影名字
- 2.3.1 首先尝试获取第一个电影名字。结合源码使用xpath匹配:
- 2.2 一个电影名字获取成功,使用循环尝试能否成功获取到25个电影名字:
- 2.4 分析如何获取到电影主演
- 2.5 分析如何获取电影的评分:
- 2.5.1 首先,尝试获取第一个电影的评分。结合源码使用xpath匹配:
- 2.5.2 一个电影的评分获取成功,使用循环尝试能否成功获取总得25个电影的评分:
- 2.6 总结:
1.分析
我们知道提取的数据是在spider爬虫文件里的parse函数下进行解析的!
(这个parse函数本来就是来解析和提取数据的!!!)
- 那么,既然我们要获取更加详细的信息,我们就要来分析网页源码:(经过简单观察之后,我们发现,这25个电影各自的所有信息都分别放在了class属性值为info的div标签里,那么,我们提取出这些电影信息的话,就要首先提取到这些特定的div标签,然后再对这些个div标签进行操作即可!)
网页源码剖析:
<div class="info">
<div class="hd">
<a href="https://迫不得已打码/subject/1292052/" class="">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994 / 美国 / 犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.7</span>
<span property="v:best" content="10.0"></span>
<span>1983356人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
2.使用scrapy shell提取电影详细信息
既然要分析如何分别匹配到各个电影的详细的信息,那么我们就考虑使用scrapy shell来十分方便快捷的进行各种尝试
2.1 终端进入scrapy shell交互式界面命令:
scrapy shell 还是上篇的start_urls
2.2 首先,确认下最开始的分析是否正确(每个电影的信息都藏在class属性值为info的div中)
这就说明咱的分析是没得错的!
2.3 分析如何获取到电影名字
2.3.1 首先尝试获取第一个电影名字。结合源码使用xpath匹配:
2.2 一个电影名字获取成功,使用循环尝试能否成功获取到25个电影名字:
会发现灰常的成功哦!
2.4 分析如何获取到电影主演
① 观察网页源码可知:主演所在的标签里面非常混乱,所以,先尝试匹配出25个电影的主演所在的标签:
- 包含电影主演的标签:
也是非常的成功!!!
②第二步:我们要想办法匹配到每一个电影的主演的名字,但是!观察刚刚匹配到25个电影的包含主演的标签的text信息可知,这里面有坑哦!有些电影不一定有主演:
③所以,咱再匹配这25个电影的主演名字的时候,一定要注意使用判断避坑!(见下:)
if "主" in con_star_name:
star_name=re.findall("主演?:? ?(.*)",con_star_name)[0]
else:
star_name="空"
2.5 分析如何获取电影的评分:
2.5.1 首先,尝试获取第一个电影的评分。结合源码使用xpath匹配:
又是美好的成功哦!
2.5.2 一个电影的评分获取成功,使用循环尝试能否成功获取总得25个电影的评分:
非常的完美!
2.6 总结:
def parse(self, response): #解析和提取数据
# 获取电影信息数据
# films_name=response.xpath('//div[@class="info"]/div/a/span[1]/text()').extract()
node_list=response.xpath('//div[@class="info"]') #25个
for node in node_list:
# 电影名字
film_name=node.xpath('./div/a/span[1]/text()').extract()[0]
# 主演 拿标签内容,再正则表达式匹配
con_star_name=node.xpath('./div/p[1]/text()').extract()[0]
if "主" in con_star_name:
star_name=re.findall("主演?:? ?(.*)",con_star_name)[0]
else:
star_name="空"
#评分
score=node_list.xpath('./div/div/span[@property="v:average"]/text()').extract()[0]