爬虫之 案列1补充(pipelines优化)
1. 先打开settings.py文件将 'ITEM_PIPELINES'启动(取消注释即可)

2. spider代码
# -*- coding: utf-8 -*-
import scrapy
import json class TzcSpider(scrapy.Spider):
# spider的名字,唯一
name = 'tzc'
# 起始地址
start_urls = ['https://hr.tencent.com/position.php?keywords=python&tid=0&lid=2268'] # 每个url爬取之后会调用这个方法
def parse(self, response):
tr = response.xpath( '//table[@class="tablelist"]/tr[@class = "even"]|//table[@class="tablelist"]/tr[@class = "odd"]')
if tr:
for i in tr:
data = {
"jobName": i.xpath('./td[1]/a/text()').extract_first(),
"jobType":i.xpath('./td[2]/text()').extract_first(),
"Num":i.xpath('./td[3]/text()').extract_first(),
"Place":i.xpath('./td[4]/text()').extract_first(),
"Time":i.xpath('./td[5]/text()').extract_first()
}
# 将数据变成json数据便于存储
# data = json.dumps(data,ensure_ascii=False)
yield data
# 寻找下一页标签
url_next = response.xpath('//a[@id = "next"]/@href').extract_first()
# 提取的是段标签,需要加上域名
url_next = 'https://hr.tencent.com/{}'.format(url_next)
# 返回下一页地址,scrapy会递归
yield scrapy.Request(url_next)
3. pipelines.py代码
import json class TanzhouPipeline(object):
def process_item(self, item, spider):
# 数据json化
item = json.dumps(item,ensure_ascii=False)
self.f.write(item)
self.f.write('\n')
return item
# 爬虫开启时运行
def open_spider(self,spider):
# 打开文件
self.f = open('info3.json','w')
# 爬虫关闭时运行
def close_spider(self,spider):
# 关闭文件
self.f.close()
4. 补充2,防止item不规范,可以使用items.py文件对其限制(还要改spider中的item代码)(还要修改pipelines中的代码,要先dict(item)转化成字典,再json转化)
pipeline.py中先转化成字典dict()再json转化:
item = json.dumps(dict(item),ensure_ascii=False)
items.py代码:
import scrapy class TanzhouItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
jobName = scrapy.Field()
jobType = scrapy.Field()
Num = scrapy.Field()
Place = scrapy.Field()
Time =scrapy.Field()
spider代码:
import scrapy
import json
from ..items import TanzhouItem class TzcSpider(scrapy.Spider):
# spider的名字,唯一
name = 'tzc'
# 起始地址
start_urls = ['https://hr.tencent.com/position.php?keywords=python&tid=0&lid=2268'] # 每个url爬取之后会调用这个方法
def parse(self, response):
tr = response.xpath( '//table[@class="tablelist"]/tr[@class = "even"]|//table[@class="tablelist"]/tr[@class = "odd"]')
if tr:
for i in tr:
# 自定义字典的方式,下面是第二种方式
data = {
"jobName": i.xpath('./td[1]/a/text()').extract_first(),
"jobType":i.xpath('./td[2]/text()').extract_first(),
"Num":i.xpath('./td[3]/text()').extract_first(),
"Place":i.xpath('./td[4]/text()').extract_first(),
"Time":i.xpath('./td[5]/text()').extract_first()
}
# 第二种方式,用items.py约束
# data = TanzhouItem()
# data["jobName"] = i.xpath('./td[1]/a/text()').extract_first()
# data["jobType"] = i.xpath('./td[2]/text()').extract_first()
# data["Num"] = i.xpath('./td[3]/text()').extract_first()
# data["Place"] = i.xpath('./td[4]/text()').extract_first()
# data["Time"] = i.xpath('./td[5]/text()').extract_first()
# 将数据变成json数据便于存储
# data = json.dumps(data,ensure_ascii=False)
yield data
# 寻找下一页标签
url_next = response.xpath('//a[@id = "next"]/@href').extract_first()
# 提取的是段标签,需要加上域名
url_next = 'https://hr.tencent.com/{}'.format(url_next)
# 返回下一页地址,scrapy会递归
yield scrapy.Request(url_next)
爬虫之 案列1补充(pipelines优化)的更多相关文章
- 2021年-在windwos下如何用TOMACT发布一个系统(完整配置案列)
2021年新年第一篇:博主@李宗盛-关于在Windwos下使用TOMCAT发布一个系统的完成配置案列. 之前写过关于TOMCAT的小篇幅文档,比较分散,可以作为对照与参考. 此篇整合在一起,一篇文档写 ...
- Spring MVC的配置文件(XML)的几个经典案列
1.既然是配置文件版的,那配置文件自然是必不可少,且应该会很复杂,那我们就以一个一个的来慢慢分析这些个经典案列吧! 01.实现Controller /* * 控制器 */ public class M ...
- js闭包的作用域以及闭包案列的介绍:
转载▼ 标签: it js闭包的作用域以及闭包案列的介绍: 首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...
- SAMSUNG某型号一千短信成功记录!对比其他软件恢复不成功的案列!
Hello! 大家好欢迎再次来到Dr.wonde的博客, 下面谈一下今天的案列,今年11月26号收到了一客户寄来的三星S4手机恢复里面短信, 如下图所示,用其他软件恢复以后,数据为零,没有恢复,,这下 ...
- php知识案列分享
今天再跟大家分享一下,以下案列. 使用array_flip函数生成随机数,可以去掉重复值. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 < ...
- linux下mysql函数的详细案列
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *pas ...
- axis1,xfire,jUnit 测试案列+开Web Service开发指南+axis1.jar下载 代码
axis1,xfire,jUnit 测试案列+Web Service开发指南(中).pdf+axis1.jar下载 代码 项目和资源文档+jar 下载:http://download.csdn. ...
- 大数据技术之_14_Oozie学习_Oozie 的简介+Oozie 的功能模块介绍+Oozie 的部署+Oozie 的使用案列
第1章 Oozie 的简介第2章 Oozie 的功能模块介绍2.1 模块2.2 常用节点第3章 Oozie 的部署3.1 部署 Hadoop(CDH版本的)3.1.1 解压缩 CDH 版本的 hado ...
- react 的安装和案列Todolist
react 的安装和案列Todolist 1.react的安装和环境的配置 首先检查有没有安装node.js和npm node -v npm -v 查看相关版本 2.安装脚手架工具 2.构建:crea ...
随机推荐
- 46)django-发送邮件
django已封装好了邮件发送功能,可以直接调用发送模块 1. 配置相关参数 如果用的是 阿里云的企业邮箱,则类似于下面: 在 settings.py 的最后面加上类似这些 EMAIL_BACKEND ...
- swift 学习- 27 -- 访问控制
// 访问控制 可以限定其源文件 或模块中的代码对你的代码的访问级别, 这个特性可以让我们隐藏代码的一些实现细节, 并且可以为其他人可以访问和使用的代码提供接口 // 你可以明确地给某个类型 (类, ...
- select下拉框使用完毕后,重置按钮使其清空
需求描述:select下拉框后边有两个按钮,一个查询,一个重置,点击重置,select会清空之前选择的那个查询条件 解决思路:卧槽,这不so easy 么,用那个jQ封装的trigger函数搞定啊,对 ...
- bzoj1977次小生成树(重要)
#include<cstdio> #include<iostream> #include<cstring> #include<queue> #inclu ...
- poj1094 恶心题,,每次加边进行判断
/* 给定一组偏序关系,问最少第几步能确定次序 如果出现环,问第几步出现环 因为要求第几步确定次序或者第几步出现环,所以每次读入一个偏序关系就进行一次拓扑排序 */ #include <iost ...
- tinymce-vue富文本编辑器(翻译)
官方Tinymce Vue组件 翻译来自:https://github.com/tinymce/tinymce-vue 官方文档:https://www.tiny.cloud/docs/general ...
- 安装Mycat 曾经踩的那些坑
1. INFO | jvm | ----/--/-- --:--:-- | Caused by: io.mycat.config.util.ConfigException: schema TEST d ...
- docker批量删除none镜像
1.直接用docker images | grep none | awk ‘{print $3}’ |xgars docker rmi 通过关键字搜索,得到docker id,进行删除
- 史上最简单的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)
上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如 ...
- PAT Basic 1073. 多选题常见计分法
题目内容 多选题常见计分法(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 批改多选题是比较麻烦的事情,有 ...