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流程中,还缺少了一步重要的流程,就是在持久化存储之前需要进行制定的数据解析.因为在大多数情况下,我们都会使用聚焦爬虫,也就是爬取页面中的指定部分数据值,而不是整个页面的数据. ...
随机推荐
- 0x42 数据结构进阶-树状数组
A题 楼兰图腾 链接:https://ac.nowcoder.com/acm/contest/1032/A 树状数组 + 逆序对 #include<bits/stdc++.h> using ...
- POJ - 1113 Wall (凸包模板) Graham Scan 算法实现
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- ldap sssd授权linux登录
业务系统越来越多,服务器也越来越多,本文主要是给企业用户减少账号密码管理难度的. 目的:使用ldap统一管理账号密码,实现单点登录linux. 一点废话,网上找了很多文章,看得云里雾里,搞了几天算是搞 ...
- webpack4.0+简要
一.webpack简介 webpack 是当下十分流行的一款静态模块打包工具,将JS.CSS.HTML.图片等各种静态资源视为一个个模块,通过一个或者多个入口文件通过解析依赖关系生成一个依赖图,最终打 ...
- C# 从桌面右下角显示 Popup 窗口提醒
上图演示 private void display_Click(object sender, EventArgs e) { Frm_Info.Instance().ShowForm();//显示窗体 ...
- python之configparser类的使用
一.定义配置文件格式如下:data.conf [interface] url=http://192.168.37.8:7777/api/mytest2 [switch] switch_car=on [ ...
- Go socket 编程源码解析(上)
0. socket 介绍 Liunx 中一切皆文件.通过文件描述符和系统调用号可以实现对任何设备的访问.同样的,socket 也是一种文件描述符.通过 socket 可以建立网络传输.对于 TCP 和 ...
- SV Interface and Program 2
Clocking:激励的时序 memory检测start信号,当start上升沿的时候,如果write信号拉高之后,将data存储到mem中 start\write\addr\data - 四个信号是 ...
- 【ThreadX-GUIX】Azure RTOS GUIX和Azure RTOS GUIX Studio概述
Azure GUIX嵌入式GUI是Microsoft的高级工业级GUI解决方案,专门针对深度嵌入式,实时和IoT应用程序而设计.Microsoft还提供了名为Azure RTOS GUIX Studi ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.23)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...