1.scrapy爬取的数据保存到es中

先建立es的mapping,也就是建立在es中建立一个空的Index,代码如下:执行后就会在es建lagou 这个index。


from datetime import datetime

from elasticsearch_dsl import DocType, Date, Nested, Boolean, \

analyzer, InnerDoc, Completion, Keyword, Text, Integer

from elasticsearch_dsl.connections import connections

connections.create_connection(hosts=["localhost"])

class LagouType(DocType):

# url_object_id = Keyword()

url = Keyword()

title = Text(analyzer="ik_max_word")

salary = Keyword()

job_city = Keyword()

work_years = Text(analyzer="ik_max_word")

degree_need = Keyword()

job_type = Text(analyzer="ik_max_word")

publish_time = Date()

tags = Text(analyzer="ik_max_word")

job_advantage = Text(analyzer="ik_max_word")

job_desc = Text(analyzer="ik_max_word")

job_addr = Text(analyzer="ik_max_word")

company_url = Keyword()

company_name = Text(analyzer="ik_max_word")

crawl_time = Date()

# min_salary = Integer()

# max_salary = Integer()

class Meta:

index = ‘lagou‘

doc_type = "jobs"

if __name__ == "__main__":

LagouType.init()

接着在items 中定义到保存到es的代码,代码如下:

from
lagou.models.es_type
import
LagouType


class LagouJobItem(scrapy.Item):

url_object_id = scrapy.Field()

url = scrapy.Field()

title= scrapy.Field()

salary= scrapy.Field()

job_city= scrapy.Field()

work_years= scrapy.Field()

degree_need= scrapy.Field()

job_type= scrapy.Field()

publish_time = scrapy.Field()

tags= scrapy.Field()

job_advantage= scrapy.Field()

job_desc= scrapy.Field()

job_addr= scrapy.Field()

company_url = scrapy.Field()

company_name= scrapy.Field()

crawl_time= scrapy.Field()

min_salary=scrapy.Field()

max_salary= scrapy.Field()

def save_to_es(self):

lagou_type=LagouType()

lagou_type.url=self["url"]

lagou_type.title=self["title"]

lagou_type.salary=self["salary"]

lagou_type.job_city=self["job_city"]

lagou_type.work_years=self["work_years"]

lagou_type.degree_need=self[‘degree_need‘]

lagou_type.job_type=self[‘job_type‘]

lagou_type.publish_time=self[‘publish_time‘]

lagou_type.tags=self[‘tags‘]

lagou_type.job_advantage=self[‘job_advantage‘]

lagou_type.job_desc=self[‘job_desc‘]

lagou_type.job_addr=self[‘job_addr‘]

lagou_type.company_url=self[‘company_url‘]

lagou_type.company_name=self[‘company_name‘]

lagou_type.crawl_time=self[‘crawl_time‘]

lagou_type.meta.id=self[‘url_object_id‘]

lagou_type.save()

return

接下来就是在piplines文件中定义保存到es的pipline


class ElasticsearchPipline(object):

def process_item(self, item, spider):

item.save_to_es()

return item

之后就是到settings中进行设置。把这个pipline加入到item_pipline中

‘lagou.pipelines.ElasticsearchPipline‘:300

这样就可以将爬取到的数据保存到es中

详细说明:

elasticsearch官方也提供了一个python操作elasticsearch(搜索引擎)的接口包,就像sqlalchemy操作数据库一样的ORM框,这样我们操作elasticsearch就不用写命令了,用elasticsearch-dsl-py这个模块来操作,也就是用python的方式操作一个类即可

elasticsearch-dsl-py下载

下载地址:https://github.com/elastic/elasticsearch-dsl-py

文档说明:http://elasticsearch-dsl.readthedocs.io/en/latest/

首先安装好elasticsearch-dsl-py模块

1、elasticsearch-dsl模块使用说明

create_connection(hosts=[‘127.0.0.1‘]):连接elasticsearch(搜索引擎)服务器方法,可以连接多台服务器

class Meta:设置索引名称和表名称

索引类名称.init(): 生成索引和表以及字段

实例化索引类.save():将数据写入elasticsearch(搜索引擎)

from elasticsearch_dsl.connections import connections # 导入连接elasticsearch(搜索引擎)服务器方法
connections.create_connection(hosts=[‘127.0.0.1‘]) #连接到本地

class lagouType(DocType): # 自定义一个类来继承DocType类
# Text类型需要分词,所以需要知道中文分词器,ik_max_wordwei为中文分词器
title = Text(analyzer="ik_max_word") # 设置,字段名称=字段类型,Text为字符串类型并且可以分词建立倒排索引
description = Text(analyzer="ik_max_word")
keywords = Text(analyzer="ik_max_word")
url = Keyword() # 设置,字段名称=字段类型,Keyword为普通字符串类型,不分词
riqi = Date() # 设置,字段名称=字段类型,Date日期类型

class Meta: # Meta是固定写法
index = "lagou" # 设置索引名称(相当于数据库名称)
doc_type = ‘jobs‘ # 设置表名称

if __name__ == "__main__": # 判断在本代码文件执行才执行里面的方法,其他页面调用的则不执行里面的方法
lagouType.init() # 生成elasticsearch(搜索引擎)的索引,表,字段等信息

原文地址:https://www.cnblogs.com/liuqianli/p/8480159.html

时间: 2024-10-28 12:47:05

1.scrapy爬取的数据保存到es中的相关文章

将爬取的数据保存到Excel表格

第一步.导入模块 import xlwt # 导入写入excel需要的包第二步.定义函数,将爬取好的数据保存到excel文件中,下面以保存python的关键词为例,介绍详细流程. def write_to_excel(filename, lst): # 为防止写入失败,捕获异常 try: # 1 创建一个workbook,相当于创建excel文件 work_book = xlwt.Workbook(encoding='utf-8') # 2 创建一个sheet表单 sheet = work_bo

Scrapy爬取全站数据并存储到数据库和文件中

scrapy五大核心组件简介 引擎(Scrapy) 用来处理整个系统的数据流处理, 触发事务(框架核心) 调度器(Scheduler) 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 下载器(Downloader) 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) 爬虫(Spiders) 爬虫

Excel文件数据保存到SQL中

1.获取DataTable /// <summary> /// 查询Excel文件中的数据 /// </summary> /// <param name="strPath">文件路径</param> /// <param name="sheetName">工作表名</param> /// <returns>DataTable</returns> public DataTa

在scrapy中将数据保存到mongodb中

利用item pipeline可以实现将数据存入数据库的操作,可以创建一个关于数据库的item pipeline 需要在类属性中定义两个常量 DB_URL:数据库的URL地址 DB_NAME:数据库的名字 在Spider爬取的整个过程中,数据库的连接和关闭操作只需要进行一次就可以,应该在开始处理之前就要连接数据库,并在处理完所有数据之后就关闭数据库.所以需要在open_spider和close_spider中定义数据库的连接和关闭操作 在process_item中实现MongoDB的写入操作,使

PHP操作:将数据库中的数据保存到Word中。

1.首先定义了一个word类 <?php class word { function start() { ob_start(); ob_start — 打开输出控制缓冲 } function save($path) { $data = ob_get_contents(); ob_get_contents — 返回输出缓冲区的内容 ob_end_clean(); ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲 $this->wirtetoword($path,$data); }

使用scrapy爬取页面数据到入库遇到的问题

1.编码问题 页面是gbk的,数据库是utf8的 gbk到utf8的转化得通过unicode编码:gbk <--unicode-->utf8 具体参考 http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html scrapy从页面抓到的数据自动转化为unicode了所有把抓到的数据直接encode('utf8'),就变成utf8编码了 入库时发生了数据库中文乱码,原来python再连接mysql的时候需要制定编码格式 db=MySQL

scrapy爬取天气数据

看了scrapy,打算构建自己的天气数据,目标源:就是你了,中国天气网! 仔细点两下这个网站,发现可以由各个省.直辖市到省市所属的地级市,再到各县,页面在这: 点开就可以看到中国所有的省.直辖市,但港澳台的天气数据没有,所以就把这三个地区过滤掉. 接下来,就是一步步的解析,基本上没什么好讲的,最后把结果存入mongodb.项目地址: WeatherCrawler

如何将MATLAB数据保存到Excel中

最近做仿真的时候需要用到这个功能,所以网上搜了一下,找到一个可行的方法. ----------------------------------------------------------------------------- excel = actxserver('excel.application');  % 打开一个excel操作对象set(excel,'visible',2);                   % 使excel对象可见,即打开excel窗口, % 实际应用时设置其为

将添加的表格框中数据保存到_data中,

//找到行数将修改的数据传到_data的FISH_NAME中$('table').on('click','.drop-item',function(){ var _data = self.FishConfigList(); console.log(_data); var liText = $(this).text(); var indexi = $(this).closest('tr').index(); _data[indexi].FISH_NAME =liText; return _data