说明:初学者,整理后方便能及时完善,冗余之处请多提建议,感谢!
 
了解内容:
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. xutils3基本使用

    根目录下新建一个类继承application,调用xUtils3初始化方法 public class AtguiguApplication extends Application { @Overrid ...

  2. densenet tensorflow 中文汉字手写识别

    densenet 中文汉字手写识别,代码如下: import tensorflow as tf import os import random import math import tensorflo ...

  3. springmvc的简单介绍以及springmvc组件的介绍

    Spring web mvc框架 什么是springmvc Springmvc是spring框架的一个模块,spring和springmvc无需中间整合层整合 Springmvc是一个基于mvc的we ...

  4. Meta viewport 学习整理

    The meta viewport tag contains instructions to the browser in the matter of viewports and zooming. I ...

  5. hdu-5806 NanoApe Loves Sequence Ⅱ(尺取法)

    题目链接: NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others)     Memory Limit: 262144/13107 ...

  6. Unity-2017.3官方实例教程Space-Shooter(一)

    由于初学Unity,写下此文作为笔记,文中难免会有疏漏,不当之处还望指正. Unity-2017.3官方实例教程Space-Shooter(二) 章节列表: 一.从Asset Store中下载资源并导 ...

  7. multitail

    multitail 在分隔的窗口查看你的日志

  8. Codeforces Gym 101190 NEERC 16 .D Delight for a Cat (上下界的费用流)

    ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ,因此一个小时内他只能选择睡觉或者打隔膜,当然他也必须选择睡觉或打隔膜,对于每一个小时,他选择睡 ...

  9. java-01

    二,八,十六进制到十进制的转换方法: 十进制到二,八,十六进制的转换方法: 2:标识符(掌握) (1)就是给类,接口,方法,变量等起名字的字符序列 (2)组成规则: A:英文大小写字母 B:数字 C: ...

  10. div靠右浮动案例

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...