<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python爬蟲:jsonpath強(qiáng)勢來襲

          共 4443字,需瀏覽 9分鐘

           ·

          2021-01-27 19:00


          關(guān)于JSON

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

          構(gòu)造字符

          JSON包括六個(gè)構(gòu)造字符,分別是:左方括號、右方括號、左大括號、右大括號、冒號與逗號。

          JSON值

          JSON值可以是對象、數(shù)組、數(shù)字、字符串或者三個(gè)字面值(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)行閱讀和編寫。同時(shí)也方便機(jī)器進(jìn)行解析和生成。適用于進(jìn)行數(shù)據(jù)交互的場景,比如網(wǎng)站前臺與后臺之間的數(shù)據(jù)交互。

          JSON的使用方法

          json.loads()

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

          JSONPython
          objectdict
          arraylist
          stringstr
          number(int)int
          number(real)float
          trueTrue
          falseFalse
          nullNone
          • 將數(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()

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


          pythonJSON
          dictobject
          list, tuplearray
          strstring
          int, floatnumber
          Truetrue
          Falsefalse
          Nonenull
          • 將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"}
          'str'>

          看到上面的輸出結(jié)果也許你會有點(diǎn)疑惑,其實(shí)不需要疑惑,這是ASCII編碼方式造成的,因?yàn)?*json.dumps()**做序列化操作時(shí)默認(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":?"中國深圳"}
          'str'>

          因?yàn)閑nsure_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這樣的工具來解決這個(gè)問題。

          • 數(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的完整概述和比較。

          Xpathjsonpath概述
          /$根節(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á)式計(jì)算

          下面我們就通過幾個(gè)示例來學(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)在需要獲取第三本書的價(jià)格。

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

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

          使用過濾器

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

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

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

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

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

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

          項(xiàng)目實(shí)戰(zhàn)

          前言

          每年的6月份都是高校學(xué)生的畢業(yè)季,作為計(jì)算機(jī)專業(yè)的你來說,如果剛剛畢業(yè)就可以進(jìn)入大廠,想必是一個(gè)非常不錯(cuò)的選擇。因此,今天我?guī)淼捻?xiàng)目就是爬取騰訊招聘的網(wǎng)站,獲取職位名稱、職位類別、工作地點(diǎn)、工作國家、職位的更新時(shí)間、職位描述

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

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

          準(zhǔn)備

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

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

          pip?install?requests
          pip?install?pandas
          pip?install?jsonpath

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

          獲取所有的職位信息

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

          "IE=edge">"initial-scale=1,maximum-scale=1,user-scalable=no">"">"">"telephone=no">搜索?|?騰訊招聘

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

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

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

          {
          ????"Code":200,
          ????"Data":{
          ????????"Count":8500,
          ????????"Posts":[
          ????????????{
          ????????????????"Id":0,
          ????????????????"PostId":"1346716678288842752",
          ????????????????"RecruitPostId":71330,
          ????????????????"RecruitPostName":"41071-騰訊會議項(xiàng)目經(jīng)理(西安)(CSIG全資子公司)",
          ????????????????"CountryName":"中國",
          ????????????????"LocationName":"西安",
          ????????????????"BGName":"CSIG",
          ????????????????"ProductName":"騰訊云",
          ????????????????"CategoryName":"產(chǎn)品",
          ????????????????"Responsibility":"1、負(fù)責(zé)研發(fā)項(xiàng)目及研發(fā)效能的計(jì)劃制定、進(jìn)度驅(qū)動和跟蹤、風(fēng)險(xiǎn)識別以及應(yīng)對,確保項(xiàng)目按計(jì)劃完成;
          2、負(fù)責(zé)組織項(xiàng)目各項(xiàng)評審會議及項(xiàng)目例會,制定并推廣項(xiàng)目流程規(guī)范,確保項(xiàng)目有序進(jìn)行;
          3、負(fù)責(zé)與項(xiàng)目外部合作伙伴進(jìn)行溝通,制定流程規(guī)范雙方合作,并推動合作事宜;
          4、及時(shí)發(fā)現(xiàn)并跟蹤解決項(xiàng)目問題,有效管理項(xiàng)目風(fēng)險(xiǎn)。
          "
          ,
          ????????????????"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è)計(jì)和迭代優(yōu)化;
          2、協(xié)調(diào)和推動研發(fā)團(tuán)隊(duì)完成產(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è)計(jì)工作,把關(guān)產(chǎn)品功能同步和國際版需求改造等;
          3、協(xié)調(diào)和推動研發(fā)團(tuán)隊(duì)完成產(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)化效果和用戶體驗(yàn);
          2. 負(fù)責(zé)地圖場景下推薦引擎架構(gòu)設(shè)計(jì)和開發(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è)計(jì)、方案編碼實(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ā)展計(jì)劃與基礎(chǔ)建設(shè);
          負(fù)責(zé)完成前端基礎(chǔ)架構(gòu)設(shè)計(jì)與組件抽象。"
          ,
          ????????????????"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)項(xiàng)目在部門內(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)隊(duì)發(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)化項(xiàng)目,有效管理及優(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)意項(xiàng)目的策劃和項(xià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è)計(jì),了解客戶的業(yè)務(wù)邏輯和應(yīng)用架構(gòu),給出合理的產(chǎn)品方案建議;?
          支持客戶的數(shù)據(jù)庫方案設(shè)計(jì),從運(yùn)維、成本、流程等角度主導(dǎo)云數(shù)據(jù)庫產(chǎn)品落地;?
          梳理客戶的核心訴求,提煉為普適性的產(chǎn)品能力,推動研發(fā)團(tuán)隊(duì)提升產(chǎn)品體驗(yà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ù)你有沒有一絲的驚喜,終于到了可以大顯身手的時(shí)候了。

          你會發(fā)現(xiàn),上面每一個(gè)節(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ù)有什么變化。

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

          那接下來就是發(fā)現(xiàn)規(guī)律的時(shí)候了,第一頁與第二頁保存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é)果

          最后

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

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

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

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


          掃一掃下面的二維碼,回復(fù):JP?獲取代碼!

          回復(fù)JP獲取本文代碼”



          瀏覽 59
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  啪啪啪日韩网站 | 国产精品福利视频导航 | 国产久久视频在线观看 | 一区在线视频 | 国产91在线观看 |