scrapy  持久化存储

一.主要过程:

以爬取校花网为例 :

http://www.xiaohuar.com/hua/

1.  spider   

      回调函数     返回item 时    要用yield item   不能用return  item

  爬虫   xiahua.py      

 # -*- coding: utf-8 -*-
import scrapy
from ..items import XiaohuaItem class XiahuaSpider(scrapy.Spider):
name = 'xiahua' # 该名字 启动爬虫: scrapy crawl xiaohua --nolog
allowed_domains = ['xiaohuar.com']
start_urls = ['http://www.xiaohuar.com/hua/'] # 起始url列表 # 默认的回调函数
def parse(self, response):
# 进行解析
# print(response.text)
items=response.xpath('//*[@id="list_img"]/div/div[1]/div/div/div[1]')
# 持久化存储 for tag in items:
dic={}
name=tag.xpath("./span[1]/text()").extract_first()
url=tag.xpath("./a[1]/@href").extract_first()
if name: # 姓名存在是存入数据库
item = XiaohuaItem()
dic["name"] = name
dic["url"]=url
item['name']=name
item['url']=url
print(dic) yield item # 需要注意的: 不能是 return item

2. items.py

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html import scrapy class XiaohuaItem(scrapy.Item):
# define the fields for your item here like:

name=scrapy.Field()
url=scrapy.Field()

3.pipeline.py 

  1. 到settings 中 :

          (1)ROBOTSTXT_OBEY = False # 改为Flase

       (2)放开  ITEM_PIPELINES和修改机器人协议

      

      

  2. 数据持久化储存: 

方式一: 不去配置文件取值的方式:

     存数据库之前,先启动数据库服务端

    必须先将item对象转化为字典  dict(item)   存入数据库   
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import pymongo class XiaohuaPipeline(object):
def __init__(self):
self.client=None
self.db=None def process_item(self, item, spider): # 持久化储存
#将数据存入数据库 self.db.xiahua.insert(dict(item)) # 必须先将item对象转化为字典 return item def open_spider(self,spider):
# 爬虫开始 打开数据库
# 连接MongoDB服务端
self.client = pymongo.MongoClient(host="localhost",port=27017)
# 连接数据库
self.db = self.client.spider print("爬虫开始-------") def close_spider(self,spider): # 关闭数据库
print('爬虫结束-----') self.client.close()

 方式二 : 数据库配置到配置文件中的写法:

   用到 类中的一个函数,如果该类是先找 ,自己是否定义了   from_crawler  类方法,

   如果有自定义,则先执行该类方法,实例化一个对象。然后再执行  __init__ 方法。

1. settings.py 文件中配置以下信息:

### Mongdb配置参数

HOST="127.0.0.1"
PORT=27017
USER="root"
PWD=""
DB="spider"

2. pipeline.py  中增加   类方法   from_crawler 

# -*- coding: utf-8 -*-

import pymongo

class XiaohuaPipeline(object):

    @classmethod
def from_crawler(cls, crawler):
"""
Scrapy会先通过getattr判断我们是否自定义了from_crawler,有则调它来完
成实例化
"""
HOST = crawler.settings.get('HOST')
PORT = crawler.settings.get('PORT')
USER = crawler.settings.get('USER')
PWD = crawler.settings.get('PWD') return cls(HOST, PORT, USER, PWD) # 返回实例化对象 def __init__(self, host, port, user, pwd):
self.host = host
self.port = port
self.user = user
self.pwd = pwd
self.db = None def process_item(self, item, spider): #将数据存入数据库
print(type(dict(item)))
self.db.xiahua.insert_one(dict(item)) # xiahua 为文档名(表名) return item def open_spider(self,spider):
# 爬虫开始 打开数据库
# 连接MongoDB服务端
self.client = pymongo.MongoClient(host=self.host,port=self.port)
# 连接数据库
self.db = self.client.spider print("爬虫开始-------") def close_spider(self,spider): # 关闭数据库
print('爬虫结束-----') self.client.close()

总结:

  1. 先找 from_crawl 类方法, 有就先执行该该方法,返回一个实例化对象,再执行  __init__ 方法。

  2.  pipeline 类下,主要有5中方法:

    from_crawl  : 实例化一个对象 返回    # 该方法  去配置文件中取值时需要写

    __init__  : 初始化

    open_spider   爬虫开始 时执行     ( 数据库开启)

    process_item  持久化存储   处理   (存数据)

    close_spider    爬虫结束执行  (数据库关闭) 

   

scrapy 爬虫框架之持久化存储的更多相关文章

  1. Python之Scrapy爬虫框架安装及简单使用

    题记:早已听闻python爬虫框架的大名.近些天学习了下其中的Scrapy爬虫框架,将自己理解的跟大家分享.有表述不当之处,望大神们斧正. 一.初窥Scrapy Scrapy是一个为了爬取网站数据,提 ...

  2. Scrapy爬虫框架中的两个流程

    下面对比了Scrapy爬虫框架中的两个流程—— ① Scrapy框架的基本运作流程:② Spider或其子类的几个方法的执行流程. 这两个流程是互相联系的,可对比学习. 1 ● Scrapy框架的基本 ...

  3. Python爬虫教程-31-创建 Scrapy 爬虫框架项目

    本篇是介绍在 Anaconda 环境下,创建 Scrapy 爬虫框架项目的步骤,且介绍比较详细 Python爬虫教程-31-创建 Scrapy 爬虫框架项目 首先说一下,本篇是在 Anaconda 环 ...

  4. Python-S9-Day126——Scrapy爬虫框架

    01 今日内容概要 02 内容回顾和补充:scrapy 03 内容回顾和补充:网络和并发编程 04 Scrapy爬虫框架:pipeline做持久化(一) 05 Scrapy爬虫框架:pipeline做 ...

  5. 手把手教你如何新建scrapy爬虫框架的第一个项目(上)

    前几天给大家分享了如何在Windows下创建网络爬虫虚拟环境及如何安装Scrapy,还有Scrapy安装过程中常见的问题总结及其对应的解决方法,感兴趣的小伙伴可以戳链接进去查看.关于Scrapy的介绍 ...

  6. Scrapy 爬虫框架学习笔记(未完,持续更新)

    Scrapy 爬虫框架 Scrapy 是一个用 Python 写的 Crawler Framework .它使用 Twisted 这个异步网络库来处理网络通信. Scrapy 框架的主要架构 根据它官 ...

  7. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  8. Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】

    (1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...

  9. scrapy爬虫框架学习笔记(一)

    scrapy爬虫框架学习笔记(一) 1.安装scrapy pip install scrapy 2.新建工程: (1)打开命令行模式 (2)进入要新建工程的目录 (3)运行命令: scrapy sta ...

随机推荐

  1. sqlitestudio

    SQLite数据库的特性 特点: 1.轻量级2.独立性,没有依赖,无需安装3.隔离性 全部在一个文件夹系统4.跨平台 支持众多操作系统5.多语言接口 支持众多编程语言6.安全性 事物,通过独占性和共享 ...

  2. UVALive 7503 Change(乱搞)题解

    题意:你现在有面额为A的纸币,现在需要面额为B的钱(可以是一张也可以是好多张拼成一张),有一台自动售货机,里面有任意价格的商品,售货机兑换出的零钱是随机的(比如找你0.03可能给你0.01+0.01+ ...

  3. AT2442 フェーン現象 (Foehn Phenomena)

    题目地址 原题地址 题解 其实就是一个区间加,单点查询的问题 当然可以线段树/树状数组做,但是这两个做法要分类讨论所以代码会比较多 我们考虑一种更简便的做法 差分! 因为温度只和海拔差有关,这相当于题 ...

  4. shiro中authc和user的权限区别

    前者(authc)是认证过,后者(user)是登录过,如果开启了rememberMe功能的话,后者(user)也是可以通过的,而前者(authc)通过不了.故我们用authc来校验一些关键操作,比如购 ...

  5. Unity3D学习笔记(二十九):AssetBundle

    AssetBundle 什么是AssetBundle? AssetBundle是把一些资源文件或场景文件,以某种方式保存在一个文件中.一个AssetBundle可以包含模型.材质.图片或场景等.但是A ...

  6. HDU 5069 Harry And Biological Teacher(AC自动机+线段树)

    题意 给定 \(n\) 个字符串,\(m\) 个询问,每次询问 \(a\) 字符串的后缀和 \(b\) 字符串的前缀最多能匹配多长. \(1\leq n,m \leq 10^5\) 思路 多串匹配,考 ...

  7. 51nod1057-N的阶乘(大数乘法巧解)

    这道大数乘法开始我是想套板子模拟的..然后就发现2/3的例子都wa了.(惊了).然后在思考后发现n2的板子的确过不了这么多的大数.(不看题的下场).所以,我在网上发现了分块求大数的方法.%%% 思路来 ...

  8. try里Response.end()问题

    问题 在xxx.aspx.cs中处理异步请求,大致代码如下: 但会发现始终会进catch. 原因 Response.End()会引发ThreadAbortException. 解决方案 使用HttpC ...

  9. 五、IO编程

    input/output:输入.输出 Stream(流):Input Stream就是数据从外面(磁盘.网络)流进内存,Output Stream就是数据从内存流到外面去.(流:相当于管道) 由于CP ...

  10. python Exception raise

    异常是指程序中的例外,违例情况.异常机制是指程序出现错误后,程序的处理方法.当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理.Exception类是常用的异常类,该类包括Standar ...