继续学习scrapy这个好用的框架,而今天要实现的就是使用是scrapy爬取豆瓣电影TOP250榜单上的电影信息。

 

步骤如下:

一、爬取单页信息

首先是建立一个scrapy项目,在文件夹中按住shift然后点击鼠标右键,选择在此处打开命令行窗口,输入以下代码:

scrapy startproject DouBan

然后打开pycharm,再打开我们建立好的DouBan项目,我们这次的目标是爬取榜单上的电影名称,导演主演信息,评分以及一句话短评内容,所以我们在items.py中输入如下代码:

写好了items.py后,再在spiders文件夹下新建一个douban.py文件,输入以下代码:

在start_urls中包含的就是我们要爬取的网页链接,parse方法就是实现解析网页获取我们需要的内容。

由于原网页是一个很明显的表单结构,所以在这里我们选择使用xpath来解析网页,点击想要爬取的元素,右键选择Copy Xpath就可以轻松获得该元素的xpath。

利用xpath可以轻松获得一页上的信息,这些信息都存在一个列表之中,这个时候我们就需要使用前面定义的DouBanItem了,定义一个item为DouBanItem对象,然后将爬取到的每个电影的信息保存在item之中,代码如下:

 

 

二、实现翻页

这样我们就成功爬取了一页的信息,那么我们如何实现翻页呢?

观察网页可以发现点击“后页”时就会跳转到下一页,而“后页”对应的元素之中保存着下一页的部分链接信息,和“https://movie.douban.com/top250”拼凑在一起就构成了下一页的链接,这样我们就可以实现翻页了。而到了最后一页,“后页”对应的元素之中就没有href这个属性了,因此需要加入一个判断来确定是否还有下一页。

实现翻页的代码如下:

 

 三、保存数据

数据都已经爬取下来了,我们应该怎么保存呢?我这次选择把数据保存到一个csv文件中,实现方法如下:

打开settings.py文件,输入一下两行代码

FEED_URI = u"file:///E://douban.csv"
FEED_FORMAT = "CSV"

 

四、添加main.py

由于每次运行scrapy项目都要在命令行中输入scrapy crawl 项目名称,这样会有些麻烦,那么有没有简单点的方法就能运行项目呢?

答案当然是有的,首先是在项目文件夹下新建一个main.py文件,然后在main.py里输入一下代码,再运行main.py,就能轻松运行整个scrapy项目了。

 

 五、douban.py具体代码

 1 import scrapy
 2 from DouBan.items import DouBanItem
 3 
 4 
 5 class DouBan(scrapy.Spider):
 6     name = "DouBan"
 7     start_urls = ["https://movie.douban.com/top250"]
 8 
 9     def parse(self, response):
10         title_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()').extract()
11         human_list = response.xpath(
12             '//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()[1]').extract()
13         score_list = response.xpath(
14             '//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()').extract()
15         info_list = response.xpath(
16             '//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[2]/span/text()').extract()
17 
18         for title, human, score, info in zip(title_list, human_list, score_list, info_list):
19             item = DouBanItem()
20             item["title"] = title.strip()
21             item["human"] = human.strip().replace('\xa0', '').replace('\xee', '').replace('\xf6', ''),
22             item["score"] = score
23             item['info'] = info
24             yield item
25         nextpage = response.xpath('//*[@id="content"]/div/div[1]/div[2]/span[3]/a/@href').extract()
26         if nextpage:
27             yield scrapy.http.Request("https://movie.douban.com/top250" + nextpage[0], callback=self.parse)

 

六、运行结果

版权声明:本文为TM0831原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/TM0831/p/9620450.html