Scrapy数据解析和持久化
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数据解析和持久化的更多相关文章
- 05.Python网络爬虫之三种数据解析方式
引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...
- Python爬虫之三种数据解析方式
一.引入 二.回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需 ...
- 05,Python网络爬虫之三种数据解析方式
回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据 ...
- 《Python网络爬虫之三种数据解析方式》
引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...
- python爬虫---爬虫的数据解析的流程和解析数据的几种方式
python爬虫---爬虫的数据解析的流程和解析数据的几种方式 一丶爬虫数据解析 概念:将一整张页面中的局部数据进行提取/解析 作用:用来实现聚焦爬虫的吧 实现方式: 正则 (针对字符串) bs4 x ...
- Python网络爬虫之三种数据解析方式 (xpath, 正则, bs4)
引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...
- 070.Python聚焦爬虫数据解析
一 聚焦爬虫数据解析 1.1 基本介绍 聚焦爬虫的编码流程 指定url 基于requests模块发起请求 获取响应对象中的数据 数据解析 进行持久化存储 如何实现数据解析 三种数据解析方式 正则表达式 ...
- iOS-数据持久化基础-JSON与XML数据解析
解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...
- Request模块—数据解析工具
一.爬虫基本步骤 指定URL信息 发起请求 获取响应数据 对响应数据进行数据解析 持久化存储 二.数据解析 1. 正则表达式 (1) 基本语法 1. 单字符: . : 除换行以外所有字符 [] :[a ...
- 数据解析,懒加载,代理ip
在前面的requests流程中,还缺少了一步重要的流程,就是在持久化存储之前需要进行制定的数据解析.因为在大多数情况下,我们都会使用聚焦爬虫,也就是爬取页面中的指定部分数据值,而不是整个页面的数据. ...
随机推荐
- XShell、XFtp免费许可证增强:删除标签限制!
大家好,我是DD! XShell相信大家都不陌生了,作为Windows平台下最强大的SSH工具,是大部分开发者的必备工具.但由于免费许可证的标签限制,有不少开发者会去找破解版使用.虽然功能是可以使用了 ...
- #1016:Prime Ring Problem(经典DFS)
原题链接 题意:很容易理解,就是让你输出满足相邻的相加是素数的序列(注意不要重复) 思路就是深搜思想把每种情况遍历一次 代码实现: #include<iostream> #include& ...
- 深度学习(三)——Transforms的使用
一.Transforms的结构及用法 导入transforms from torchvision import transforms 作用:图片输入transforms后,可以得到一些预期的变换 1. ...
- Java 子父类型集合之间的转换
假设现在有这样一个方法,入参是父类型的集合参数,这是个通用方法,你需要共用它,你现在要传子类型集合进去,怎么办? class Animal { } class Dog extends Animal { ...
- com.alibaba.fastjson.JSONException: create instance error
很早之前在使用FashJson进行实体类转化的时候,如果json参数是多层都是一层对应一个单独的实体类, 今天在项目中想,使用内部类是不是也可以实现,且使用内部类封装性更好.当将json串使用fast ...
- css : object-fit 兼容 ie 的解决方案
通过 github 搜索 object-fit ie , 借鉴大佬兼容 ie 的经验. 下载解压到文件夹 , 打开测试目录 , 查看 demo 使用 ie 打开demo , 查看显示效果 : 代码 ...
- java - 运行可执行文件 (.exe)
package filerun; import java.io.File; import java.io.IOException; public class RunExe { public stati ...
- TLS1.3的简单学习
TLS1.3的简单学习 TLS的历史 From GTP3.5 TLS(传输层安全)是一种加密协议,旨在确保 Internet 通信的安全性和隐私保护.下面是 TLS 的历史概述: SSL(安全套接层) ...
- [转帖]HikariCP常用监控指标与故障排查实战
编者有言:本书由资深数据库连接池专家撰写,褚霸.德哥.张亮.吴晟等近10位专家高度评价,从设计思想.功能使用.原理实现.工程实践.技术扩展5个维度对HikariCP进行全面讲解和深入分析. 本文将带你 ...
- [转帖]datax安装+配置+使用文档
1 DataX离线同步工具DataX3.0介绍 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hiv ...