大数据(二) 数据扒取小结——总结完发现没多少内容

第一节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也是类似的功能,只是与文件操作结合起来了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值