2016-04-28 60 views
1

我對HTML並不擅長,所以我對此有點失望。無法找到html標籤進行刮取

我想抓取instagram datetime帖子使用python,並意識到日期時間信息不是沒有該文章的HTML文檔。但是,我可以使用檢查元素來查詢它。見下面的屏幕截圖。

Inspect element of date (below follow button

如果正好位於這個日期信息,以及如何獲得呢?

我從這個隨機文章「https://www.instagram.com/p/BEtMWWbjoPh/」取的例子。元素位於頁面中顯示的「12h」處。

[Update]我正在使用urllib抓取url,並在python中用bs4進行刮擦。輸出沒有返回任何與日期時間。代碼如下。我還打印出整個html,我很驚訝它不包含datetime。

html = urllib.urlopen(url).read() 
soup = BeautifulSoup(html, 'html.parser') 
tags = soup.select('time') 
    for tag in tags: 
     dateT = tag.get('datetime').getText() 
     print dateT 
+0

什麼蟒蛇您使用的是刮的頁面庫? – BananaNeil

+0

已更新我的帖子。謝謝 – Jake

回答

2

我認爲你遇到的問題是urllib.urlopen(url).read()不執行頁面上的任何JavaScript。

因爲Instagram的是JavaScript的應用程序,使用瀏覽器來渲染其網站客戶端,你將需要某種瀏覽器客戶端的評估JavaScript,然後在網頁上找到的元素。對於這一點,我通常使用phantomjs(我一般用紅寶石司機Capybara使用它,但我會假設有一個Python包,將同樣工作)

但是,如果執行urllib.urlopen(url).read(),你應該看到的一個塊JSON以腳本標記開頭<script type="text/javascript">window._sharedData = {...

該塊JSON將包含您正在查找的數據。如果您要評估該JSON並對其進行解析,則應該能夠訪問您正在查找的時間數據。

話雖這麼說,在更好辦法做到這一點是使用instagram's api做爬行。他們將所有這些數據提供給開發人員,因此您無需抓取不斷變化的網頁。

(顯然的Instagram的API將只返回誰明確賦予您的應用程序允許用戶公開數據)

+1

謝謝尼爾,這正是我懷疑的...... btw只是一個問題b4我點擊你的正確答案。我認爲Instagram已經阻止人們使用他們的完整API並將正常/個人用戶降級到他們的沙盒API。我不認爲沙盒API可以從他們自己的帖子中提取信息。我對嗎? – Jake

+0

我只是看着它,而你完全正確。對於那個很抱歉。我已經更新了我的答案。 – BananaNeil

+0

謝謝尼爾,你的回答無論如何都幫助了我。從一個小小的研究中,PhatomJS支持在python中解析JS。謝謝! – Jake

2

在你的開發者控制檯,輸入:

document.getElementsByTagName('time')[0].getAttribute('datetime'); 

這將返回你正在尋找的數據。上面的代碼只是查看HTML標籤名稱time,其中只有一個,然後從中獲取datetime屬性。

至於python,如果還沒有,請查看BeautifulSoup。該庫將允許你做類似的事情在python:

from bs4 import BeautifulSoup 
soup = BeautifulSoup(html_doc, 'html.parser') 
soup.time['datetime'] 

哪裏html_doc是你的原始HTML。要獲取原始HTML,請使用requests庫。

+0

感謝chris,在開發者控制檯中,我可以得到日期時間。對於python代碼,我做了類似於你推薦的東西,除了我使用urlib來抓取html。結果是空的。我打印出整個頁面的html,但它不包含日期時間值。 – Jake