引言
通过之前的学习,我们对于爬虫和爬取一些静态网站和简单的动态网站都有了一定了解。现在,是时候开始学习更强大的爬虫框架了。
初识Scrapy库
Scrapy简介:
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了 页面抓取(更确切来说, 网络抓取)所设计的,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。
Scrapy的组件
- 引擎(Scrapy Engine): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
- 调度器(Scheduler) 接受引擎发送过来的Request请求并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
- 下载器(Downloader) 负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给引擎,由引擎交给Spider来处理
- 爬虫(Spiders) 从所有Responses中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入调度器
- 管道(Item Pipeline) 处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方
- 下载器中间件(Downloader middlewares) 一个可以自定义扩展下载功能的组件。
- Spider中间件(Spider middlewares) 一个可以自定扩展和操作引擎和Spider中间通信的功能组件
- 数据流(Data flow)
Scrapy架构图
注:绿线就是数据流向
小试牛刀
创建项目
爬取之前需要创建一个Scrapy项目,首先在cmd中进入需要的目录,然后运行如下命令。
代码语言:javascript复制scrapy startproject scrapyspider
创建成功后会出现如下提示。
代码语言:javascript复制New Scrapy project 'scrapyspider', using template directory 'k:apylibsite-packagesscrapytemplatesproject', created in:
K:学习Scrapy爬虫scrapyspider
You can start your first spider with:
cd scrapyspider
scrapy genspider example example.com
创建的项目目录如下。
代码语言:javascript复制scrapyspider/
scrapy.cfg #项目配置文件
scrapyspider/
__init__.py
items.py #目标文件:明确爬取的目标
pipelines.py #管道文件:设置pipelines存储爬取目标
settings.py #设置文件
spiders/ #存储爬虫代码目录
__init__.py
...
编写items.py文件
然后编写scrapyspider/items.py文件。Item用来保存爬取到的数据,Item定义了一个类似字典的结构化数据字段。
使用简单的class定义语法以及Field对象声明。本项目需要爬取两种信息,即名称和链接,所以需要创建两个容器。创建代码如下
代码语言:javascript复制import scrapy
class jdItem(scrapy.Item):
name = scrapy.Field()
src = scrapy.Field()
编写spider.py文件
首先需要在spiders目录下创建并编写爬虫文件jd_spiders.py。因为我要爬取的是京东,所以我创建了一个jd_spider.py文件。
也可以在cmd中使用
scrapy startproject mySpider
命令来创建这个文件。使用命令创建的文件会有默认代码。
创建好文件后,需要导入Spider类和刚才创建的jdItem类。
有了前面的学习基础,其实这里很好理解。
首先是创建一个爬虫类,并为他命名(name),同时告诉爬取需要爬取的url(start_urls)。
代码语言:javascript复制class jd_spider1(Spider):
name = 'jd_spider1'
start_urls = ['https://search.jd.com/Search?keyword=口红&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=口红&stock=1&psort=3&click=0']
然后就是编写如何解析网页的程序。与之前不同的是,这里解析网页没有使用之前的bs4库,而是使用了xpath语法,其实本质是一样的,都是爬取节点,只是表示方法有了点区别。下面来确定以下该如何爬取名称和链接。
简单查看了下网页源码,确定了需要信息的位置
首先是商品信息的位置,商品信息都被保存在li class = 'gl-item'标签中。
然后确定商品名称和链接的位置,可以发现都被保存在a target = '_blank'的title和href中了。
提取a内属性值的方法(以title为例
mes.xpath('.//a[@target = "_blank"]//@title')
)
下一步按照xpath语法的规则编写程序就可以了。
代码语言:javascript复制 def parse(self,response):
jdtem = jdItem()
mes_links = response.xpath('//li[@class="gl-item"]')
fro mes in mes_links:
jdItem1['name'] = mes.xpath('.//a[@target = "_blank"]//@title').extract()[0]
jdItem['src'] = mes.xpath('.//a[@target = "_blank"]//@herf')
yield item
至此,这个爬虫已经能实现需要的功能了。
运行爬虫
在爬虫目录下运行命令
代码语言:javascript复制scrapy crawl jd_spider1 -o jingdong.csv
-o是 scrapy提供的将item输出为csv格式的快捷方式
如果存入csv文件乱码。在settings.py文件中添加FEED_EXPORT_ENCODING = “gb18030”