2021-02-26

一 框架工作原理介绍

1 为什么学习scrapy?

scrapy能解决剩下的10%的爬虫需求能够让开发过程方便、快速scrapy框架能够让我们的爬虫效率更高

2 什么是scrapy?

文档地址:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.htmlScrapy

使用了Twisted['twɪstɪd]异步网络框架,可以加快我们的下载速度。

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取。

3 异步和非阻塞的区别

前面我们说Twisted是一个异步的网络框架,经常我们也听到一个词语叫做非阻塞,那么他们有什么区别呢?

异步:调用在发出之后,这个调用就直接返回,不管有无结果;

异步是过程。 非阻塞:关注的是程序在等待调用结果(消息,返回值)时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程。

4 scrapy的工作流程

4.1 回顾之前的爬虫流程

4.2 上面的流程可以改写为

其流程可以描述如下:

调度器把requests–>引擎–>下载中间件—>下载器下载器发送请求,

获取响应---->下载中间件---->引擎—>爬虫中间件—>爬虫爬虫提取url地址,

组装成request对象---->爬虫中间件—>引擎—>调度器爬虫

提取数据—>引擎—>管道管道进行数据的处理和保存

注意:图中绿色线条的表示数据的传递注意图中中间件的位置,决定了其作用注意其中引擎的位置,所有的模块之前相互独立,只和引擎进行交互

4.3 scrapy中每个模块的具体作用

二 Scrapy入门使用

1 scrapy项目实现流程

创建一个scrapy项目:

scrapy startproject mySpider

生成一个爬虫:

scrapy genspider abckg "abckg.com“

提取数据:

完善spider,使用xpath等方法保存数据:pipeline中保存数据

2 创建scrapy项目

scrapy startproject mySpider

3 创建爬虫命令

在项目路径下执行:

scrapy genspider +<爬虫名字> + <允许爬取的域名>

示例:cd myspiderscrapy genspider abck abckg.com

生成的目录和文件结果如下:

4 完善spider

完善spider即通过方法进行数据的提取等

操作在/myspider/myspider/spiders/abckg.py中修改内容如下:

import scrapy	
# 自定义spider类,继承
scrapy.spiderclass AbckgSpider(scrapy.Spider):      
    # 爬虫名字     
    name = 'abckg'    
    # 允许爬取的范围,防止爬虫爬到别的网站  
    allowed_domains = ['abckg.com']  
    # 开始爬取的url地址    
    start_urls = ['http://www.xxx.html']  
    # 数据提取的方法,接受下载中间件传过来的response  
    def parse(self, response):     
        # scrapy的response对象可以直接进行xpath  
        names = response.xpath('//div[@class="tea_con"]//li/div/h3/text()')        
        print(names)     
        # 获取具体数据文本的方式如下     
        # 分组     
        li_list = response.xpath('//div[@class="tea_con"]//li')       
        for li in li_list:
            # 创建一个数据字典     
            item = {}        
            # 利用scrapy封装好的xpath选择器定位元素,并通过extract()或extract_first()来获取结果     
            item['name'] = li.xpath('.//h3/text()').extract_first()# 老师的名字         
            item['level'] = li.xpath('.//h4/text()').extract_first() # 老师的级别   
            item['text'] = li.xpath('.//p/text()').extract_first() # 老师的介绍       
            print(item)

注意:response.xpath方法的返回结果是一个类似list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法extract() 返回一个包含有字符串的列表extract_first() 返回列表中的第一个字符串,列表为空没有返回Nonespider中的parse方法必须有需要抓取的url地址必须属于allowed_domains,但是start_urls中的url地址没有这个限制启动爬虫的时候注意启动的位置,是在项目路径下启动

5 利用管道pipeline来处理(保存)数据

5.1 对爬虫进行修改完善

在爬虫文件abckg.py中parse()函数中最后添加yield item思考:为什么要使用yield?让整个函数变成一个生成器,有什么好处呢?遍历这个函数的返回值的时候,挨个把数据读到内存,不会造成内存的瞬间占用过高python3中的range和python2中的xrange同理注意:yield能够传递的对象只能是:BaseItem,Request,dict,None

5.2 修改pipelines.py文件

import jsonclass abckgPipeline(object): # 爬虫文件中提取数据的方法每yield一次item,就会运行一次

该方法为固定名称函数

def process_item(self, item, spider):        print(item)

5.3 在settings.py设置

开启pipeline

ITEM_PIPELINES = { ‘myspider.pipelines.abckgPipeline’: 400}

6 运行scrapy命令:

在项目目录下执行scrapy crawl +<爬虫名字>

三 scrapy发送翻页请求

1.翻页请求的思路

对于要提取如下图中所有页面上的数据该怎么办?

scrapy实现翻页的思路:

1.找到下一页的url地址

2.构造url地址的请求,传递给引擎

2 scrapy实现翻页请求

2.1 实现方法确定url地址构造请求,scrapy.Request(url,callback)callback:指定解析函数名称,表示该请求返回的响应使用哪一个函数进行解析把请求交给引擎:yield scrapy.Request(url,callback)

2.2 腾讯招聘爬虫通过爬取腾讯招聘的页面的招聘信息

学习如何实现翻页请求地址:http://hr.tencent.com/position.php

思路分析:

获取首页的数据寻找下一页的地址,进行翻页,获取数据

注意:

1.可以在settings中设置ROBOTS协议 # False表示忽略网站的robots.txt协议,默认为True ROBOTSTXT_OBEY = False

2.可以在settings中设置User-Agent: # scrapy发送的每一个请求的默认UA都是设置的这个User-Agent USER_AGENT = ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36’

3 代码实现在爬虫文件的parse方法中:…

提取下一页的href并拼接url

next_url =\ ‘https://hr.tencent.com/’ + response.xpath(’//a[text()=“下一页”]/@href’).extract_first()

判断是否是最后一页

if response.xpath(’//a[text()=“下一页”]/@href’).extract_first() != ‘javascript:;’:

构造scrapy.Request对象,并yield给引擎

利用callback参数指定该Request对象之后获取的响应用哪个函数进行解析

利用meta参数将本函数中提取的数据传递给callback指定的函数

注意这里是yield

yield scrapy.Request(next_url, callback=self.parse)…

四 Scrapy的深入使用

1 了解scrapy的debug信息

2 了解scrapyShell

scrapy shell是scrapy提供的一个终端工具,能够通过它查看scrapy中对象的属性和方法,以及测试xpath

使用方法:

scrapy shell <网址>

在终端输入上述命令后,能够进入python的交互式终端,此时可以使用:

response.xpath():直接测试xpath规则是否正确
response.url:当前响应的url地址
response.request.url:当前响应对应的请求的url地址
response.headers:响应头
response.body:响应体,也就是html代码,默认是byte类型
response.requests.headers:当前响应的请求头

3 settings.py中的设置信息

3.1 为什么项目中需要配置文件

在配置文件中存放一些公共变量,在后续的项目中方便修改,

如:本地测试数据库和部署服务器的数据库不一致

3.2 配置文件中的变量使用方法

1.变量名一般全部大写
2.导入即可使用

3.3 settings.py中的重点字段和含义

USER_AGENT 设置ua
ROBOTSTXT_OBEY 是否遵守robots协议,默认是遵守
CONCURRENT_REQUESTS 设置并发请求的数量,默认是16个
DOWNLOAD_DELAY 下载延迟,默认无延迟
COOKIES_ENABLED 是否开启cookie,即每次请求带上前一次的cookie,默认是开启的
DEFAULT_REQUEST_HEADERS 设置默认请求头,这里加入了USER_AGENT将不起作用
SPIDER_MIDDLEWARES 爬虫中间件,设置过程和管道相同
DOWNLOADER_MIDDLEWARES 下载中间件
LOG_LEVEL 控制终端输出信息的log级别,终端默认显示的是debug级别的log信息
LOG_LEVEL = “WARNING”
LOG_FILE 设置log日志文件的保存路径,如果设置该参数,终端将不再显示信息
LOG_FILE = “./test.log”
其他设置参考:https://www.jianshu.com/p/df9c0d1e9087

4 pipeline管道的深入使用

之前我们在scrapy入门使用一节中学习了管道的基本使用,接下来我们深入的学习scrapy管道的使用

4.1 pipeline中常用的方法:

1.process_item(self,item,spider):实现对item数据的处理
2.open_spider(self, spider): 在爬虫开启的时候仅执行一次
3.close_spider(self, spider): 在爬虫关闭的时候仅执行一次

4.2 管道文件的修改

在pipelines.py代码中完善

import json
from pymongo import MongoClient
class AbckgFilePipeline(object):
    def open_spider(self, spider):  # 在爬虫开启的时候仅执行一次
        if spider.name == 'abckg':
            self.f = open('json.txt', 'a', encoding='utf-8')
    def close_spider(self, spider):  # 在爬虫关闭的时候仅执行一次
        if spider.name == 'abckg':
            self.f.close()
    def process_item(self, item, spider):
        if spider.name == 'abckg':
            self.f.write(json.dumps(dict(item), ensure_ascii=False, indent=2) + ',\n')
        return item  # 不return的情况下,另一个权重较低的pipeline将不会获得item
class abckgMongoPipeline(object):
    def open_spider(self, spider):  # 在爬虫开启的时候仅执行一次
        if spider.name == 'abckg':
            con = MongoClient(host='127.0.0.1', port=27017) # 实例化mongoclient
            self.collection = con.abckg.teachers # 创建数据库名为abckg,集合名为teachers的集合操作对象
    def process_item(self, item, spider):
        if spider.name == 'abckg':
            self.collection.insert(dict(item)) # 此时item对象需要先转换为字典,再插入不return的情况下,另一个权重较低的pipeline将不会获得item
        return item

4.3 开启管道

在settings.py设置开启pipeline


ITEM_PIPELINES = {
‘myspider.pipelines.abckgFilePipeline’: 400, # 400表示权重
‘myspider.pipelines.abckgMongoPipeline’: 500,
}

别忘了开启mongodb数据库 sudo service mongod start 并在mongodb数据库中查看 mongo

思考:pipeline在settings中能够开启多个,为什么需要开启多个?

1.不同的pipeline可以处理不同爬虫的数据,通过spider.name属性来区分
2.不同的pipeline能够对一个或多个爬虫进行不同的数据处理的操作,比如一个进行数据清洗,一个进行数据的保存
3.同一个管道类也可以处理不同爬虫的数据,通过spider.name属性来区分

4.4 pipeline使用注意点

1.使用之前需要在settings中开启
2.pipeline在setting中键表示位置(即pipeline在项目中的位置可以自定义),值表示距离引擎的远近,越近数据会越先经过
3.有多个pipeline的时候,process_item的方法必须return item,否则后一个pipeline取到的数据为None值
4.pipeline中process_item的方法必须有,否则item没有办法接受和处理
5.process_item方法接受item和spider,其中spider表示当前传递item过来的spider
6.open_spider(spider) :能够在爬虫开启的时候执行一次
7.close_spider(spider) :能够在爬虫关闭的时候执行一次
8.上述俩个方法经常用于爬虫和数据库的交互,在爬虫开启的时候建立和数据库的连接,在爬虫关闭的时候断开和数据库的连接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2021-03-26 20:54:33,596 - Model - INFO - Epoch 1 (1/200): 2021-03-26 20:57:40,380 - Model - INFO - Train Instance Accuracy: 0.571037 2021-03-26 20:58:16,623 - Model - INFO - Test Instance Accuracy: 0.718528, Class Accuracy: 0.627357 2021-03-26 20:58:16,623 - Model - INFO - Best Instance Accuracy: 0.718528, Class Accuracy: 0.627357 2021-03-26 20:58:16,623 - Model - INFO - Save model... 2021-03-26 20:58:16,623 - Model - INFO - Saving at log/classification/pointnet2_msg_normals/checkpoints/best_model.pth 2021-03-26 20:58:16,698 - Model - INFO - Epoch 2 (2/200): 2021-03-26 21:01:26,685 - Model - INFO - Train Instance Accuracy: 0.727947 2021-03-26 21:02:03,642 - Model - INFO - Test Instance Accuracy: 0.790858, Class Accuracy: 0.702316 2021-03-26 21:02:03,642 - Model - INFO - Best Instance Accuracy: 0.790858, Class Accuracy: 0.702316 2021-03-26 21:02:03,642 - Model - INFO - Save model... 2021-03-26 21:02:03,643 - Model - INFO - Saving at log/classification/pointnet2_msg_normals/checkpoints/best_model.pth 2021-03-26 21:02:03,746 - Model - INFO - Epoch 3 (3/200): 2021-03-26 21:05:15,349 - Model - INFO - Train Instance Accuracy: 0.781606 2021-03-26 21:05:51,538 - Model - INFO - Test Instance Accuracy: 0.803641, Class Accuracy: 0.738575 2021-03-26 21:05:51,538 - Model - INFO - Best Instance Accuracy: 0.803641, Class Accuracy: 0.738575 2021-03-26 21:05:51,539 - Model - INFO - Save model... 2021-03-26 21:05:51,539 - Model - INFO - Saving at log/classification/pointnet2_msg_normals/checkpoints/best_model.pth 我有类似于这样的一段txt文件,请你帮我写一段代码来可视化这些训练结果
02-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值