【Python3爬虫】Scrapy爬取豆瓣电影TOP250
继续学习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)