14-python爬蟲之JSON操作
結構化的資料是最好處理,一般都是類似JSON格式的字串,直接解析JSON資料,提取JSON的關鍵欄位即可。
JSON
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式;適用於進行資料互動的場景,比如網站前臺與後臺之間的資料互動
Python 3.x中自帶了JSON模組,直接import json就可以使用了。
Json模組提供了四個功能:dumps、dump、loads、load,用於字串 和 python資料型別間進行轉換
Python操作json的標準api庫參考https://docs.python.org/zh-cn/3/library/json.html線上JSON格式化程式碼http://tool.oschina.net/codeformat/json
1. json.loads()
實現:json字串 轉化 python的型別,返回一個python的型別
從json到python的型別轉化對照如下:
import json
a="[1,2,3,4]"
b='{"k1":1,"k2":2}'#當字串為字典時{}外面必須是''單引號{}裡面必須是""雙引號
print json.loads(a)
[1, 2, 3, 4]
print json.loads(b)
{'k2': 2, 'k1': 1}
案例
獲取豆瓣電影熱門
import urllib.parse
import urllib.request
import json
url='https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0'
# 豆瓣最新 熱門
herders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'Referer':'https://movie.douban.com','Connection':'keep-alive'}
# 請求頭資訊
req = urllib.request.Request(url,headers=herders)
# 設定請求頭
response=urllib.request.urlopen(req)
# 發起請求,得到response響應
hjson = json.loads(response.read())
# json轉換為字典
# 遍歷字典中的電影,item是每條電影資訊
for item in hjson["subjects"]:
print(item["rate"],item["title"])
# 列印每條電影的評分與標題
輸出
6.9 神棄之地
7.2 從邪惡中拯救我
6.1 福爾摩斯小姐:失蹤的侯爵
6.2 奪命隧道
6.3 OK老闆娘
7.3 我想結束這一切
8.3 鳴鳥不飛:烏雲密佈
7.7 1/2的魔法
7.8 樹上有個好地方
6.3 妙先生
5.1 釜山行2:半島
...
2. json.dumps()
實現python型別轉化為json字串,返回一個str物件
從python原始型別向json型別的轉化對照如下:
import json
a = [1,2,3,4]
b ={"k1":1,"k2":2}
c = (1,2,3,4)
json.dumps(a)
'[1, 2, 3, 4]'
json.dumps(b)
'{"k2": 2, "k1": 1}'
json.dumps(c)
'[1, 2, 3, 4]'
json.dumps 中文編碼問題
如果Python Dict字典含有中文,json.dumps 序列化時對中文預設使用的ascii編碼
import chardet
import json
b = {"name":"中國"}
json.dumps(b)
'{"name": "\\u4e2d\\u56fd"}'
print json.dumps(b)
{"name": "\u4e2d\u56fd"}
chardet.detect(json.dumps(b))
{'confidence': 1.0, 'encoding': 'ascii'}
‘中國’ 中的ascii 字元碼,而不是真正的中文。
想輸出真正的中文需要指定ensure_ascii=False
json.dumps(b,ensure_ascii=False)
'{"name": "\xe6\x88\x91"}'
print json.dumps(b,ensure_ascii=False)
{"name": "我"}
chardet.detect(json.dumps(b,ensure_ascii=False))
{'confidence': 0.7525, 'encoding': 'utf-8'}
3. json.dump()
import json
a = [1,2,3,4]
json.dump(a,open("digital.json","w"))
b = {"name":"我"}
json.dump(b,open("name.json","w"),ensure_ascii=False)
json.dump(b,open("name2.json","w"),ensure_ascii=True)
4. json.load()
讀取 檔案中json形式的字串元素 轉化成python型別
import json
number = json.load(open("digital.json"))
print( number)
b = json.load(open("name.json"))
print( b)
b.keys()
print b['name']
實戰專案
獲取 lagou 城市表資訊
import urllib.parse
import urllib.request
import json
url='http://www.lagou.com/lbs/getAllCitySearchLabels.json?'
# 拉鉤城市列表
herders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'Referer':'http://www.lagou.com','Connection':'keep-alive'}
# 請求頭資訊
req = urllib.request.Request(url,headers=herders)
# 設定請求頭
response=urllib.request.urlopen(req)
# 發起請求,得到response響應
hjson = json.loads(response.read())
# print(hjson)
# json轉換為字典
# 遍歷字典中A開頭的城市列表
for item in hjson["content"]["data"]["allCitySearchLabels"]["A"]:
print(item["name"],item["code"])
# 列印A 開頭的城市清除與程式碼
輸出:
安陽 171500000
安慶 131800000
鞍山 081600000
安順 240400000
安康 270400000
阿克蘇 311800000
阿拉善盟 070300000
阿勒泰 310400000
阿壩藏族羌族自治州 230700000
JSONPath
JSON 資訊抽取類庫,從JSON文件中抽取指定資訊的工具
JSONPath與Xpath區別
JsonPath 對於 JSON 來說,相當於 XPATH 對於XML。
下載地址:
https://pypi.python.org/pypi/jsonpath/
安裝方法:pip install jsonpath
參考文件
XPath | JSONPath | Result |
---|---|---|
/store/book/author | $.store.book[*].author* | 獲取所有store中的book的author |
//author | $..author | 獲取所有 authors |
/store/ | $.store. | all things in store, which are some books and a red bicycle. |
/store//price | $.store..price | 獲取store中所有的price |
//book[3] | $..book[2] | 第二個 book |
//book[last()] | $..book[(@.length-1)]``$..book[-1:] | 獲取到最後一個book |
//book[position()<3] | $..book[0,1]``$..book[:2] | 獲取到前兩個 books |
//book[isbn] | $..book[?(@.isbn)] | 獲取到有isbn屬性的book |
//book[price<10] | $..book[?(@.price<10)] | 獲取所有的book ,price小於10 |
// | $..* | 匹配任意元素 |
案例
還是以 http://www.lagou.com/lbs/getAllCitySearchLabels.json 為例,獲取所有城市
import urllib.request
import json
import jsonpath
url='http://www.lagou.com/lbs/getAllCitySearchLabels.json'
# 拉鉤城市列表
herders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'Referer':'http://www.lagou.com','Connection':'keep-alive'}
# 請求頭資訊
req = urllib.request.Request(url,headers=herders)
# 設定請求頭
response=urllib.request.urlopen(req)
# 發起請求,得到response響應
hjson = json.loads(response.read())
# 將字元載入為json物件
citylist = jsonpath.jsonpath(hjson,'$..name')
# 獲取到所有的 城市名稱
# print (type(citylist)) # <class 'list'>
content = json.dumps(citylist,ensure_ascii=False)
# 列表轉換為json 字串 ,不使用ascii編碼,
fp = open('city.json','w')
# 開啟檔案
fp.write(content)
# 寫入檔案
fp.close()
# 關閉檔案
輸出檔案為
XML
xmltodict模組讓使用XML感覺跟操作JSON一樣
Python操作XML的第三方庫參考:
https://github.com/martinblech/xmltodict
模組安裝:
pip install xmltodict
import xmltodict
bookdict = xmltodict.parse("""
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
""")
print (bookdict.keys())
[u'bookstore']
print(json.dumps(bookdict,indent=4))
輸出結果:
{
"bookstore": {
"book": [
{
"title": {
"@lang": "eng",
"#text": "Harry Potter"
},
"price": "29.99"
},
{
"title": {
"@lang": "eng",
"#text": "Learning XML"
},
"price": "39.95"
}
]
}
}
單詞表
"""
單詞表
content 內容
loads 載入
dumps 輸出 (傾倒)
citylist 城市列表
JSON(JavaScript Object Notation)
( JS 物件物件表述資料)
path 路徑
request 請求
headers 頭資訊
response 響應
read 讀取
content 內容
"""
資料提取總結
- HTML、XML
XPath
CSS選擇器
正規表示式
- JSON
JSONPath
轉化成Python型別進行操作(json類)
- XML
轉化成Python型別(xmltodict)
XPath
CSS選擇器
正規表示式
- 其他(js、文字、電話號碼、郵箱地址)
正規表示式
相關文章
- 反爬蟲之字型反爬蟲爬蟲
- 16 JSON 爬蟲【反序列化】豆瓣JSON爬蟲
- 爬蟲之股票定向爬取爬蟲
- Python爬蟲之BeautifulSoupPython爬蟲
- 爬蟲之requests庫爬蟲
- 【Python學習】爬蟲爬蟲爬蟲爬蟲~Python爬蟲
- Python爬蟲入門教程 50-100 Python3爬蟲爬取VIP視訊-Python爬蟲6操作Python爬蟲
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- 爬蟲的小技巧之–如何尋找爬蟲入口爬蟲
- 爬蟲之xpath的使用爬蟲
- python爬蟲之JS逆向Python爬蟲JS
- Python爬蟲之Pyspider使用Python爬蟲IDE
- Python爬蟲之BeautifulSoup庫Python爬蟲
- MySQL之json資料操作MySqlJSON
- 爬蟲實戰:探索XPath爬蟲技巧之熱榜新聞爬蟲
- 【0基礎學爬蟲】爬蟲基礎之資料儲存爬蟲
- 【0基礎學爬蟲】爬蟲基礎之檔案儲存爬蟲
- 爬蟲:多程式爬蟲爬蟲
- 爬蟲之代理池維護爬蟲
- python爬蟲之js逆向(三)Python爬蟲JS
- python爬蟲之js逆向(二)Python爬蟲JS
- Python爬蟲之XPath語法Python爬蟲
- Python爬蟲基礎之seleniumPython爬蟲
- Python爬蟲實戰之bilibiliPython爬蟲
- python爬蟲之解析連結Python爬蟲
- python爬蟲基礎之urllibPython爬蟲
- python爬蟲---網頁爬蟲,圖片爬蟲,文章爬蟲,Python爬蟲爬取新聞網站新聞Python爬蟲網頁網站
- 爬蟲與反爬:一場無休止之戰爬蟲
- 網路爬蟲之關於爬蟲 http 代理的常見使用方式爬蟲HTTP
- 通用爬蟲與聚焦爬蟲爬蟲
- 爬蟲--Scrapy簡易爬蟲爬蟲
- Python爬蟲之資料解析(XPath)Python爬蟲
- 高效率爬蟲框架之 pyspider爬蟲框架IDE
- 網路爬蟲之抓取郵箱爬蟲
- python爬蟲 之 BeautifulSoup庫入門Python爬蟲
- Python爬蟲之JS逆向分析技巧Python爬蟲JS
- 爬蟲之CSS語法學習爬蟲CSS
- Python爬蟲之CSS選擇器Python爬蟲CSS