Scrapy框架的使用
- pySpider
- 什么是框架?
- 就是一个具有很强通用性且集成了很多功能的项目模板(可以被应用在各种需求中)
- scrapy集成好的功能:
- 高性能的数据解析操作(xpath)
- 高性能的数据下载
- 高性能的持久化存储
- 中间件
- 全栈数据爬取操作
- 分布式:redis
- 请求传参的机制(深度爬取)
- scrapy中合理的应用selenium
- 环境的安装
a. pip3 install wheel b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl d. pip3 install pywin32 e. pip3 install scrapy - 创建工程
- scrapy startproject ProName
- cd ProName
- scrapy genspider spiderName www.xxx.com :创建爬虫文件
- 执行:scrapy crawl spiderName
- settings:
- 不遵从robots协议
- UA伪装
- LOG_LEVEL = 'ERROR'
- LOG_FILE = 'logging.log' - scrapy的数据解析
- extract():列表是有多个列表元素
- extract_first():列表元素只有单个
- scrapy的持久化存储
- 基于终端指令:
- 只可以将parse方法的返回值存储到磁盘文件中
- scrapy crawl first -o file.csv
- 基于管道:pipelines.py
- 编码流程:
- 1.数据解析
- 2.在item的类中定义相关的属性
- 3.将解析的数据存储封装到item类型的对象中.item['p']
- 4.将item对象提交给管道
- 5.在管道类中的process_item方法负责接收item对象,然后对item进行任意形式的持久化存储
- 6.在配置文件中开启管道
- 细节补充:
- 管道文件中的一个管道类表示将数据存储到某一种形式的平台中。
- 如果管道文件中定义了多个管道类,爬虫类提交的item会给到优先级最高的管道类。
- process_item方法的实现中的return item的操作表示将item传递给下一个即将被执行的管道类

实例:抓取虎牙直播名称,直播者昵称和热度

第一种持久化方式(基于终端):

hy.py实例代码:

# -*- coding: utf-8 -*-
import scrapy
class HySpider(scrapy.Spider):
name = 'hy'
# allowed_domains = ['www.xx.com']
start_urls = ['https://www.huya.com/g/3203'] def parse(self, response):
li_list=response.xpath('//*[@id="js-live-list"]/li')
data=[]
for li in li_list:
title=li.xpath("./a[2]/text()").extract_first()
nick=li.xpath("./span/span[1]/i/text()").extract_first()
hot=li.xpath("./span/span[2]/i[2]/text()").extract_first()
dic={"title":title,"nick":nick,"hot":hot}
data.append(dic)
return data

在pycharm终端输入命令:scrapy crawl hy -o huya.csv 回车执行即可。

第二种持久化方式(基于管道):

hy.py代码:

# -*- coding: utf-8 -*-
import scrapy
from huya.items import HuyaItem
class HySpider(scrapy.Spider):
name = 'hy'
# allowed_domains = ['www.xx.com']
start_urls = ['https://www.huya.com/g/3203'] def parse(self, response):
li_list=response.xpath('//*[@id="js-live-list"]/li')
# data=[]*
for li in li_list:
title=li.xpath("./a[2]/text()").extract_first()
nick=li.xpath("./span/span[1]/i/text()").extract_first()
hot=li.xpath("./span/span[2]/i[2]/text()").extract_first()
item=HuyaItem()
item["title"]=title
item["nick"]=nick
item["hot"]=hot
yield item
# dic={"title":title,"nick":nick,"hot":hot}*
# data.append(dic)*
# return data*

item类代码:

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

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html import scrapy class HuyaItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
nick = scrapy.Field()
hot = scrapy.Field()

pipe类代码(同步实例化到本地和mysql中):

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

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import pymysql class HuyaPipeline(object):
def open_spider(self,spider):
print("open_spider start work...")
self.fp=open("huya.txt","w",encoding="utf-8")
def process_item(self, item, spider):
self.fp.write(item["title"]+"--"+item["nick"]+"--"+item["hot"]+"\n")
print(item["title"]+":持久化完毕...")
return item
def close_spider(self,spider):
print("close_spider end work...")
self.fp.close() class mysqlPipeline(object):
def open_spider(self,spider):
print("open_spider start work...")
self.conn=pymysql.Connect(host="127.0.0.1",port=3306,user="root",password="root",db="Spider",charset="utf8")
def process_item(self, item, spider):
sql="insert into huya values ('%s','%s','%s')"%(item["title"],item["nick"],item["hot"])
self.cursor=self.conn.cursor()
try:
self.cursor.execute(sql)
self.conn.commit()
except Exception as e:
self.conn.rollback()
return item
def close_spider(self,spider):
print("close_spider end work...")

setting中需要修改:

ITEM_PIPELINES = {
'huya.pipelines.HuyaPipeline': 300,
'huya.pipelines.mysqlPipeline': 301
}

**如果想要同步持久化到redis中只需要在pipe中添加类:

class RedisPipeLine(object):
conn = None
def open_spider(self,spider):
self.conn = Redis(host='127.0.0.1',port=6379)
def process_item(self,item,spider):
self.conn.lpush('huyaList',item)
return item

**然后修改setting中的ITEM_PIPELINES即可。

Scrapy数据解析和持久化的更多相关文章

  1. 05.Python网络爬虫之三种数据解析方式

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  2. Python爬虫之三种数据解析方式

    一.引入 二.回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需 ...

  3. 05,Python网络爬虫之三种数据解析方式

    回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据 ...

  4. 《Python网络爬虫之三种数据解析方式》

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  5. python爬虫---爬虫的数据解析的流程和解析数据的几种方式

    python爬虫---爬虫的数据解析的流程和解析数据的几种方式 一丶爬虫数据解析 概念:将一整张页面中的局部数据进行提取/解析 作用:用来实现聚焦爬虫的吧 实现方式: 正则 (针对字符串) bs4 x ...

  6. Python网络爬虫之三种数据解析方式 (xpath, 正则, bs4)

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  7. 070.Python聚焦爬虫数据解析

    一 聚焦爬虫数据解析 1.1 基本介绍 聚焦爬虫的编码流程 指定url 基于requests模块发起请求 获取响应对象中的数据 数据解析 进行持久化存储 如何实现数据解析 三种数据解析方式 正则表达式 ...

  8. iOS-数据持久化基础-JSON与XML数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

  9. Request模块—数据解析工具

    一.爬虫基本步骤 指定URL信息 发起请求 获取响应数据 对响应数据进行数据解析 持久化存储 二.数据解析 1. 正则表达式 (1) 基本语法 1. 单字符: . : 除换行以外所有字符 [] :[a ...

  10. 数据解析,懒加载,代理ip

    在前面的requests流程中,还缺少了一步重要的流程,就是在持久化存储之前需要进行制定的数据解析.因为在大多数情况下,我们都会使用聚焦爬虫,也就是爬取页面中的指定部分数据值,而不是整个页面的数据. ...

随机推荐

  1. Ubuntu22.04上使用systemctl命令配置开机自启动服务、脚本、命令

    systemctl介绍 systemctl是Linux系统上用于管理系统服务(systemd单元)的命令行工具.它可以用来启动.停止.重启.禁用.启用.查询和管理系统服务的状态. 以下是一些常用的sy ...

  2. asio 使用 openssl 示例

    #include <boost/asio.hpp> #include <boost/asio/ssl.hpp> #include <boost/algorithm/str ...

  3. Scan Synthesis Practice

    不同上升沿触发器如何进行scan chain DFT实例 Synopsys 工具文档 Mentor DFT脚本 add_clocks 0 clk - 0表示上升沿 Synopsys DFT脚本 更改n ...

  4. JS - dom绑定函数中 return false 的作用

    1,可以阻止事件冒泡 2,可以阻止浏览器默认操作

  5. Laravel - blade 基础语法和include的使用

    <!-- 1. 模板中输出PHP变量 --> @section('footer')    <div style="color:#fff">     @par ...

  6. 海思Hi35xx 实现本地和远程升级程序的方法

    前言 嵌入式linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级. 本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级. 这里介绍一种同时至此本地和 ...

  7. 【中介者模式(Mediator)】使用Java实现中介者模式

    引言 中介者,何为中介者,顾名思义就是我们的在处理A和B之间的关系的时候,引入一个中间人,来处理这两者之间的关系,例如生活中我们需要去租房,买房,都会有中介,来处理房东和租客之间的协调关系,这个就是中 ...

  8. [转帖]Nginx内置变量以及日志格式变量参数详解

    https://www.cnblogs.com/wajika/p/6426270.html $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求 ...

  9. [转帖]基于Fuse的用户态文件系统性能优化几点建议

    https://zhuanlan.zhihu.com/p/68085075 目前很多文件系统基于Fuse( http://fuse.sourceforge.net/ )开发,在较为深入钻研Fuse实现 ...

  10. [转帖]部署Alertmanager

    https://flashcat.cloud/docs/content/flashcat-monitor/prometheus/alert/manager-install/ Alertmanager和 ...