本篇主要介绍,爬取html数据后,将html的正文内容存储为json或csv格式。

json格式存储

选定要爬取的网站后,我们利用之前学过的内容,如:Beautiful Soup、xpath等方式解析,来获取我们希望得到的内容。

获取数据

首先使用urllib访问页面https://www.lagou.com/zhaopin/Python/?labelWords=label
获取html内容,代码如下:

from urllib import request
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
try:url = 'https://www.lagou.com/zhaopin/Python/?labelWords=label'header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'}req = request.Request(url, headers=header)response = request.urlopen(req).read().decode('utf-8')
except request.URLError as e:if hasattr(e, 'reason'):print(e.reason)elif hasattr(e, 'code'):print(e.code)

通过上面的代码获取了html内容,接下来就要分析html来提取我们需要的内容了。
打开拉钩页面,使用ctrl+ F12打开火狐浏览器工具,可以看到我们想要获取的内容,职位、工作地点、薪资、发布的公司等信息都在一个div中,如下图:
下一步我们就使用之前介绍过的Beautiful Soup获取这个div内容,同时也可以获取我们需要的内容,通过工具我们可以看到我们需要的内容所在的标签,见下图:

# 生成soup实例
soup = BeautifulSoup(response, 'lxml')
# 获取class=‘list_item_top’的div标签
divlist = soup.find_all('div', class_='list_item_top')
# 定义空列表
content = []
# 通过循环,获取需要的内容
for list in divlist:# 职位名称job_name = list.find('h3').string# 职位详细页面link = list.find('a', class_="position_link").get('href')# 招聘的公司company = list.find('div', class_='company_name').find('a').string# 薪水salary = list.find('span', class_='money').stringprint(job_name, company, salary, link)content.append({'job': job_name, 'company': company, 'salary': salary, 'link': link})

都是通过Beautiful Soup的方法获取的内容,如果不懂,大家可以翻翻之前的工具篇。输出的内容如下:

Python 开发工程师 还呗-智能信贷领先者 10k-15k https://www.lagou.com/jobs/2538412.html
Python开发工程师 天玑科技 10K-20K https://www.lagou.com/jobs/3608088.html
Python 兜乐科技 6k-12k https://www.lagou.com/jobs/4015725.html
Python 妙计旅行 8k-16k https://www.lagou.com/jobs/3828627.html
Python工程师 洋钱罐 25k-35k https://www.lagou.com/jobs/3852092.html
Python软件开发工程师 深信服科技集团 15k-20k https://www.lagou.com/jobs/4009780.html
Python开发 问卷网@爱调研 15k-25k https://www.lagou.com/jobs/3899604.html
Python Veeva 25k-35k https://www.lagou.com/jobs/3554732.html
python工程师 多麦 10k-20k https://www.lagou.com/jobs/3917781.html
python工程师 北蚁 8k-12k https://www.lagou.com/jobs/3082699.html
python研发工程师 数美 15k-30k https://www.lagou.com/jobs/3684787.html
python开发工程师 紫川软件 12k-19k https://www.lagou.com/jobs/3911802.html
python开发工程师 老虎证券 20k-40k https://www.lagou.com/jobs/3447959.html
Python开发 印孚瑟斯 10k-20k https://www.lagou.com/jobs/3762196.html
Python工程师 江苏亿科达 10k-20k https://www.lagou.com/jobs/3796922.html

好,数据有了,就差存储了。

数据存储(json)

python通过json模块对数据进行编码和解码。编码过程是,通过json模块的dumps和dump对数据进行python对象到json对象的转换,解码过程是,通过json模块的loads和load对数据进行json对象到python对象的转换。
编码
dump将python 对象序列化为一个JSON格式的流,存储到文件,转换时类型变化如下:

json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

dumps将obj序列化为JSON格式的str
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

解码
load对Python对象进行反序列化,可以从文件读取
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)


oads对Python对象进行反序列化
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

了解了json操作,现在就可以把之前获取的拉钩数据存储为json了,见下面代码:

with open('lagou.json', 'w') as fp:# indent表示缩进,如果输入这个参数,json的数据会按照找个缩进存储# 如果不设置,则按最紧凑方式存储json.dump(content, fp=fp, indent=4)

好了,存储为json格式就说到这里了。完整代码如下:

import json
from bs4 import BeautifulSoup
from urllib import requesttry:url = 'https://www.lagou.com/zhaopin/Python/?labelWords=label'header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'}req = request.Request(url, headers=header)response = request.urlopen(req).read().decode('utf-8')
except request.URLError as e:if hasattr(e, 'reason'):print(e.reason)elif hasattr(e, 'code'):print(e.code)# 生成soup实例
soup = BeautifulSoup(response, 'lxml')
# 获取class=‘list_item_top’的div标签
divlist = soup.find_all('div', class_='list_item_top')
# 定义空列表
content = []
# 通过循环,获取需要的内容
for list in divlist:# 职位名称job_name = list.find('h3').string# 职位详细页面link = list.find('a', class_="position_link").get('href')# 招聘的公司company = list.find('div', class_='company_name').find('a').string# 薪水salary = list.find('span', class_='money').stringprint(job_name, company, salary, link)content.append({'job': job_name, 'company': company, 'salary': salary, 'link': link})with open('lagou.json', 'w') as fp:# indent表示缩进,如果输入这个参数,json的数据会按照找个缩进存储# 如果不设置,则按最紧凑方式存储json.dump(content, fp=fp, indent=4)

csv格式存储

所谓的CSV(Comma Separated Values)格式是电子表格和数据库最常用的导入和导出格式。
python的csv模块实现类以csv格式读取和写入表格数据。它允许程序员说,“以Excel的格式编写这些数据”,或者“从Excel生成的文件中读取数据”,而不知道Excel使用的CSV格式的详细信息。程序员还可以描述其他应用程序所理解的CSV格式,或者定义他们自己的专用CSV格式。

写数据到csv文件中

# -*- coding: utf-8 -*-
import csv# 定义第一行
header = ['id', 'name']
# 2条数据
d1 = [1, "xiaoming"]
d2 = [2, "lucy"]# 打开csv文件,newline作用是去掉空行,不加结果之间会有一个空行
with open('test.csv', 'w', newline='') as f:# 建立写入对象writer = csv.writer(f)# 写入数据writer.writerow(header)writer.writerow(d1)writer.writerow(d2)

生成的csv文件内容如下:

id,name
1,xiaoming
2,lucy

写字典到csv文件

import csvwith open('names.csv', 'w', newline='') as csvfile:# 定义名称,也就是headerfieldnames = ['first_name', 'last_name']# 直接将fieldnames写入,写入字典使用DictWriter方法writer = csv.DictWriter(csvfile, fieldnames=fieldnames)# 调用writeheader方法加入headerwriter.writeheader()# 写入字典数据writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

获取的csv文件内容如下:

first_name,last_name
Baked,Beans
Lovely,Spam
Wonderful,Spam

读取csv文件

import csvwith open('xingming.csv', 'r') as f:# 创建reader对象reader = csv.reader(f)# reader是可迭代对象,可以通过for循环获取内容for row in reader:print(row)

结果如下:

['id', 'name']
['1', 'xiaoming']
['2', 'lucy']

以字典形式读入csv文件

import csvwith open('names.csv', 'r') as f:# 定义字典阅读对象reader = csv.DictReader(f)# 打印第一行名称print(reader.fieldnames)# 循环打印字典内容for row in reader:print(row['first_name'], row['last_name'])

输出结果:

['first_name', 'last_name']
Baked Beans
Lovely Spam
Wonderful Spam

所以爬取拉钩网数据,如果存储到csv文件的代码如下:

import csv
from bs4 import BeautifulSoup
from urllib import request
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
try:url = 'https://www.lagou.com/zhaopin/Python/?labelWords=label'header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'}req = request.Request(url, headers=header)response = request.urlopen(req).read().decode('utf-8')
except request.URLError as e:if hasattr(e, 'reason'):print(e.reason)elif hasattr(e, 'code'):print(e.code)# 生成soup实例
soup = BeautifulSoup(response, 'lxml')
# 获取class=‘list_item_top’的div标签
divlist = soup.find_all('div', class_='list_item_top')
# 定义空列表
content = []
# 通过循环,获取需要的内容
for list in divlist:# 职位名称job_name = list.find('h3').string# 职位详细页面link = list.find('a', class_="position_link").get('href')# 招聘的公司company = list.find('div', class_='company_name').find('a').string# 薪水salary = list.find('span', class_='money').string# print(job_name, company, salary, link)content.append({'job': job_name, 'company': company, 'salary': salary, 'link': link})with open('lagou.csv', 'a', newline='') as f:# 定义headerfieldnames = ['job', 'company', 'salary', 'link']# 通过DictWriter方法写入字典writer = csv.DictWriter(f, fieldnames=fieldnames)# 写入headerwriter.writeheader()# 循环获取content内容,写入csv文件for row in content:writer.writerow(row)

获取的数据如下:

突然发现今天的例子还是存为csv格式合适,找工作新技能,你get了吗~!

Python爬虫进阶教程(五):数据存储相关推荐

  1. python爬虫(四)数据存储

    python爬虫(四)数据存储 JSON文件存储 JSON是一种轻量级的数据交换格式,它是基于ECMAScript的一个子集 JSON采用完全独立于语言的文本格式 JSON在Python中分别由lis ...

  2. python爬虫进阶教程:百万英雄答题辅助系统

    一.前言 看了网上很多的教程都是通过OCR识别的,这种方法的优点在于通用性强.不同的答题活动都可以参加,但是缺点也明显,速度有限,并且如果通过调用第三方OCR,有次数限制.但是使用本教程提到的数据接口 ...

  3. Python爬虫进阶五之多线程的用法

    前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread ...

  4. Python爬虫爬取网页数据并存储(一)

    Python爬虫爬取网页数据并存储(一) 环境搭建 爬虫基本原理 urllib库使用 requests库使用 正则表达式 一个示例 环境搭建 1.需要事先安装anaconda(或Python3.7)和 ...

  5. 从Python爬虫到Spark预处理数据的真实需求[五](Spark)

    絮叨两句: 博主是一名软件工程系的在校生,利用博客记录自己所学的知识,也希望能帮助到正在学习的同学们 人的一生中会遇到各种各样的困难和折磨,逃避是解决不了问题的,唯有以乐观的精神去迎接生活的挑战 少年 ...

  6. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  7. python爬虫项目实战教学视频_('[Python爬虫]---Python爬虫进阶项目实战视频',)

    爬虫]---Python 爬虫进阶项目实战 1- Python3+Pip环境配置 2- MongoDB环境配置 3- Redis环境配置 4- 4-MySQL的安装 5- 5-Python多版本共存配 ...

  8. python爬虫数据分析可以做什么-python爬虫爬取的数据可以做什么

    在Python中连接到多播服务器问题,怎么解决你把redirect关闭就可以了.在send时,加上参数allow_redirects=False 通常每个浏览器都会设置redirect的次数.如果re ...

  9. 爬虫进阶教程:极验(GEETEST)验证码破解教程

    原文链接及原作者:爬虫进阶教程:极验(GEETEST)验证码破解教程 | Jack Cui 一.前言 爬虫最大的敌人之一是什么?没错,验证码![Geetest]作为提供验证码服务的行家,市场占有率还是 ...

  10. 从Python爬虫到Spark预处理数据的真实需求[三]

    絮叨两句: 博主是一名软件工程系的在校生,利用博客记录自己所学的知识,也希望能帮助到正在学习的同学们 人的一生中会遇到各种各样的困难和折磨,逃避是解决不了问题的,唯有以乐观的精神去迎接生活的挑战 少年 ...

最新文章

  1. emoji表情 与 iconfont 一锅炖
  2. mysql需要下载调试_Mysql安装和调试
  3. mysql数据类型查询命令_Linux命令:MySQL系列之三--mysql数据类型及SQL结构化查询语句使用...
  4. win7 clr20r3程序终止_mscorsvw.exe是什么进程 win7系统怎么禁用mscorsvw.exe进程【禁用方法】...
  5. asp接收ajax乱码_Asp中处理AJAX乱码问题总结
  6. [转载] 详解Java中的泛型
  7. 使用solrj和EasyNet.Solr进行原子更新
  8. 轨道病害视觉检测:背景、方法与趋势
  9. c语言if判断文件_例8:C语言实现输入一个数,输出相应result
  10. 英语----情态动词---半情态动词
  11. Java集合---HashMap源码剖析
  12. 我作为数字产品设计师的十大宠儿
  13. android 评论发表情,安卓手机怎么在微信朋友圈评论发表情包?
  14. hsi i均衡化 java_HSI颜色下图像的均衡化MATLAB
  15. 怎么写出计算机SCI论文
  16. 论文阅读 Adaptive Consistency Regularization for Semi-Supervised Transfer Learning
  17. rviz一些无法正常显示的问题
  18. 【python 爬虫】 scrapy 入门--爬取百度新闻排行榜
  19. Python实现一个论文下载器
  20. 如何写网络营销用的成功案例文章

热门文章

  1. 详细介绍光纤跳线接口类型PC, APC, UPC
  2. mysql5.7优化
  3. 18软工实践-团队现场编程实战(抽奖系统)
  4. 国内外RTI产品调查情况
  5. Android中补间动画相关知识
  6. Python正态云发生器
  7. 一个农村博士的独白:全家为什么只有我读到了博士?
  8. registry清理私有镜像
  9. 将H.264封装为FLV格式
  10. CHAPTER 10 Formal Grammars of English