1. 程式人生 > >大資料(二) 資料扒取小結——總結完發現沒多少內容

大資料(二) 資料扒取小結——總結完發現沒多少內容

第一節2

你的理解:

1. xpath作用:在Xml文件裡快速定位元素。

如何使用xpath:通過一個Xml物件呼叫它。

一般的格式:

html.xpath(/html/@class)[0].tag/text

符號解釋:

/ 用於定位

//表示省略,中間有啥我不管

@表屬性

[]表示條件,條件裡還可以用contains(元素 如@href或者text(),字串)或startwith

[0] 切記Xpath返回值都是集合,所以一定要用index來獲取確定的元素,這裡只有一個元素就是自己。

local-name() 本地名,沒啥用和普通寫法等價。

獲取一個元素的某個屬性值:

@class或.get(‘’)或者.attrib[‘’]

30分鐘就講了這麼點東西,總結:

xpath格式以及裡面引數的含義,如何找到一個元素以及如何獲取它的屬性值。

第2節-1:

1.新增子元素

etree.SubElement() 三個引數為父元素,子元素名,屬性名(如果是多個屬性或者關鍵字,可以寫成字典的形式)

2. CssSelect

非常簡單,有時候你xpath的話多層定位是很複雜的,不如直接用css定位元素。

html.cssselect(".it21")[0].xpath(./context)

比如這段程式碼表示,可以通過相對路徑找到it21這個值所在的元素,在此基礎上./相對位置找context元素。

3.獲取頁面

import requests

response=requests.get(url) 獲取頁面,返回值是一個response物件

print(response.text) 獲取頁面內容

第2節-2

雅虎金融資料爬取demo步驟:

0.定義好一個變數代表股票程式碼(這裡叫ticker),url是通用的,只需要換股票程式碼即可。

url = "https://finance/yahoo/s%?p%s" %(ticker,ticker)

[佔位符: 在Python程式設計中,%s表示格化式一個物件為字元,%d表示整數。比如%s % "zhangsan" 的意思是,用%s來佔位,值取zhangsan]

1. 通過requests.get(url)獲取頁面的resonse,然後response.text就是頁面的內容。

2.頁面內容的變數,需要通過

(1)lxml.html.fromstring(response_text) 轉換成一個xml文件

或者

(2)如果你爬的是json格式的資料 通過json.loads(json_response_text)轉換成json物件

注意:需要先import json

3.怎麼取到自己想要的資料

經過第2步之後,我們有了xml文件或者json物件,就可以通過xpath來鎖定元素。

summary_rows = html.xpath('/html/body//div[contains(@test-data,"summary-table")]' //tr)

--------------------表示獲得body下面的div(div的test-data屬性需包含summary-table),然後再向下找到tr元素。找到的不止一個元素,返回的是集合。

json物件就更容易了,直接層層取就可以,最後取到的是一個值(不是集合)。

直接 target_estimation = summary_json["quoteSummary"]["result"][0]['financilalData']

你還可以用這種方法取多個這樣的值,比如說平均收益、最低成交價等等。

4. 把篩選出來的東西放到集合裡

(1)引入OrderedDict 使字典的資料按插入順序輸出

(2)建立新的集合來存放和加工一下 篩選出來的資料

datalist = [ ] //用來裝json物件中獲取的資料

summary_data = OrderedDict() //新建立一個字典,讓資料有序。

for i in earings_list['earningsDate']: //earingsDate是JSON物件下面的,下級是0和1-->下下級是raw和fmt。所以i就是0和1,遍歷取0和1的fmt也就是時間欄位。

datalist.append(i['fmt'])

earings_date = ' to '. join(datalist) //join表示把to新增到兩個資料之間

for table_data in summary_rows // 由於和外層迴圈是分別往兩個集合裡新增資料,所以根本互不干擾。summary_rows是從一個tr集合裡遍歷每個tr。

raw_table_key = table_data.xpath(' .//td[contains(@xxxx,"C(black)")] //text() ') //從tr開始,尋找xxxx屬性包含C(black)的td欄位,找到之後再找下面的text文字。返回的也是集合。

raw_table_value = table_data.xpath(' .//td[contains(@xxxx,"Ta(end)")] //text() ') //包含Ta(end)的td下面的值是value。也就是 最低價:15rmb 這種效果。這需要你對頁面的欄位和值都在哪兒所有了解。

table_key = ' '.join(raw_table_key).strip() // raw_table_key裡的元素以空格隔開,strip去掉兩端字元(預設是去掉兩端的空格)。

table_value = ' '.join(raw_table_value).strip()

summary_data.update({table_key:table_value}) //table_key和table_value,每個tr下最多隻有一個。所以現在只是新增一個鍵值對。如果tr下有好幾個符合條件的td,這裡才會分幾次新增鍵值對。

summary_data.update({'ly': ly, 'ticker':ticker})

5. 把整理出來的資料放到檔案裡

還記得with的好處嗎,就是檔案自動會幫你關掉。

with open(' /home/wayne/hdp.json','w') as fp:

json.dump(summary_data, fp ,indent = 4) //表示將dict轉換成str後存入檔案 縮排4個字

最後補充內容

json.dump()

直接把常用引數列一下好了

引數名

解釋

obj

要存入json檔案的python物件

fp

檔案控制代碼

ensure_ascii

設定為False的話才可以把中文以中文的形式存到檔案裡,否則會是’\xXX\xXX’這種

indent

縮排的空格數,設定為非零值時,就起到了格式化的效果,比較美觀

dumps和dump的區別:

dumps是將dict轉化成str格式,loads是將str轉化成dict格式。

dump和load也是類似的功能,只是與檔案操作結合起來了。