Scrapy框架的基本组成及功能使用
1.什么是scrapy?
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。框架的本质就是集成各种功能、具有很强通用性的项目模板。
2.安装
Linux:
pip3 install scrapy
Windows:===》见Twisted安装
a. pip3 install wheel
b. 下载twisted http:
/
/
www.lfd.uci.edu
/
~gohlke
/
pythonlibs
/
#twisted
c. 进入下载目录,执行 pip3 install Twisted‑
17.1
.
0
‑cp35‑cp35m‑win_amd64.whl
d. pip3 install pywin32
e.
pip3 install scrapy
scrapy crawl qiubai -o qiubai.jsonscrapy crawl qiubai -o qiubai.xmlscrapy crawl qiubai -o qiubai.csv
1 project_name/ 2 scrapy.cfg: 3 project_name/ 4 __init__.py 5 items.py 6 pipelines.py 7 settings.py 8 spiders/ 9 __init__.py 应用名称.py 10 11 scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中) 12 items.py 设置数据存储模板,用于结构化数据,如:Django的Model 13 pipelines 数据持久化处理 14 settings.py 配置文件,如:递归的层数、并发数,延迟下载等 15 spiders 爬虫目录,如:创建文件,编写爬虫解析规则
执行完创建应用命令后,打开文件会显示出如下页面
1 # -*- coding: utf-8 -*- 2 import scrapy 3 4 class QiubaiSpider(scrapy.Spider): 5 name = 'qiubai' #应用名称 6 #允许爬取的域名(如果遇到非该域名的url则爬取不到数据) 7 allowed_domains = ['https://www.qiushibaike.com/'] 8 #起始爬取的url 9 start_urls = ['https://www.qiushibaike.com/'] 10 11 #访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll 12 def parse(self, response): 13 print(response.text) #获取字符串类型的响应内容 14 print(response.content)#获取字节类型的相应内容
修改settings相关配置
修改内容及其结果如下: 19行:USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' #伪装请求载体身份 22行:ROBOTSTXT_OBEY = False #可以忽略或者不遵守robots协议 ==》防君子不防小人协议 需要改为False,不需要遵守协议
scrapy对糗事百科进行爬取
1 # -*- coding: utf-8 -*- 2 import scrapy 3 4 class QiubaiSpider(scrapy.Spider): 5 name = 'qiubai' 6 allowed_domains = ['https://www.qiushibaike.com/'] 7 start_urls = ['https://www.qiushibaike.com/'] 8 9 def parse(self, response): 10 #xpath为response中的方法,可以将xpath表达式直接作用于该函数中 11 odiv = response.xpath('//div[@id="content-left"]/div') 12 content_list = [] #用于存储解析到的数据 13 for div in odiv: 14 #xpath函数返回的为列表,列表中存放的数据为Selector类型的数据。我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。 15 author = div.xpath('.//div[@class="author clearfix"]/a/h2/text()')[0].extract() 16 content=div.xpath('.//div[@class="content"]/span/text()')[0].extract() 17 18 #将解析到的内容封装到字典中 19 dic={ 20 '作者':author, 21 '内容':content 22 } 23 #将数据存储到content_list这个列表中 24 content_list.append(dic) 25 26 return content_list
执行爬虫程序并保存文件
执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储scrapy crawl qiubai -o qiubai.jsonscrapy crawl qiubai -o qiubai.xmlscrapy crawl qiubai -o qiubai.csv 二.scrapy持久化操作:将爬取到糗百数据存储写入到文本文件中进行存储
1 # -*- coding: utf-8 -*- 2 import scrapy 3 4 5 class QiubaiSpider(scrapy.Spider): 6 name = 'qiubai' 7 allowed_domains = ['https://www.qiushibaike.com/'] 8 start_urls = ['https://www.qiushibaike.com/'] 9 10 def parse(self, response): 11 #xpath为response中的方法,可以将xpath表达式直接作用于该函数中 12 odiv = response.xpath('//div[@id="content-left"]/div') 13 with open('./data.txt', 'w') as fp: 14 for div in odiv: 15 #xpath函数返回的为列表,列表中存放的数据为Selector类型的数据。我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。 16 author = div.xpath('.//div[@class="author clearfix"]/a/h2/text()')[0].extract() 17 content=div.xpath('.//div[@class="content"]/span/text()')[0].extract() 18 #持久化存储爬取到的内容 19 fp.write(author + ':' + content + '\n')
注意:上述代码表示的持久化操作是我们自己通过IO操作将数据进行的文件存储。在scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可。要想使用scrapy的持久化操作功能,我们首先来认识如下两个文件:
items.py:数据结构模板文件。定义数据属性。
pipelines.py:管道文件。接收数据(items),进行持久化操作。
持久化流程:
1.爬虫文件爬取到数据后,需要将数据封装到items对象中。
2.使用yield关键字将items对象提交给pipelines管道进行持久化操作。
3.settings.py配置文件中开启管道
三.小试牛刀:将糗事百科首页中的段子和作者数据爬取下来,然后进行持久化存储
1 # -*- coding: utf-8 -*- 2 import scrapy 3 from secondblood.items import SecondbloodItem 4 5 class QiubaidemoSpider(scrapy.Spider): 6 name = 'qiubaiDemo' 7 allowed_domains = ['www.qiushibaike.com'] 8 start_urls = ['http://www.qiushibaike.com/'] 9 10 def parse(self, response): 11 odiv = response.xpath('//div[@id="content-left"]/div') 12 for div in odiv: 13 # xpath函数返回的为列表,列表中存放的数据为Selector类型的数据。我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。 14 author = div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first() 15 author = author.strip('\n')#过滤空行 16 content = div.xpath('.//div[@class="content"]/span/text()').extract_first() 17 content = content.strip('\n')#过滤空行 18 19 #将解析到的数据封装至items对象中 20 item = SecondbloodItem() 21 item['author'] = author 22 item['content'] = content 23 24 yield item#提交item到管道文件(pipelines.py)
items.py
1 import scrapy 2 3 4 class SecondbloodItem(scrapy.Item): 5 # define the fields for your item here like: 6 # name = scrapy.Field() 7 author = scrapy.Field() #存储作者 8 content = scrapy.Field() #存储段子内容
管道文件:pipelines.py
1 # -*- coding: utf-8 -*- 2 3 # Define your item pipelines here 4 # 5 # Don't forget to add your pipeline to the ITEM_PIPELINES setting 6 # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html 7 8 9 class SecondbloodPipeline(object): 10 #构造方法 11 def __init__(self): 12 self.fp = None #定义一个文件描述符属性 13 #下列都是在重写父类的方法: 14 #开始爬虫时,执行一次 15 def open_spider(self,spider): 16 print('爬虫开始') 17 self.fp = open('./data.txt', 'w') 18 19 #因为该方法会被执行调用多次,所以文件的开启和关闭操作写在了另外两个只会各自执行一次的方法中。 20 def process_item(self, item, spider): 21 #将爬虫程序提交的item进行持久化存储 22 self.fp.write(item['author'] + ':' + item['content'] + '\n') 23 return item 24 25 #结束爬虫时,执行一次 26 def close_spider(self,spider): 27 self.fp.close() 28 print('爬虫结束')
配置文件:settings.py
#开启管道 ITEM_PIPELINES = {'secondblood.pipelines.SecondbloodPipeline': 300, #300表示为优先级,值越小优先级越高 }
Scrapy递归爬取多页数据:
需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储
1 # -*- coding: utf-8 -*- 2 import scrapy 3 from qiushibaike.items import QiushibaikeItem 4 # scrapy.http import Request 5 class QiushiSpider(scrapy.Spider): 6 name = 'qiushi' 7 allowed_domains = ['www.qiushibaike.com'] 8 start_urls = ['https://www.qiushibaike.com/text/'] 9 10 #爬取多页 11 pageNum = 1 #起始页码 12 url = 'https://www.qiushibaike.com/text/page/%s/' #每页的url 13 14 def parse(self, response): 15 div_list=response.xpath('//*[@id="content-left"]/div') 16 for div in div_list: 17 #//*[@id="qiushi_tag_120996995"]/div[1]/a[2]/h2 18 author=div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first() 19 author=author.strip('\n') 20 content=div.xpath('.//div[@class="content"]/span/text()').extract_first() 21 content=content.strip('\n') 22 item=QiushibaikeItem() 23 item['author']=author 24 item['content']=content 25 26 yield item #提交item到管道进行持久化 27 28 #爬取所有页码数据 29 if self.pageNum <= 13: #一共爬取13页(共13页) 30 self.pageNum += 1 31 url = format(self.url % self.pageNum) 32 33 #递归爬取数据:callback参数的值为回调函数(将url请求后,得到的相应数据继续进行parse解析),递归调用parse函数 34 yield scrapy.Request(url=url,callback=self.parse)
scrapy组件
- 引擎(Scrapy)
用来处理整个系统的数据流处理, 触发事务(框架核心) - 调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 - 下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) - 爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面 - 项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
* 解释:引擎首先会将爬虫文件中的起始url获取,并且提交到调度器中。如果需要从url中下载数据,则调度器会将url通过引擎提交给下载器,下载器根据url去下载指定内容(响应体)。下载好的数据会通过引擎移交给爬虫文件,爬虫文件可以将下载的数据进行指定格式的解析。如果解析出的数据需要进行持久化存储,则爬虫文件会将解析好的数据通过引擎移交给管道进行持久化存储。
面试题:如果最终需要将爬取到的数据值一份存储到磁盘文件,一份存储到数据库中,则应该如何操作scrapy?
答:管道文件中的代码为:
1 #该类为管道类,该类中的process_item方法是用来实现持久化存储操作的。 2 class DoublekillPipeline(object): 3 4 def process_item(self, item, spider): 5 #持久化操作代码 (方式1:写入磁盘文件) 6 return item 7 8 #如果想实现另一种形式的持久化操作,则可以再定制一个管道类: 9 class DoublekillPipeline_db(object): 10 11 def process_item(self, item, spider): 12 #持久化操作代码 (方式1:写入数据库) 13 return item
在settings.py开启管道操作代码为:
1 #下列结构为字典,字典中的键值表示的是即将被启用执行的管道文件和其执行的优先级。 2 ITEM_PIPELINES = { 3 'doublekill.pipelines.DoublekillPipeline': 300, 4 'doublekill.pipelines.DoublekillPipeline_db': 200, 5 } 6 7 #上述代码中,字典中的两组键值分别表示会执行管道文件中对应的两个管道类中的process_item方法,实现两种不同形式的持久化操作。
五.Scrapy发起post请求:
- 问题:在之前代码中,我们从来没有手动的对start_urls列表中存储的起始url进行过请求的发送,但是起始url的确是进行了请求的发送,那这是如何实现的呢?
- 解答:其实是因为爬虫文件中的爬虫类继承到了Spider父类中的start_requests(self)这个方法,该方法就可以对start_urls列表中的url发起请求:
def start_requests(self):for u in self.start_urls:yield scrapy.Request(url=u,callback=self.parse)
【注意】该方法默认的实现,是对起始的url发起get请求,如果想发起post请求,则需要子类重写该方法。
- 重写start_requests方法,让其发起post请求:
def start_requests(self):#请求的urlpost_url = 'http://fanyi.baidu.com/sug'# 表单数据formdata = {'kw': 'wolf',}# 发送post请求yield scrapy.FormRequest(url=post_url, formdata=formdata, callback=self.parse)
转载于:https://www.cnblogs.com/Roc-Atlantis/p/9719896.html
Scrapy框架的基本组成及功能使用相关推荐
- python网页爬虫漫画案例_Python爬虫-用Scrapy框架实现漫画的爬取
14.jpg 在之前一篇抓取漫画图片的文章里,通过实现一个简单的Python程序,遍历所有漫画的url,对请求所返回的html源码进行正则表达式分析,来提取到需要的数据. 本篇文章,通过 scrapy ...
- java启动scrapy爬虫,爬虫入门之Scrapy 框架基础功能(九)详解
Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...
- python新闻爬虫系统的功能_基于Scrapy框架的Python新闻爬虫
一.开发背景 Python作为数据处理方面的一把好手,近年来的热度不断增长.网络爬虫可以说是Python最具代表性的应用之一,那么通过网络爬虫来学习Python以及网络和数据处理的相关内容可以说是再合 ...
- python爬虫之Scrapy框架的post请求和核心组件的工作 流程
python爬虫之Scrapy框架的post请求和核心组件的工作 流程 一 Scrapy的post请求的实现 在爬虫文件中的爬虫类继承了Spider父类中的start_urls,该方法就可以对star ...
- Scrapy框架中的crawlspider爬虫
1 crawlspider是什么 在spider中要寻找下一页的url地址或者内容的url地址,想想是否有简单的方法省略寻找url的过程? 思路: 从response中提取所有的满足规则的url地址 ...
- 爬虫基础分享Scrapy框架流程图与安装
从头开发一个爬虫程序是一项烦琐的工作,为了避免因制造轮子而消耗大量时间,在实际应用中我们可以选择使用一些优秀的爬虫框架,使用框架可以降低开发成本,提高程序质量,让我们能够专注于业务逻辑.所以,我们一起 ...
- python 爬虫 学习笔记(一)Scrapy框架入门
沉迷于通过高效算法及经典数据结构来优化程序的时候并不理解,为什么多线程可以优化爬虫运行速度?原来是程序特性所决定的:传统算法的程序复杂度主要来源于计算,但网络程序的计算时间可以忽略不计,网络程序所面临 ...
- python scrapy框架基如何实现多线程_【转】爬虫的一般方法、异步、并发与框架scrapy的效率比较...
问题的由来 我们的需求为爬取红色框框内的名人(有500条记录,图片只展示了一部分)的 名字以及其介绍,关于其介绍,点击该名人的名字即可,如下图: 这就意味着我们需要爬取500个这样的页面,即500个H ...
- python中data.find_all爬取网站为空列表_Python网络爬虫之Scrapy 框架-分布式【第二十九节】...
1. 介绍scrapy-redis框架 scrapy-redis 一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能. github地址: https://g ...
- scrapy框架_Scrapy框架学习---Scrapy介绍(一)
Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...
最新文章
- HTML5 行内元素有哪些,块级元素有哪些, 空元素有哪些?
- 【bzoj2434】[Noi2011]阿狸的打字机 AC自动机+Dfs序+树状数组
- 个人做asp.net时犯过的错或是一点心得什么的(我就经常的更新一下吧)
- mysql记录相互关系查询_MySQL关系表查询两个表的数据
- ZZULIOJ 1111: 多个整数的逆序输出(函数专题)
- Voovan网络编程介绍
- linux unzip到指定目录
- (TOJ1248)Encoding
- gdb调试daemon程序
- ubuntu 修改IP,网关等
- python如何操作oracle数据库_Python连接oracle数据库的基本操作
- 安装虚拟机时勾选增强型键盘驱动程序有什么用?(在软件安装或者升级时候没勾选怎么办)
- PCL包围盒计算原理及代码
- 华东理工大学本科毕业论文答辩和论文选题PPT模板
- VS2019安装和使用教程
- day03 爬取京东信息,bs4
- workerman实现聊天室
- Python练习题答案: 馏分类【难度:2级】--景越Python编程实例训练营,1000道上机题等你来挑战
- 【小程序源码】视频壁纸支持多种分类短视频另外也有静态壁纸
- 使用turtle绘制心心相印(动态)python