Python爬取JSON
A. python爬蟲如何寫
Python的爬蟲庫其實很多,像常見的urllib,requests,bs4,lxml等,初始入門爬蟲的話,可以學習一下requests和bs4(BeautifulSoup)這2個庫,比較簡單,也易學習,requests用於請求頁面,BeautifulSoup用於解析頁面,下面我以這2個庫為基礎,簡單介紹一下Python如何爬取網頁靜態數據和網頁動態數據,實驗環境win10+python3.6+pycharm5.0,主要內容如下:
Python爬取網頁靜態數據
這個就很簡單,直接根據網址請求頁面就行,這里以爬取糗事網路上的內容為例:
1.這里假設我們要爬取的文本內容如下,主要包括昵稱、內容、好笑數和評論數這4個欄位:
打開網頁源碼,對應網頁結構如下,很簡單,所有欄位內容都可以直接找到:
2.針對以上網頁結構,我們就可以編寫相關代碼來爬取網頁數據了,很簡單,先根據url地址,利用requests請求頁面,然後再利用BeautifulSoup解析數據(根據標簽和屬性定位)就行,如下:
程序運行截圖如下,已經成功爬取到數據:
Python爬取網頁動態數據
很多種情況下,網頁數據都是動態載入的,直接爬取網頁是提取不到任何數據的,這時就需要抓包分析,找到動態載入的數據,一般情況下就是一個json文件(當然,也敬鏈譽可能是其他類型的文件,像xml等),然後請求解析這個json文件,就能獲取到我們需要的數據,這里以爬取人人貸上面的散標數據為例:
1.這里假設我們爬取的數據如下,主要包括年亮段利率,借款標題,期限,金額,進度這5個欄位:
2.按F12調出開發者工具,依次點擊「Network」->「XHR」,F5刷新頁面,就可以找到動態載入的json文件,具體信息如下:
3.接著,針對以上抓包分析,我們就可以編寫相關代碼來爬取數據了,基本思路和上面的靜態網頁差不多,先利用requests請求json,然後再利用python自帶的json包解析數據就行,如下:
程序運行截圖如下,已經成功獲取到數據:
至此,我們就完成了利用python來爬取網頁數據。總的來說,整個過程很簡單,requests和BeautifulSoup對於初學者來說,非常容易學習,也易掌握,可以學習使用一下,後期熟悉後,可以學習一下scrapy爬蟲框架,可以明顯提高開發效率,非常不錯,當然,網頁中要是有加密、驗證碼等,這個就需要自己好好琢磨,研究對策了,網上也有相關教程和資料,感興趣的話,可以搜一下,希望以上分喚陸享的內容能對你上有所幫助吧,也歡迎大家評論、留言。
B. 怎麼使用python提取json文件中的欄位
例json文件,名字test.json,
{
"verson":"1.4.2",
"author":"johanna",
"type":"1"
}
python編碼:
首先讀取json文件內容,利用json.loads()轉化為dict類型,遍歷每一對key,val
importjson
importos
try:
t_str=open('./test.json','r').read()
t_json=json.loads(t_str)
fork,vint_json.items():
printk,v
exceptException,e:
printstr(e)
C. 如何用python爬取網頁中隱藏的div內容
你說的隱藏的div內容,應該是動態載入的數據吧,不在網頁源碼中顯示,只在載入網頁時才請求數據進行顯示,一般情況下,這種數據都保存在一個json文件中,只要抓包分析出這個json文件的url地址,然後再根據json文件結構進行解析,很快就能獲取到動態載入的div數據,下面我以爬取人人貸上面的散標數據為例,簡單介紹一下python如何爬蘆枝取div動態載入的數據,實驗環境win10+python3.6+pycharm5.0,主要步驟如下:
1.首先,打開散標數族咐據,如下,爬取的信息主要包括年利率、借款標題、期限、金額和進度這5個欄位信息:
右鍵對應元素進行檢查,可以看出所有的數據嵌套在div標簽中,如下:
打開網頁源碼,我們按Ctrl+F查找對應的數據,會發現所查找的數據都未在網頁源碼中,如下,即數據都是動態載入,所以直接解析原網頁是找不到div嵌套的數據的:
2.接著,我們按F12調出開發者工具,依次點擊「Network」->「XHR」,F5刷新頁面,就會看到動態載入的json文件,查看這個文件,內容如下,左邊為json文件的url地址,右邊就是我們需要爬取的div數據:
3.最後對應上面的json文件,我們就可以直接獲取並解析json了,這里主要用到requests和json這2個模塊,其中requests用於根據url地址獲取json文件,json用於解析json文件,提取出我們所需要的信息,即div動態載入的數據,測試代碼如下,非常簡單:
運行程序,截圖如下,已經成功爬取到div載入的數據:
至此,我們就完成了利用python爬取div動態載入的數據。總的來說,整個過程非常簡單,最主要的陪穗敏還是抓包分析,只要你有一定的爬蟲基礎,熟悉一下上面的代碼,多調試幾遍程序,很快就能掌握的,當然,你也可以使用selenium進行爬取,直接解析就行,網上也有相關教程和資料可供參考,非常豐富,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言。
D. python怎麼讀取json文件內容
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網路傳輸速率)。
JSON在python中分別由list和dict組成。
這是用於序列化的兩個模塊:
json: 用於字元串和python數據類型間進行轉換
pickle: 用於python特有的類型和python的數據類型間進行轉換
Json模塊提供了四個功能:mps、mp、loads、load
pickle模塊提供了四個功能:mps、mp、loads、load
json mps把數據類型轉換成字元串 mp把數據類型轉換成字元串並存儲在文件中 loads把字元串轉換成數據類型 load把文件打開從字元串轉換成數據類型
json是可以在不同語言之間交換數據的,而pickle只在python之間使用。json只能序列化最基本的數據類型,josn只能把常用的數據類型序列化(列表、字典、列表、字元串、數字、),比如日期格式、類對象!josn就不行了。而pickle可以序列化所有的數據類型,包括類,函數都可以序列化。
事例:
mps:將python中的 字典 轉換為 字元串
E. 如何用python讀取json裡面的值啊
1、首先需要在桌面新建『json.txt』文件,內容為jsonline格式。
F. 如何用python讀取json文件里指定的數據
importjson
withopen('who.json','r')asf:
data=json.load(f)
dependencies=data['dependencies']
fork,vindependencies.iteritems():
print(f'{k}@{v}')
G. 如何在scrapy框架下用python爬取json文件
生成Request的時候與一般的網頁是相同的,提交Request後scrapy就會下載相應的網頁生成Response,這時只用解析response.body按照解析json的方法就可以提取數據了。代碼示例如下(以京東為例,其中的parse_phone_price和parse_commnets是通過json提取的,省略部分代碼):
# -*- coding: utf-8 -*-
from scrapy.spiders import Spider, CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from jdcom.items import JdPhoneCommentItem, JdPhoneItem
from scrapy import Request
from datetime import datetime
import json
import logging
import re
logger = logging.getLogger(__name__)
class JdPhoneSpider(CrawlSpider):
name = "jdPhoneSpider"
start_urls = ["http://list.jd.com/list.html?cat=9987,653,655"]
rules = (
Rule(
LinkExtractor(allow=r"list\.html\?cat\=9987,653,655\&page\=\d+\&trans\=1\&JL\=6_0_0"),
callback="parse_phone_url",
follow=True,
),
)
def parse_phone_url(self, response):
hrefs = response.xpath("//div[@id='plist']/ul/li/div/div[@class='p-name']/a/@href").extract()
phoneIDs = []
for href in hrefs:
phoneID = href[14:-5]
phoneIDs.append(phoneID)
commentsUrl = "http://sclub.jd.com/proctpage/p-%s-s-0-t-3-p-0.html" % phoneID
返慶租 yield Request(commentsUrl, callback=self.parse_commnets)
def parse_phone_price(self, response):
phoneID = response.meta['phoneID']
meta = response.meta
priceStr = response.body.decode("gbk", "ignore")
priceJson = json.loads(priceStr)
price = float(priceJson[0]["p"])
meta['price'] = price
差知 phoneUrl = "http://item.jd.com/%s.html" % phoneID
yield Request(phoneUrl, callback=self.parse_phone_info, meta=meta)
def parse_phone_info(self, response):
pass
def parse_commnets(self, response):
commentsItem = JdPhoneCommentItem()
commentsStr = response.body.decode("gbk", "ignore")
commentsJson = json.loads(commentsStr)
comments = commentsJson['comments']
for comment in comments:
commentsItem['commentId'] = comment['id']
漏兆commentsItem['guid'] = comment['guid']
commentsItem['content'] = comment['content']
commentsItem['referenceId'] = comment['referenceId']
# 2016-09-19 13:52:49 %Y-%m-%d %H:%M:%S
datetime.strptime(comment['referenceTime'], "%Y-%m-%d %H:%M:%S")
commentsItem['referenceTime'] = datetime.strptime(comment['referenceTime'], "%Y-%m-%d %H:%M:%S")
commentsItem['referenceName'] = comment['referenceName']
commentsItem['userProvince'] = comment['userProvince']
# commentsItem['userRegisterTime'] = datetime.strptime(comment['userRegisterTime'], "%Y-%m-%d %H:%M:%S")
commentsItem['userRegisterTime'] = comment.get('userRegisterTime')
commentsItem['nickname'] = comment['nickname']
commentsItem['userLevelName'] = comment['userLevelName']
commentsItem['userClientShow'] = comment['userClientShow']
commentsItem['proctColor'] = comment['proctColor']
# commentsItem['proctSize'] = comment['proctSize']
commentsItem['proctSize'] = comment.get("proctSize")
commentsItem['afterDays'] = int(comment['days'])
images = comment.get("images")
images_urls = ""
if images:
for image in images:
images_urls = image["imgUrl"] + ";"
commentsItem['imagesUrl'] = images_urls
yield commentsItem
commentCount = commentsJson["proctCommentSummary"]["commentCount"]
goodCommentsCount = commentsJson["proctCommentSummary"]["goodCount"]
goodCommentsRate = commentsJson["proctCommentSummary"]["goodRate"]
generalCommentsCount = commentsJson["proctCommentSummary"]["generalCount"]
generalCommentsRate = commentsJson["proctCommentSummary"]["generalRate"]
poorCommentsCount = commentsJson["proctCommentSummary"]["poorCount"]
poorCommentsRate = commentsJson["proctCommentSummary"]["poorRate"]
phoneID = commentsJson["proctCommentSummary"]["proctId"]
priceUrl = "http://p.3.cn/prices/mgets?skuIds=J_%s" % phoneID
meta = {
"phoneID": phoneID,
"commentCount": commentCount,
"goodCommentsCount": goodCommentsCount,
"goodCommentsRate": goodCommentsRate,
"generalCommentsCount": generalCommentsCount,
"generalCommentsRate": generalCommentsRate,
"poorCommentsCount": poorCommentsCount,
"poorCommentsRate": poorCommentsRate,
}
yield Request(priceUrl, callback=self.parse_phone_price, meta=meta)
pageNum = commentCount / 10 + 1
for i in range(pageNum):
commentsUrl = "http://sclub.jd.com/proctpage/p-%s-s-0-t-3-p-%d.html" % (phoneID, i)
yield Request(commentsUrl, callback=self.parse_commnets)
H. 如何用python爬取網站數據
這里簡單介紹一下吧,以抓取網站靜態、動態2種數據為慧返拍例,實驗環境win10+python3.6+pycharm5.0,主要內容如下:
抓取網站靜態數據(數據在網頁源碼中):以糗事網路網站數據為例
1.這里假設我們抓取的數據如下,主要包括用戶昵稱、內容、好笑數和評論數這4個欄位,如下:
對應的網頁源碼如下,包含我們所需要的數據:
2.對應網頁結構,主要代碼如下,很簡單,主要用到requests+BeautifulSoup,其中requests用於請求頁面,BeautifulSoup用於解析頁面:
程序運行截圖如下,已經成功爬取到數據:
抓取網站動態數據(數據不在網頁源碼中,json等文件中):以人人貸網站數據為例
1.這里假設我們爬取的是債券數據,主要包括年利率世型、借款標題、期限、金額和進度這5個欄位信息,截圖如下:
打開網頁源碼中,可以發現數據不在網頁源碼中,按F12抓包分析時,才發現在一個json文件中,如下:
2.獲取到json文件的url後,我們就可以爬取對應數據了,這里使用的包與上面類似,因為是json文件,所以還用了json這個包(解析json),主要內容如下:
程序運行截圖如下,前羨已經成功抓取到數據:
至此,這里就介紹完了這2種數據的抓取,包括靜態數據和動態數據。總的來說,這2個示例不難,都是入門級別的爬蟲,網頁結構也比較簡單,最重要的還是要會進行抓包分析,對頁面進行分析提取,後期熟悉後,可以藉助scrapy這個框架進行數據的爬取,可以更方便一些,效率更高,當然,如果爬取的頁面比較復雜,像驗證碼、加密等,這時候就需要認真分析了,網上也有一些教程可供參考,感興趣的可以搜一下,希望以上分享的內容能對你有所幫助吧。
I. Python爬蟲(七)數據處理方法之JSON
JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation),是輕量級的文本數據交換格式,且具有自我描述性,更易理解。
JSON看起來像python類型(列表,字典)的字元串。
在之前的文章中,我們說到了怎麼用response的方法,獲取到網頁正確解碼後的字元串。如果還有不懂的,可以先閱讀 Python爬蟲(三)Requests庫 。接下來以有道翻譯為例子,說說怎麼通過網頁解碼後的字元串,提取到翻譯結果。
再結合上述有道翻譯的例子,得到字典類型的返回結果,並提取出來翻譯結果。
將上述例子的dict_json換成str字元串,再寫入文本中。
執行完上述的程序,會得到一個fanyi.txt的文件,其結果如下:{"type": "ZH_CN2EN", "errorCode": 0, "elapsedTime": 1, "translateResult": [[{"src": "\u4eba\u751f\u82e6\u77ed\uff0c\u6211\u7528python", "tgt": "Life is too short, I use python"}]]}。這樣子的一份文檔,中文部分顯示的是二進制,且格式非常不利於閱讀,這並不是我們想要的結果。好在json.mps()為我們提供的兩個方法,以幫助我們更好閱讀文檔。
1.ensure_ascii,能夠讓中文顯示成中文;
2.indent,能夠讓下一行在第一行的基礎上空格。
其用法如下:
J. 如何使用python提取json中指定欄位的數據
首先你獲取的json數據是字元串a的話,就
import json
d = json.loads(a)
x =d.get("想要的欄位")
x就是你要的數據