创建一个Scrapy项目,并将其命名为“demo”
scrapy startproject demo cd demo
稍等片刻后,Scrapy为我们生成了一个目录结构:
其中,我们目前需要重点关注三个文件:
项目已经创建完成了,为了指导接下来的开发,我们必须明确Scrapy爬虫的四个步骤:
所以,接下来我们需要明确目标。
以我的博客网站为例,爬取文章的关键信息(标题、摘要、上传时间、阅读数量)
打开 demo 目录下的 items.py。
Item 定义结构化数据字段,用来保存爬取到的数据,有点像 Python 中的 dict,但是提供了一些额外的保护来减少错误。
可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个 Item(可以理解成类似于 ORM 的映射关系)。
正如下面这样:
import scrapy class DemoItem(scrapy.Item): # define the fields for your item here like: postTitle = scrapy.Field() postDate = scrapy.Field() postDesc = scrapy.Field() postNumber = scrapy.Field()
Scrapy提供了相关命令来帮助我们快速生成爬虫结构,执行下面语句,来生成名为basic的爬虫:
scrapy genspider basic web
它的结构如下:
import scrapy class BasicSpider(scrapy.Spider): name = ‘basic‘ allowed_domains = [‘web‘] start_urls = [‘website‘] def parse(self, response): pass
它确定了三个强制属性和方法:
我们在前面已经讲解了XPath的基本使用,此处不在赘述。
这一过程,我们需要观察网页源代码。首先每一页的博客是根据日期可以分为几大块,然后每一块内依次排列这每一篇文章的各项信息。
根据抽象出的结构,我们取出数据要爬出的数据。
import scrapy from demo.items import DemoItem class BasicSpider(scrapy.Spider): name = ‘basic‘ allowed_domains = [‘web‘] start_urls = [‘https://www.cnblogs.com/MrSaver/default.html?page=1‘] def parse(self, response): posts = response.xpath(‘//div[@class="day"]‘) result = [] for each_day_post in posts: day_postTitles = each_day_post.xpath(‘./div[@class="postTitle"]/a[@class="postTitle2"]/text()‘).extract(); day_postDescs = each_day_post.xpath(‘./div[@class="postDesc"]/text()‘).extract(); if isinstance(day_postTitles, list): if (len(day_postTitles) == 1): tmp = DemoItem() tmp[‘postTitle‘] = day_postTitles tmp[‘postDesc‘] = day_postDesc result.append(tmp); else: for i in range(len(day_postTitles)): tmp = DemoItem() tmp[‘postTitle‘] = day_postTitles[i] tmp[‘postDesc‘] = day_postDesc[i] result.append(tmp); return result
scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,命令如下:
scrapy crawl basic -o items.json
json lines格式,默认为Unicode编码
scrapy crawl basic -o items.jsonl
csv 逗号表达式,可用Excel打开
scrapy crawl basic -o items.csv
xml格式
scrapy crawl basic -o items.xml
原文:https://www.cnblogs.com/MrSaver/p/10586605.html