请谨记如下三条命令:
scrapy startproject xxx 创建scrapy项目 scrapy genspider xxx "xxx.com" 创建爬虫spider,名字不能和项目名一样 scrapy crawl xxx 运行某个爬虫项目
首先scrapy startproject douban
建立项目,其次切换到spiders目录下,scrapy genspider douban_movie
建立爬虫。
我们要爬取的数据很简单,是豆瓣电影排行榜。之所以说它简单是因为它请求返回的数据我们可以转换成规整的json列表,并且获取分页链接也很简单。
我们只获得title和url的信息。明确了请求目标后,我们开始编写items
import scrapyclass DoubanItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field()
其次编辑spiders下的爬虫文件
# -*- coding: utf-8 -*-import scrapyfrom douban.items import DoubanItemimport jsonclass DoubanMovieSpider(scrapy.Spider): name = 'douban_movie' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20'] offset = 0 def parse(self, response): item = DoubanItem() content_list = json.loads(response.body.decode()) if (content_list == []): return for content in content_list: item['title'] = content['title'] item['url'] = content['url'] yield item self.offset += 20 url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start='+str(self.offset) + '&limit=20' yield scrapy.Request(url=url,callback=self.parse)
response.body
获得数据是<class 'bytes'>
型,我们需要转换为str型,response.body.decode()
。然后通过json.loads()
将字符串装换成json 列表,列表里的元素其实就是dict型。
然后保存数据,编辑pipelines.py
import jsonclass DoubanPipeline(object): def open_spider(self,spider): self.file = open("douban.json","w") self.num = 0 def process_item(self, item, spider): self.num+=1 content = json.dumps(dict(item),ensure_ascii=False)+'\n' self.file.write(content) return item def close_spider(self,spider): print('一共保存了'+str(self.num)+'条数据') self.file.close()
在运行前需要设置settings.py
#打开这两个注释:USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.15 Safari/537.36' #模拟浏览器ITEM_PIPELINES = { 'douban.pipelines.DoubanPipeline': 300, } #编辑好管道要记得注册管道#ROBOTSTXT_OBEY = True 注释掉robot协议,不然会报错
作者:韵呀
链接:https://www.jianshu.com/p/ac9547e332da