1、管道的高级操作

将爬取到的数据值分别存储到本地磁盘、redis数据库、mysql数据。

需求:将爬取到的数据值分别存储到本地磁盘、redis数据库、mysql数据。
  1.需要在管道文件中编写对应平台的管道类
  2.在配置文件中对自定义的管道类进行生效操作

qiubai.py

import scrapy
from qiubaipro.items import QiubaiproItem class QiubaiSpider(scrapy.Spider):
name = 'qiubai'
#allowed_domains = ['www.qiushibaike.com/text']
start_urls = ['https://www.qiushibaike.com/text/'] def parse(self, response):
# 建议大家使用xpath进行解析(框架集成了xpath解析的接口)
div_list = response.xpath("//div[@id='content-left']/div")
# 存储到的解析到的页面数据
data_list = []
for div in div_list:
author = div.xpath('./div/a[2]/h2/text()').extract_first()
#content = div.xpath(".//div[@class='content']/span/text()")
content = div.xpath(".//div[@class='content']/span/text()").extract_first()
# 1.将解析到数据值(author和content)储存到items对象
item = QiubaiproItem()
item['author'] = author
item['content'] = content
# 2.将item对象提交给管道
yield item

pipelines.py

import redis
import pymysql
import json
class QiubaiproPipeline(object):
conn = None
def open_spider(self,spider):
print('写入到redis服务器')
print('开始爬虫')
# redis服务器port
self.conn = redis.Redis(host='127.0.0.1',port=6379)
# 该方法可以接受爬虫文件中提交过来的item对象,并且对item对象的页面数据进行持久化处理
# 参数:item表示的就是接受到的item对象
def process_item(self, item, spider):
# 1.链接数据库
dict = {'author':item['author'],
'content':item['content']}
     dict = json.doums(dict)
self.conn.lpush('data',dict) return item
# 该方法只会在爬虫结束的时候被调用一次
def close_spider(self,spider):
print('爬虫结束') # 实现将数据值存到本地磁盘中
class QiubaiByFiles(object):
# 该方法可以接受爬虫文件中提交过来的item对象,并且对item对象的页面数据进行持久化处理
# 参数:item表示的就是接受到的item对象
def open_spider(self,spider):
print('写入到本地磁盘中')
print('开始爬虫')
self.fp = open('./qiubai_pipe.txt', 'w', encoding='utf-8') # 该方法可以接受爬虫文件中提交过来的item对象,并且对item对象的页面数据进行持久化处理
# 参数:item表示的就是接受到的item对象
def process_item(self, item, spider):
author = item['author']
content = item['content'] # 持久化存储io操作
self.fp.write(author+':'+content+'\n\n\n')
return item
# 该方法只会在爬虫结束的时候被调用一次
def close_spider(self,spider):
print('爬虫结束')
self.fp.close() # 实现将数据值存储到mysql数据库中
class QiubaiByMysql(object):
conn = None # mysql的连接对象声明
cursor = None # mysql游标对象声明
def open_spider(self,spider):
print('写入到mysql数据库中')
print('开始爬虫') # 链接数据库
# host 本机的ip地址
# 在命令行输入 ipconfig查看
self.conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='',db='qiubai',charset='utf8') # 该方法可以接受爬虫文件中提交过来的item对象,并且对item对象的页面数据进行持久化处理
# 参数:item表示的就是接受到的item对象
def process_item(self, item, spider):
# 1.链接数据库
# 执行sql语句
# 插入数据
sql = 'insert into qiubai(author,content) values("%s","%s")'%(item['author'], item['content'])
# 获取游标
self.cursor = self.conn.cursor()
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback() # 提交事务
return item
# 该方法只会在爬虫结束的时候被调用一次
def close_spider(self,spider):
print('爬虫结束')
self.cursor.close()
self.conn.close()

在settings配置

#  数字表示优先级,数字越大优先级越高
ITEM_PIPELINES = {
'qiubaipro.pipelines.QiubaiproPipeline': 300,
'qiubaipro.pipelines.QiubaiByFiles':400,
'qiubaipro.pipelines.QiubaiByMysql':500,
}

打开终端,先进入文件目录

先打开redis,mysql服务器再执行如下命令:

存本地:

存redis:

存mysql

测试成功

多个url数据爬取

***问题:针对多个url进行数据的爬取
解决方案:请求的手动发送

1、新建一个工程

cd  到需要保存工程的目录

scrapy startproject qiubaiByPages

cd qiubaiByPages

爬虫文件的名称,起始url

scrapy genspider qiubai www.qiushibaike.com/text

把实现的步骤在理清一次

1、qiubai.py

解析网页信息

 def parse(self, response):
# 在原页面点击copy xpath
div_list = response.xpath('//*[@id="content-left"]/div') for div in div_list:
# 在当前 div下 直系的div=====》./div
author = response.xpath('./div[@class="author clearfix"]/a[2]/h2/text()').extract_first()
# 在当前div下 的a 在 a下的div===>.//div
content = response.xpath('.//div[@class="content"]/span/text()').extract_first()
qiubai.py全文代码

2、创建一个items对象,将解析到数据值存储到items对象中

# 创建一个items对象,将解析到数据值存储到items对象中
# 在items.py文件中author = scrapy.Field()
# content = scrapy.Field() item = QiubaibypagesItem()
item['author'] = author
item['content'] = content

3、将item提交管道---然后在管道文件中进行编写

 # 将item提交管道---然后在管道文件中进行编写
yield item

4、pipelines.py

class QiubaibypagesPipeline(object):
fp = None
def open_spider(self, spider):
print('开始爬虫')
self.fp = open('./qiubai.txt', 'w', encoding='utf-8')
def process_item(self, item, spider):
self.fp.write(item['author'] + ":" + item['content'])
return item def close_spider(self, spider):
self.fp.close()
print('爬虫结束')

5、在settings.py配置

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'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
'qiubaiByPages.pipelines.QiubaibypagesPipeline': 300,
}

6、执行文件

先前测试不成功原因:class=   属性没有加 " "

测试成功:

其中,mypjt.pipelines.MypjtPipeline命名规范为项目名.piplines配置文件名.piplines文件里的类名。300代表优先级,范围为0~1000,数字越小,越先执行。

可以同时定义多个处理数据的类,使用数字来确定优先级。

Scrapy5大核心组件:

•    引擎(Scrapy)
用来处理整个系统的数据流处理, 触发事务(框架核心)
• 调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列,
由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
• 下载器(Downloader)
用于下载网页内容,并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
• 爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
• 项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

create table qiubai2(
id int primary key auto_increment,
author varchar(20),
content varchar(255));

爬虫--Scrapy-持久化存储操作2的更多相关文章

  1. Scrapy持久化存储-爬取数据转义

    Scrapy持久化存储 爬虫爬取数据转义问题 使用这种格式,会自动帮我们转义 'insert into wen values(%s,%s)',(item['title'],item['content' ...

  2. Scrapy持久化存储

    基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作; 执行输出指定格式进行存储:将爬 ...

  3. <scrapy爬虫>scrapy命令行操作

    1.mysql数据库 2.mongoDB数据库 3.redis数据库 1.创建项目 scrapy startproject myproject cd myproject 2.创建爬虫 scrapy g ...

  4. scrapy 爬虫框架之持久化存储

    scrapy  持久化存储 一.主要过程: 以爬取校花网为例 : http://www.xiaohuar.com/hua/ 1.  spider    回调函数     返回item 时    要用y ...

  5. 11.scrapy框架持久化存储

    今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  6. scrapy框架持久化存储

    基于终端指令的持久化存储 基于管道的持久化存储 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文 ...

  7. 爬虫--Scrapy-持久化存储操作

    总体概况 持久化存储操作: a. 磁盘文件 a) 基于终端指令 i. 保证parse方法返回一个可迭代类型的对象(存储解析到的页面内容) ii. 使用终端指令完成数据存储到制定磁盘文件中的操作 1. ...

  8. scrapy框架的持久化存储

    一 . 基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. 执行输出指定格式进行存 ...

  9. 11,scrapy框架持久化存储

    今日总结 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  10. scrapy 框架持久化存储

    1.基于终端的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表或字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. # 执行输出指定格式进行存储:将 ...

随机推荐

  1. vue之v-if和v-show

    v-if v-if主要用来进行条件渲染. <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  2. DP Big Event in HDU

    Big Event in HDU Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) T ...

  3. C# int.ToString()

    C# int.ToString() 格式化数值:有时,我们可能需要将数值以一定的格式来呈现,就需要对数值进行格式化.我们使用格式字符串指定格式.格式字符串采用以下形式:Axx,其中 A 为格式说明符, ...

  4. 廖雪峰Java3异常处理-1错误处理-3抛出异常

    1.异常的传播 当某个方法抛出异常时: 如果当前方法没有捕获,异常就被抛到上层调用方法 直到遇到某个try...catch被捕获 使用printStackTrace()打印处方法的调用栈 import ...

  5. jquery.autocomplete 搜索文字提示

    function GetJobTitle(obj) { $(obj).autocomplete("GetJobTitle.ashx", { max: 12, //列表里的条目数 m ...

  6. CRM 2016 一个IFrame页面,执行另一IFrame页面的函数

    如果IFrame_A  想执行 IFrame_B 中 RefreshSelf() 函数,可以按以下方法写: 此js代码写在 IFrame_A 中 parent.Xrm.Page.getControl( ...

  7. html 网页生产pdf文件

    在nuget中安装组件 Install-Package CPechkin https://www.nuget.org/packages/CPechkin/ 根据html生产pdf文件 using Sy ...

  8. C语言:冒泡排序

    void sort(int arr[],int len) { ; ; i<len; i++) { printf("第%d轮:\n", i); // len-i+1:新轮比上轮 ...

  9. oracle SQL语句取本周本月本年的数据

    --国内从周一到周日 国外是周日到周六 select to_char(sysdate-1,'D') from dual;--取国内的星期几 去掉减一取国外的星期 --取本周时间内的数据 ,)+) an ...

  10. websocket 群聊,单聊,加密,解密

    群聊 from flask import Flask, request, render_templatefrom geventwebsocket.handler import WebSocketHan ...