史上最詳細(xì)的jsonpath教程,它來了5觥>ㄓ怠!

關(guān)于JSON

JSON是一個標(biāo)記符序列僧免。這套標(biāo)記符包括:構(gòu)造字符刑赶、字符串、數(shù)字和三個字面值懂衩。

構(gòu)造字符

JSON包括六個構(gòu)造字符撞叨,分別是:左方括號金踪、右方括號、左大括號牵敷、右大括號胡岔、冒號與逗號。

JSON值

JSON值可以是對象枷餐、數(shù)組靶瘸、數(shù)字、字符串或者三個字面值(false毛肋、true怨咪、null),并且字面值必須是小寫英文字母润匙。

對象

對象是由花括號括起來诗眨,逗號分割的成員構(gòu)成,成員是字符串鍵和上面所說的JSON值構(gòu)成孕讳,例如:

{"name":"jack","age":18,"address":{"country"}}

數(shù)組

數(shù)組是由方括號括起來的一組數(shù)值構(gòu)成匠楚,例如:

[1,2,32,3,6,5,5]

字符串與數(shù)字想必就不用我過多敘述吧。

下面我就舉例一些合法的JSON格式的數(shù)據(jù):

{"a":1,"b":[1.2.3]}
[1,2,"3",{"a":4}]
3.14
"json_data"

為什么要使用JSON

JSON是一種輕量級的數(shù)據(jù)交互格式厂财,它使得人們很容易的進(jìn)行閱讀和編寫芋簿。同時也方便機(jī)器進(jìn)行解析和生成。適用于進(jìn)行數(shù)據(jù)交互的場景璃饱,比如網(wǎng)站前臺與后臺之間的數(shù)據(jù)交互益咬。

JSON的使用方法

json.loads()

把JSON格式字符串解碼轉(zhuǎn)成Python對象,從JSON到Python類型轉(zhuǎn)換表如下:

JSON Python
object dict
array list
string str
number(int) int
number(real) float
true True
false False
null None
  • 將數(shù)組轉(zhuǎn)成列表對象
import json


strList = "[1,2,3,3,4]"
print(json.loads(strList))
print(type(json.loads(strList)))

試著運(yùn)行上面的代碼帜平,你會發(fā)現(xiàn)已經(jīng)成功的將strList轉(zhuǎn)換為列表對象幽告。

  • 將對象轉(zhuǎn)換成字典
import json


strDict = '{"city":"上海","name":"jack","age":18}'
print(json.loads(strDict))
print(type(json.loads(strDict)))

試著運(yùn)行上面的代碼,你會發(fā)現(xiàn)已經(jīng)成功的將object轉(zhuǎn)換為dict類型的數(shù)據(jù)裆甩。

json.dumps()

其實這個方法也很好理解冗锁,就是將Python類型的對象轉(zhuǎn)換為json字符串。從Python類型向JSON類型轉(zhuǎn)換的對照表如下:

python JSON
dict object
list, tuple array
str string
int, float number
True true
False false
None null
  • 將Python列表對象轉(zhuǎn)換為JSON字符串
import json


list_str = [1,2,3,6,5]
print(json.dumps(list_str))
print(type(json.dumps(list_str)))

試著運(yùn)行上面的代碼嗤栓,你會發(fā)現(xiàn)成功的將列表類型轉(zhuǎn)換成了字符串類型冻河。

  • 將Python元組對象轉(zhuǎn)換為JSON字符串
import json


tuple_str = (1,2,3,6,5)
print(json.dumps(tuple_str))
print(type(json.dumps(tuple_str)))

試著運(yùn)行上面的代碼,你會發(fā)現(xiàn)成功的將元組類型的數(shù)據(jù)轉(zhuǎn)換成了字符串茉帅。

  • 將Python字典對象轉(zhuǎn)換為JSON字符串
import json 


dict_str = {"name": "小明", "age":18, "city": "中國深圳"}
print(json.dumps(dict_str))
print(type(json.dumps(dict_str)))

輸出結(jié)果:

{"name": "\u5c0f\u660e", "age": 18, "city": "\u4e2d\u56fd\u6df1\u5733"}
<class 'str'>

看到上面的輸出結(jié)果也許你會有點(diǎn)疑惑叨叙,其實不需要疑惑,這是ASCII編碼方式造成的堪澎,因為json.dumps()做序列化操作時默認(rèn)使用的就是ASCII編碼擂错,因此我們可以這樣寫:

import json


dict_str = {"name": "小明", "age":18, "city": "中國深圳"}
print(json.dumps(dict_str, ensure_ascii=False))
print(type(json.dumps(dict_str)))

輸出結(jié)果:

{"name": "小明", "age": 18, "city": "中國深圳"}
<class 'str'>

因為ensure_ascii的默認(rèn)值是True,因此我們可以添加參數(shù)ensure_ascii將它的默認(rèn)值改成False樱蛤,這樣編碼方式就會更改為utf-8了钮呀。

json.load()

該方法的主要作用是將文件中JSON形式的字符串轉(zhuǎn)換為Python類型剑鞍。

具體代碼示例如下:

import json

str_list = json.load(open('position.json', encoding='utf-8'))
print(str_dict)
print(type(str_dict))

運(yùn)行上面的代碼,你會發(fā)現(xiàn)成功的將字符串類型的JSON數(shù)據(jù)轉(zhuǎn)換為了dict類型爽醋。

代碼中的文件position.json我也會分享給大家蚁署。

  • json.dump()

將Python內(nèi)置類型序列化為JSON對象后寫入文件。具體代碼示例如下所示:

import json

list_str = [{'city':'深圳'}, {'name': '小明'},{'age':18}]
dict_str = {'city':'深圳','name':'小明','age':18}

json.dump(list_str, open('listStr.json', 'w'), ensure_ascii=False)
json.dump(list_str, open('dictStr.json', 'w'), ensure_ascii=False)

jsonpath

XML精彩強(qiáng)調(diào)的優(yōu)點(diǎn)是提供了大量的工具來分析蚂四、轉(zhuǎn)換和有選擇地從XML文檔中提取數(shù)據(jù)光戈。Xpath是這些功能強(qiáng)大的工具之一。

對于JSON數(shù)據(jù)來說遂赠,是否應(yīng)該出現(xiàn)jsonpath這樣的工具來解決這個問題田度。

  • 數(shù)據(jù)可以通過交互方式從客戶端上的JSON結(jié)構(gòu)提取,不需要特殊的腳本解愤。
  • 客戶端請求的JSON數(shù)據(jù)可以減少到服務(wù)器的上的相關(guān)部分,從而大幅度減少服務(wù)器響應(yīng)的帶寬使用乎莉。

jsonpath表達(dá)式始終引用JSON結(jié)構(gòu)的方式與Xpath表達(dá)式與XML文檔使用的方式相同送讲。

jsonpath的安裝方法

pip install jsonpath

jsonpath與Xpath

下面表格是jsonpath語法與Xpath的完整概述和比較。

Xpath jsonpath 概述
/ $ 根節(jié)點(diǎn)
. @ 當(dāng)前節(jié)點(diǎn)
/ .or[] 取子節(jié)點(diǎn)
* * 匹配所有節(jié)點(diǎn)
[] [] 迭代器標(biāo)識(如數(shù)組下標(biāo)惋啃,根據(jù)內(nèi)容選值)
// ... 不管在任何位置哼鬓,選取符合條件的節(jié)點(diǎn)
n/a [,] 支持迭代器中多選
n/a ?() 支持過濾操作
n/a () 支持表達(dá)式計算

下面我們就通過幾個示例來學(xué)習(xí)jsonxpath的使用方法。

我們先來看下面這段json數(shù)據(jù)

{ "store": {
    "book": [
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

獲取符合條件的節(jié)點(diǎn)

假如我需要獲取到作者的名稱該怎么樣寫呢边灭?

如果通過Python的字典方法來獲取是非常麻煩的异希,所以在這里我們可以選擇使用jsonpath.。

具體代碼示例如下所示:

import jsonpath


author = jsonpath.jsonpath(data_json, '$.store.book[*].author')
print(author)

運(yùn)行上面的代碼你會發(fā)現(xiàn)绒瘦,成功的獲取到了所有的作者名稱称簿,并保存在列表中。

或者還可以這樣寫:

import jsonpath

author = jsonpath.jsonpath(data_json, '$..author')
print(author)

使用指定索引

還是使用上面的json數(shù)據(jù)惰帽,假如我現(xiàn)在需要獲取第三本書的價格憨降。

third_book_price = jsonpath.jsonpath(data_json, '$.store.book[2].price')
print(third_book_price)

運(yùn)行上面的代碼,你會發(fā)現(xiàn)成功的獲取到了第三本書的價格该酗。

使用過濾器

isbn_book = jsonpath.jsonpath(data_json, '$..book[?(@.isbn)]')
print(isbn_book)
print(type(isbn_book))

通過運(yùn)行上面的代碼授药,你會發(fā)現(xiàn),成功的將含有isbn編號的書籍過濾出來了呜魄。

同樣的道理悔叽,根據(jù)上面的例子,我們也可以將價格小于10元的書過濾出來爵嗅。

book = jsonpath.jsonpath(data_json, '$..book[?(@.price<10)]')
print(book)
print(type(book))

通過運(yùn)行上面的代碼娇澎,你會發(fā)現(xiàn)這里已經(jīng)成功的將價格小于10元的書提取出來了。

jsonpath其實是非常適合用來獲取json格式的數(shù)據(jù)的一款工具睹晒,最重要的是這款工具輕量簡單容使用九火。關(guān)于jsonpath的介紹到這里就結(jié)束了赚窃,下面我們就進(jìn)入實戰(zhàn)演練吧!

項目實戰(zhàn)

前言

每年的6月份都是高校學(xué)生的畢業(yè)季岔激,作為計算機(jī)專業(yè)的你來說勒极,如果剛剛畢業(yè)就可以進(jìn)入大廠,想必是一個非常不錯的選擇虑鼎。因此辱匿,今天我?guī)淼捻椖烤褪桥廊◎v訊招聘的網(wǎng)站,獲取職位名稱炫彩、職位類別匾七、工作地點(diǎn)、工作國家江兢、職位的更新時間昨忆、職位描述

爬取內(nèi)容一共有329頁杉允,在前329頁的職位都是在這個月發(fā)布的邑贴,還是比較新,對大家來說更有參考的價值叔磷。

網(wǎng)頁鏈接:https://careers.tencent.com/search.html

準(zhǔn)備

工欲善其事拢驾,必現(xiàn)利其器。首先我們要準(zhǔn)備好幾個庫:pandas改基、requests繁疤、jsonpath

如果沒有安裝,請參考下面的安裝過程:

pip install requests
pip install pandas
pip install jsonpath

需求分析與功能實現(xiàn)

獲取所有的職位信息

對網(wǎng)頁進(jìn)行分析的時候秕狰,我發(fā)現(xiàn)想從網(wǎng)頁上直接獲取信息是是做不到的稠腊,該網(wǎng)頁的響應(yīng)信息如下所示:

<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=keywords content=""><meta name=description content=""><meta name=apple-mobile-web-app-capable content=no><meta name=format-detection content="telephone=no"><title>搜索 | 騰訊招聘</title><link rel=stylesheet href=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/css/main.css><link rel=stylesheet href=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/css/jquery-ui.min.css></head><body><div id=app></div><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/careersmlr/HeadFoot_zh-cn.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/careersmlr/HostMsg_zh-cn.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/careersmlr/Search_zh-cn.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/js/vendor/config.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/js/vendor/jquery.min.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/js/vendor/jquery.ellipsis.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/js/vendor/report.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/js/vendor/qrcode.min.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/js/manifest.build.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/js/vendor.build.js></script><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/js/p_zh-cn_search.build.js></script></body><script type=text/javascript src=https://cdn.multilingualres.hr.tencent.com/tencentcareer/static/js/vendor/common.js></script></html>

因此我判斷,這個是動態(tài)Ajax加載的數(shù)據(jù)鸣哀,因此就要去網(wǎng)頁控制器上查找職位數(shù)據(jù)是否存在麻养。

經(jīng)過一番查找,果然發(fā)現(xiàn)是動態(tài)加載的數(shù)據(jù)诺舔,信息如下所示:

image

格式化之后的數(shù)據(jù)如下所示:

{
    "Code":200,
    "Data":{
        "Count":8500,
        "Posts":[
            {
                "Id":0,
                "PostId":"1346716678288842752",
                "RecruitPostId":71330,
                "RecruitPostName":"41071-騰訊會議項目經(jīng)理(西安)(CSIG全資子公司)",
                "CountryName":"中國",
                "LocationName":"西安",
                "BGName":"CSIG",
                "ProductName":"騰訊云",
                "CategoryName":"產(chǎn)品",
                "Responsibility":"1鳖昌、負(fù)責(zé)研發(fā)項目及研發(fā)效能的計劃制定、進(jìn)度驅(qū)動和跟蹤低飒、風(fēng)險識別以及應(yīng)對许昨,確保項目按計劃完成;
2褥赊、負(fù)責(zé)組織項目各項評審會議及項目例會糕档,制定并推廣項目流程規(guī)范,確保項目有序進(jìn)行;
3速那、負(fù)責(zé)與項目外部合作伙伴進(jìn)行溝通俐银,制定流程規(guī)范雙方合作,并推動合作事宜端仰;
4捶惜、及時發(fā)現(xiàn)并跟蹤解決項目問題,有效管理項目風(fēng)險荔烧。
",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=1346716678288842752",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            },
            {
                "Id":0,
                "PostId":"1346716729744564224",
                "RecruitPostId":71331,
                "RecruitPostName":"41071-騰訊會議產(chǎn)品策劃(平臺方向)(CSIG全資子公司)",
                "CountryName":"中國",
                "LocationName":"西安",
                "BGName":"CSIG",
                "ProductName":"騰訊云",
                "CategoryName":"產(chǎn)品",
                "Responsibility":"1吱七、負(fù)責(zé)騰訊會議企業(yè)管理平臺的產(chǎn)品策劃工作,包括企業(yè)運(yùn)營平臺鹤竭、運(yùn)維踊餐、會控平臺和工具的產(chǎn)品設(shè)計和迭代優(yōu)化;
2臀稚、協(xié)調(diào)和推動研發(fā)團(tuán)隊完成產(chǎn)品開發(fā)吝岭、需求落地,并能在需求上線后進(jìn)行持續(xù)數(shù)據(jù)分析和反饋跟進(jìn)吧寺,不斷提升產(chǎn)品競爭力窜管;
3、根據(jù)行業(yè)場景抽象用戶需求撮执,沉淀面向不同類型客戶的云端管控平臺解決方案;
 ",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=1346716729744564224",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            },
            {
                "Id":0,
                "PostId":"1346062593894129664",
                "RecruitPostId":71199,
                "RecruitPostName":"41071-騰訊會議產(chǎn)品策劃(CSIG全資子公司)",
                "CountryName":"中國",
                "LocationName":"西安",
                "BGName":"CSIG",
                "ProductName":"騰訊云",
                "CategoryName":"產(chǎn)品",
                "Responsibility":"負(fù)責(zé)騰訊會議的產(chǎn)品策劃工作:
1舷丹、研究海外用戶辦公習(xí)慣及SaaS市場動態(tài)抒钱,調(diào)研海外相關(guān)SaaS產(chǎn)品并輸出產(chǎn)品調(diào)研結(jié)論,綜合市場情況和用戶需求輸出高質(zhì)量的產(chǎn)品需求或解決方案颜凯;
2谋币、負(fù)責(zé)騰訊會議各產(chǎn)品線的英文版的功能同步和產(chǎn)品設(shè)計工作,把關(guān)產(chǎn)品功能同步和國際版需求改造等症概;
3蕾额、協(xié)調(diào)和推動研發(fā)團(tuán)隊完成產(chǎn)品開發(fā)、需求落地彼城,并能在需求上線后進(jìn)行持續(xù)數(shù)據(jù)分析和反饋跟進(jìn)诅蝶,不斷提升產(chǎn)品競爭力; ",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=1346062593894129664",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            },
            {
                "Id":0,
                "PostId":"1352161575309418496",
                "RecruitPostId":72134,
                "RecruitPostName":"CSIG16-推薦算法高級工程師",
                "CountryName":"中國",
                "LocationName":"北京",
                "BGName":"CSIG",
                "ProductName":"",
                "CategoryName":"技術(shù)",
                "Responsibility":"1. 參與地圖場景下推薦算法優(yōu)化募壕,持續(xù)提升轉(zhuǎn)化效果和用戶體驗调炬;
2. 負(fù)責(zé)地圖場景下推薦引擎架構(gòu)設(shè)計和開發(fā)工作;
3. 跟進(jìn)業(yè)界推薦領(lǐng)域最新進(jìn)展舱馅,并推動其在地圖場景下落地缰泡。",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=0",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            },
            {
                "Id":0,
                "PostId":"1352158432852975616",
                "RecruitPostId":72133,
                "RecruitPostName":"41071-騰訊云SDK 終端研發(fā)工程師(CSIG全資子公司)",
                "CountryName":"中國",
                "LocationName":"西安",
                "BGName":"CSIG",
                "ProductName":"",
                "CategoryName":"技術(shù)",
                "Responsibility":"1. 負(fù)責(zé)騰訊云 GME SDK(游戲多媒體引擎)的開發(fā)和優(yōu)化工作,并配套開發(fā)相應(yīng)的場景解決方案業(yè)務(wù)流程代嗤,以滿足不同場景和不同行業(yè)的客戶需求; 
2. 全流程參與客戶需求咨詢棘钞、需求評估缠借、方案設(shè)計、方案編碼實施及交付工作; 
3. 負(fù)責(zé)優(yōu)化騰訊云GME產(chǎn)品易用性宜猜,并跟蹤客戶的接入成本泼返、完善服務(wù)體系,解決客戶使用產(chǎn)品服務(wù)和解決方案過程中的技術(shù)問題宝恶,不斷完善問題處理機(jī)制和流程符隙。",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=0",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            },
            {
                "Id":0,
                "PostId":"1352155053116366848",
                "RecruitPostId":72131,
                "RecruitPostName":"40931-智慧交通數(shù)據(jù)平臺前端開發(fā)工程師(北京)",
                "CountryName":"中國",
                "LocationName":"北京",
                "BGName":"CSIG",
                "ProductName":"",
                "CategoryName":"技術(shù)",
                "Responsibility":"負(fù)責(zé)騰訊智慧交通領(lǐng)域的平臺前端開發(fā)工作;
負(fù)責(zé)規(guī)劃與制定前端整體發(fā)展計劃與基礎(chǔ)建設(shè)垫毙;
負(fù)責(zé)完成前端基礎(chǔ)架構(gòu)設(shè)計與組件抽象霹疫。",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=0",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            },
            {
                "Id":0,
                "PostId":"1306860769169645568",
                "RecruitPostId":66367,
                "RecruitPostName":"35566-HRBP(騰訊全資子公司)",
                "CountryName":"中國",
                "LocationName":"武漢",
                "BGName":"CSIG",
                "ProductName":"",
                "CategoryName":"人力資源",
                "Responsibility":"負(fù)責(zé)區(qū)域研發(fā)公司的HR政策、制度综芥、體系與重點(diǎn)項目在部門內(nèi)部的落地與推動執(zhí)行丽蝎;
深入了解所負(fù)責(zé)領(lǐng)域業(yè)務(wù)與人員發(fā)展?fàn)顩r,評估并明確組織與人才發(fā)展對HR的需求膀藐;
驅(qū)動平臺資源提供HR解決方案屠阻,并整合內(nèi)部資源推動執(zhí)行;提升管理干部的人力資源管理能力额各,關(guān)注關(guān)鍵人才融入與培養(yǎng)国觉,確保持續(xù)的溝通與反饋;
協(xié)助管理層進(jìn)行人才管理虾啦、團(tuán)隊發(fā)展麻诀、組織氛圍建設(shè)等,確保公司文化在所屬業(yè)務(wù)領(lǐng)域的落地傲醉;
負(fù)責(zé)所對接部門的人才招聘工作蝇闭;
",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=1306860769169645568",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            },
            {
                "Id":0,
                "PostId":"1351353005709991936",
                "RecruitPostId":71981,
                "RecruitPostName":"35566-招聘經(jīng)理(騰訊云全資子公司)",
                "CountryName":"中國",
                "LocationName":"武漢",
                "BGName":"CSIG",
                "ProductName":"",
                "CategoryName":"人力資源",
                "Responsibility":"1、負(fù)責(zé)CSIG區(qū)域研發(fā)公司相關(guān)部門的社會招聘及校園招聘工作硬毕,制定有效的招聘策略并推動落地執(zhí)行呻引,保障人才開源、甄選和吸引;
2吐咳、負(fù)責(zé)相關(guān)部門人力資源市場分析逻悠,有效管理并優(yōu)化招聘渠道;
3韭脊、參與招聘體系化建設(shè)蹂风,甄選相關(guān)優(yōu)化項目,有效管理及優(yōu)化招聘渠道乾蓬。",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=1351353005709991936",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            },
            {
                "Id":0,
                "PostId":"1351838518279675904",
                "RecruitPostId":72081,
                "RecruitPostName":"35566-雇主品牌經(jīng)理(騰訊云全資子公司)",
                "CountryName":"中國",
                "LocationName":"武漢",
                "BGName":"CSIG",
                "ProductName":"",
                "CategoryName":"人力資源",
                "Responsibility":"1惠啄、負(fù)責(zé)騰訊云區(qū)域研發(fā)公司雇主品牌的規(guī)劃和建設(shè)工作,結(jié)合業(yè)務(wù)招聘需求,制定有效的品牌方案撵渡;
2融柬、負(fù)責(zé)訊云區(qū)域研發(fā)公司的公眾號、媒體賬號的內(nèi)容策劃趋距、撰寫粒氧,協(xié)調(diào)相關(guān)資源完成高質(zhì)量內(nèi)容輸出;
3节腐、負(fù)責(zé)招聘創(chuàng)意項目的策劃和項目統(tǒng)籌外盯,借助各種平臺渠道,完成創(chuàng)意內(nèi)容的傳播觸達(dá)翼雀,提升人選對騰訊云區(qū)域研發(fā)公司的認(rèn)知和意向度饱苟;",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=1351838518279675904",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            },
            {
                "Id":0,
                "PostId":"1199244591342030848",
                "RecruitPostId":55432,
                "RecruitPostName":"22989-數(shù)據(jù)庫解決方案架構(gòu)師(北京/上海/深圳)",
                "CountryName":"中國",
                "LocationName":"上海",
                "BGName":"CSIG",
                "ProductName":"",
                "CategoryName":"產(chǎn)品",
                "Responsibility":"支持客戶的應(yīng)用架構(gòu)設(shè)計,了解客戶的業(yè)務(wù)邏輯和應(yīng)用架構(gòu)狼渊,給出合理的產(chǎn)品方案建議箱熬; 
支持客戶的數(shù)據(jù)庫方案設(shè)計,從運(yùn)維狈邑、成本城须、流程等角度主導(dǎo)云數(shù)據(jù)庫產(chǎn)品落地; 
梳理客戶的核心訴求米苹,提煉為普適性的產(chǎn)品能力糕伐,推動研發(fā)團(tuán)隊提升產(chǎn)品體驗;
根據(jù)客戶的行業(yè)屬性蘸嘶,定制行業(yè)場景的解決方案良瞧,提升云數(shù)據(jù)庫的影響力;",
                "LastUpdateTime":"2021年01月21日",
                "PostURL":"http://careers.tencent.com/jobdesc.html?postId=1199244591342030848",
                "SourceID":1,
                "IsCollect":false,
                "IsValid":true
            }
        ]
    }
}

經(jīng)過對比發(fā)現(xiàn)上面的json數(shù)據(jù)與網(wǎng)頁信息是完全相同的亏较。

看到j(luò)son數(shù)據(jù)你有沒有一絲的驚喜莺褒,終于到了可以大顯身手的時候了掩缓。

你會發(fā)現(xiàn)雪情,上面每一個節(jié)點(diǎn)的參數(shù)都是獨(dú)立的,不會存在重復(fù)你辣,那我們可以這樣寫:

def get_info(data):
    recruit_post_name = jsonpath.jsonpath(data, '$..RecruitPostName')
    category_name = jsonpath.jsonpath(data, '$..CategoryName')
    country_name= jsonpath.jsonpath(data, '$..CountryName')
    location_name = jsonpath.jsonpath(data, '$.Data.Posts..LocationName')
    responsibility = jsonpath.jsonpath(data, '$..Responsibility')
    responsibility = [i.replace('\n', '').replace('\r', '') for i in responsibility]
    last_update_time = jsonpath.jsonpath(data, '$..LastUpdateTime')

運(yùn)行上面的代碼巡通,你會發(fā)現(xiàn)成功的獲取到了每一組數(shù)據(jù)。

關(guān)于翻頁

打開網(wǎng)頁之后你會發(fā)現(xiàn)騰訊的職位信息一共有850頁舍哄,但是前面的json數(shù)據(jù)僅僅只有第一頁的數(shù)據(jù)怎么辦呢宴凉?

不用擔(dān)心,直接點(diǎn)擊第二頁看看網(wǎng)絡(luò)數(shù)據(jù)有什么變化表悬。

image

如上圖所示弥锄,當(dāng)點(diǎn)擊第二頁的時候,又加載出來了一個數(shù)據(jù),點(diǎn)擊進(jìn)去之后你就會發(fā)現(xiàn)籽暇,這個數(shù)據(jù)剛好就是第二頁的職位信息温治。

那接下來就是發(fā)現(xiàn)規(guī)律的時候了,第一頁與第二頁保存JSON數(shù)據(jù)的URL如下所示:

# 第一頁
https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1611215870971&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex=1&pageSize=10&language=zh-cn&area=cn

# 第二頁
https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1611217026103&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex=2&pageSize=10&language=zh-cn&area=cn

經(jīng)過測試發(fā)現(xiàn)戒悠,可以將URL地址進(jìn)行簡化熬荆,簡化后的URL如下所示:

# 第一頁
https://careers.tencent.com/tencentcareer/api/post/Query?pageIndex=1&pageSize=10

# 第二頁
https://careers.tencent.com/tencentcareer/api/post/Query?pageIndex=1&pageSize=10

數(shù)據(jù)保存

將爬取下來的數(shù)據(jù)保存至csv文件,核心代碼如下所示:

df = pd.DataFrame({
        'country_name': country_name,
        'location_name': location_name,
        'recruit_post_name':recruit_post_name,
        'category_name': category_name,
        'responsibility':responsibility,
        'last_update_time':last_update_time
    })

if __name__ == '__main__':
    tengxun = TengXun()
    df = pd.DataFrame(columns=['country_name', 'location_name', 'category_name','recruit_post_name', 'responsibility', 'last_update_time'])

    for page in range(1, 330):
        print(f'正在獲取第{page}頁')
        url = tengxun.get_url(page)
        data = tengxun.get_json(url)
        time.sleep(0.03)

        df1 = get_info(data)
        df = pd.concat([df, df1])
        df = df.reset_index(drop=True)
    # pprint.pprint(data)

    df.to_csv('../data/騰訊招聘.csv', encoding='utf-8-sig')

最后結(jié)果

image

最后

本次分享到此結(jié)束绸狐,如果你從開頭讀到這里卤恳,想必文章對你是有所幫助的,這也我分享知識的初衷寒矿。

沒有什么是可以一蹴而就的突琳,生活如此,學(xué)習(xí)亦是如此劫窒!

路漫漫其修遠(yuǎn)兮本今,吾將上下而求索

我是啃書君主巍,一個專注于學(xué)習(xí)的人冠息。你懂的越多,你不懂的越多孕索,更多精彩內(nèi)容我們下期再見逛艰!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市搞旭,隨后出現(xiàn)的幾起案子散怖,更是在濱河造成了極大的恐慌,老刑警劉巖肄渗,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镇眷,死亡現(xiàn)場離奇詭異,居然都是意外死亡翎嫡,警方通過查閱死者的電腦和手機(jī)欠动,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惑申,“玉大人具伍,你說我怎么就攤上這事∪ν眨” “怎么了人芽?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绩脆。 經(jīng)常有香客問我萤厅,道長橄抹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任惕味,我火速辦了婚禮害碾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赦拘。我一直安慰自己慌随,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布躺同。 她就那樣靜靜地躺著阁猜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹋艺。 梳的紋絲不亂的頭發(fā)上剃袍,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音捎谨,去河邊找鬼民效。 笑死,一個胖子當(dāng)著我的面吹牛涛救,可吹牛的內(nèi)容都是我干的畏邢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼检吆,長吁一口氣:“原來是場噩夢啊……” “哼舒萎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹭沛,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤臂寝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摊灭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咆贬,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年帚呼,在試婚紗的時候發(fā)現(xiàn)自己被綠了掏缎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡萝挤,死狀恐怖御毅,靈堂內(nèi)的尸體忽然破棺而出根欧,到底是詐尸還是另有隱情怜珍,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布凤粗,位于F島的核電站酥泛,受9級特大地震影響今豆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柔袁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一呆躲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捶索,春花似錦插掂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至燎竖,卻和暖如春璃弄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背构回。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工夏块, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纤掸。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓脐供,卻偏偏與公主長得像,于是被迫代替她去往敵國和親借跪。 傳聞我的和親對象是個殘疾皇子患民,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容