说明:初学者,整理后方便能及时完善,冗余之处请多提建议,感谢!
 
了解内容:
Scrapy :抓取数据的爬虫框架
 
 
异步与非阻塞的区别
 
异步:指的是整个过程,中间如果是非阻塞的,那就是异步过程;
非阻塞:关注拿到结果之前的状态 (如果拿到结果前在等待,是阻塞,反之,是非阻塞)
 
 
理解:
Scrapy 基本工作流程(简单--->复杂)
                            
            
                 每个模块间不通讯,模块之间通过引擎进行数据传输

 
   
 基本使用
 
一、创建spider
 
scrapy项目流程
---创建项目
    ---scrapy startproject  xxxx
---创建爬虫
    ---cd 项目目录下
    ---scrapy genspider   aaa    allowed_domains"”
        scrapy genspider  first_spider  jpdd.com
      first_spider   爬虫名字
      jpdd.com     限制爬取数据的范围
--完善spider
    ---提取数据,提取url地址构成request对象
        xpath  extract_first()\extract()   response.meta      yield  scrapy.Requeest       
--完善管道 
--运行爬虫
    --- cd  项目目录   
    ---scrapy  crawl   first_spider
 
注意:避免爬虫名和项目名重复 ;
           不管在终端还是pycharm 都要切换到当前目录下 cd myspider
            allowed_domains : 限定爬取的范围
           
二、完善spider 
 
    ----  对数据的提取
    1、 Scray 中的parse 做什么用途? 
            ---处理start_urls 中的url地址的响应
 
    2 、yiele 生成器的使用
             好处:遍历函数的返回值的时候,挨个把数据读到内存,不会造成内存的瞬间占用过高
             通过yield传递数据给管道,(类似转发)
             yield能够传递的对象只能是:BaseItem, Request, dict, None
    
    3 、使用.extract()把response.xpath()提取的数据转化为字符串列表
            .extract()    返回一个含有字符串的列表,没有返回空列表
            .extract_first()   提取列表中的第一个字符串,如果不存在,返回None
 
----例:
yield的使用:使用多个yield 来传递需要的数据
 

  
 
 
 
 
 
 
         
 

上面的代码应该改成:yield item

 
4、 根据Response返回的url地址,对next_url的url地址进行拼接,构造请求,有5种方式
 
        第1种:手动字符串相加
        第2种:urllib.parse.urljoin(baseurl,url)  后面的url会根据baseurl进行url地址的拼接
        第3种:response.follow(url ,callback)   能够根据response的地址把url拼接完整,构造成Request对象,
                                                                      但这个方法在python 1.0后的版本中才有
        第4种(推荐):response.urljoin(next_url)    更简洁、好用
        第5种:scrapy.Request(url,callback,meta,dont_filter)
 
---例:
# 第一种:手动拼接下一页url
 
#主站链接 用来拼接
base_site = 'https://www.jpdd.com' def parse(self,response):
book_urls = response.xpath('//table[@class="p-list"]//a/@href').extract() for book_url in book_urls:
url = self.base_site + book_url
yield scrapy.Request(url, callback=self.getInfo) #获取下一页
next_page_url = self.base_site + response.xpath(
'//table[@class="p-name"]//a[contains(text(),"下一页")]/@href'
).extract()[0] yield scrapy.Request(next_page_url, callback=self.parse)
 
使用urllib实现url地址拼接的原理:
        

        
 
 
 
 

三、完善管道 
       
  管道的设置也是以键值的形式
 
      

 
 
 
 
 
 
 
数据保存:可以是具体的item,也可以保存在文件中,如下2种方式
 
 第一种:
        
     
 
 
 
 
 
 
 
 
 
 
 
第二种:

------数字越小,表示离引擎越近,数据越先经过处理,反之 。

  -------使用多个管道时,前面的管道中要记得return  xx  不然后面的管道接收不到前面的数据,会返回none
 
四、item的使用
        
        为什么要单独定义item?
            定义item即提前规划好哪些字段需要抓取,scrapy.Field()仅仅是提前占坑,通过item.py能够让别人清楚自己的爬虫是在抓取什么数据;
       同时来提示哪些字段是需要抓取的,没有定义的字段不能使用,防止手误;
    item不能直接存入mongodb中,需要转化为字典后再存储。
 
      Item使用之前需要先导入并且实例化,之后的使用方法和使用字典相同
    from yanguan.items import YanguanItem
item = YanguanItem() #实例化

  

补充:
构造翻页请求
        meta 自身是个字典
          Scrapy.Request() ===>相当于构造了一个requests对象
 
scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])

参数说明:
括号中的参数为可选参数
callback:表示当前的url的响应交给哪个函数去处理
meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等
dont_filter:默认会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Ture,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动

 
        
 
 

scrapy爬取数据的基本流程及url地址拼接的更多相关文章

  1. 如何提升scrapy爬取数据的效率

    在配置文件中修改相关参数: 增加并发 默认的scrapy开启的并发线程为32个,可以适当的进行增加,再配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. ...

  2. 将scrapy爬取数据通过django入到SQLite数据库

    1. 在django项目根目录位置创建scrapy项目,django_12是django项目,ABCkg是scrapy爬虫项目,app1是django的子应用 2.在Scrapy的settings.p ...

  3. python之scrapy爬取数据保存到mysql数据库

    1.创建工程 scrapy startproject tencent 2.创建项目 scrapy genspider mahuateng 3.既然保存到数据库,自然要安装pymsql pip inst ...

  4. 42.scrapy爬取数据入库mongodb

    scrapy爬虫采集数据存入mongodb采集效果如图: 1.首先开启服务切换到mongodb的bin目录下 命令:mongod --dbpath e:\data\db 另开黑窗口 命令:mongo. ...

  5. scrapy爬取数据进行数据库存储和本地存储

    今天记录下scrapy将数据存储到本地和数据库中,不是不会写,因为小编每次都写觉得都一样,所以记录下,以后直接用就可以了-^o^- 1.本地存储 设置pipel ines.py class Ak17P ...

  6. scrapy爬取数据保存csv、mysql、mongodb、json

    目录 前言 Items Pipelines 前言 用Scrapy进行数据的保存进行一个常用的方法进行解析 Items item 是我们保存数据的容器,其类似于 python 中的字典.使用 item ...

  7. Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)

    1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...

  8. 爬虫必知必会(6)_提升scrapy框架爬取数据的效率之配置篇

    如何提升scrapy爬取数据的效率:只需要将如下五个步骤配置在配置文件中即可 增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_ ...

  9. 提高Scrapy爬取效率

    1.增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. 2.降低 ...

随机推荐

  1. Listfragment 列表标题 显示内容

    activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  2. 【ES6】更易于继承的类语法

    和其它面向对象编程语言一样,ES6 正式定义了 class 类以及 extend 继承语法糖,并且支持静态.派生.抽象.迭代.单例等,而且根据 ES6 的新特性衍生出很多有趣的用法. 一.类的基本定义 ...

  3. Antler 工具使用(.g 转.java / .cs)

    1. JAVA环境 2. Antler 工具包: antlr-3.5.1-complete-no-st3.jar 路径加入classpath 3. cmd命令行: java org.antlr.Too ...

  4. ActiveMQ持久化机制

    用户注册成功后发短信提醒 同步http 异步mq JMS中两种通讯模式: 发布订阅   一对多  topic   去过消费者集群的话 都会消费 消息队列   点对点 queue  去过消费者集群的话 ...

  5. C#多线程编程介绍——使用thread、threadpool、timer

    C#多线程编程介绍——使用thread.threadpool.timer 在system.threading 命名空间提供一些使得能进行多线程编程的类和接口,其中线程的创建有以下三种方法:thread ...

  6. L98

    If there's one thing to be taught, it's dreams are made to be caught.唯有一事值得谨记,有梦想就要奋力追逐Capital punis ...

  7. codeforces 622E E. Ants in Leaves(贪心+dfs)

    题目链接: E. Ants in Leaves time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  8. python 列表之队列

    列表实现队列操作(FIFO),可以使用标准库里的 collections.deque,deque是double-ended quene的缩写,双端队列的意思,它可以实现从队列头部快速增加和取出对象. ...

  9. zero to one (2)

    kali虚拟机整理 关于kali的虚拟机,我搞崩过很多次,重新安装了很多次,也遇到了很多问题,有一些解决不了的就重新安装,费时费力,要善于用虚拟机. 关于网络配置的问题 关于网络配置,在这里我想主要记 ...

  10. poj1456 Supermarket[另类的并查集做法]

    1.Supermarket(题目地址) 跟很久以前模拟的打地鼠那题一样,贪心+优先队列.这次换用并查集做法. 还是基于贪心,但这次换一种策略,先选价值最大的, 同时使其尽可能晚的被选上(因为早选会将之 ...