【笔记】python自学笔记(爬虫篇)——东方财富实战
本帖最后由 qianshang666 于 2021-3-1 20:19 编辑一.前言
今天的话是说一下东方财富网实战,这节是我讲的第一个JS动态加载的实战,也是第一个涉及到大量修改参数提交的,里面会讲到json解析,csv格式保存,包括时间戳的构建
https://static.52pojie.cn/static/image/hrline/1.gif
二.对界面刷新
因为这个网站里面数据有点多,所以我就选取指数中的数据进行爬取,我们依旧按照我们之前的步骤,先对界面进行刷新,看看刷新的包,但我们找到刷新包的preview的时候,我们却在这个界面里面没有找到我们要爬取的数据
https://static.52pojie.cn/static/image/hrline/1.gif
三.先查看网页源代码
这证明这些数据要么是源代码动态加载,要么就是JS动态加载的,我们先看源代码里有没有,鼠标单击右键,然后我们查看网页源代码
我们在网页源代码按下CTRL+F键,打开搜索框,然后随便复制一个值,查找一下,我们没有找到
https://static.52pojie.cn/static/image/hrline/1.gif
四.接下来从我们就要看是不是JS动态加载的了
第一步,我们抓一下翻页的包看看数据包
第二步,接下来我们查看一下这个包的preview,我们可以很清晰的看到这里有很多的数据,其实这些就是我们要爬取的数据
第三步,我们重新开始分析一下第一步中抓到的数据包
http://41.push2.eastmoney.com/api/qt/clist/get?cb=jQuery11240024266496839688845_1614595213722&pn=2&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:1+s:2&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152&_=1614595213804
这个是url,好长哦,其实我们一步一步分析下去你就不觉得它难,http://41.push2.eastmoney.com/api/qt/clist/get这一段是真正的url
?后面的都是参数,?在这里你可以理解成分割符,后面的参数又是由&这个符号分割的
cb=jQuery11240024266496839688845_1614595213722比如说这个参数,我感觉1614595213722这个是时间戳,前面的我也不确定
pn=2这个参数一看就是页数嘛,因为我这个是翻页的包,正好翻到了第二页
pz=20这个参数不出意外应该是每一个的数据是20条
po=1这个参数我不清楚,等会我们刷新一下第三页试试变不变再说
ut=bd1d9ddb04089700cf9c27f6f7426281这个有点像是加密呀(但其实不是,哈哈)
fltt=2这个也暂时搁浅,估计不变
invt=2这个也搁浅,估计不变
fid=f3这个也搁浅,估计不变
fs=m:1+s:2这个也搁浅,估计不变(写到这里我都被自己整笑了)
fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152这个参数不用搁浅,我们看第二步就猜得出来,这个是每个参数的索引值
_=1614595213804这个参数我看着也像是时间戳
第四步,带大家看看我们刚才分析的这些参数在哪里,等会我们就复制这个param来改就可以
https://static.52pojie.cn/static/image/hrline/1.gif
五.处理一下类似加密数据
ut=bd1d9ddb04089700cf9c27f6f7426281这个参数有点像是加密,如果是加密的话我们就要解密,我们查看一下
我们先找到search
然后对关键字进行查找,我们发现它是固定的,直接是明文,这里我们修改参数时对这个参数不修改就可以了
https://static.52pojie.cn/static/image/hrline/1.gif
六.接下来就是代码部分了
import requests
import json #解析json数据
import time #用来构建时间戳
import csv #保存成csv格式
def data(page,time_stamp):
with open('股票1.csv','a',newline = '',encoding='utf_8_sig') as file_data:
csvwriter = csv.writer(file_data,dialect = 'excel')
csvwriter.writerow(['板块名称','涨跌幅度','涨跌额度','最新价格'])
url = 'http://41.push2.eastmoney.com/api/qt/clist/get'
headers = {
'Referer': 'http://quote.eastmoney.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}
#这个参数列表
datas = {
'cb': f'jQuery1124012733975560100586_{time_stamp}',
'pn': f'{page}',
'pz': '20',
'po': '1',
'np': '1',
'ut': 'bd1d9ddb04089700cf9c27f6f7426281',
'fltt': '2',
'invt': '2',
'fid': 'f3',
'fs': 'm:1 s:2',
'fields': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152,f124,f107,f104,f105,f140,f141,f207,f208,f209,f222',
'_': f'{time_stamp}'
}
#创建一些列表来存放数据
bankuai_names1 = []
zhangdie_edus1 = []
zhangdie_fudus1 = []
new_prices1 = []
jsondata = requests.get(url = url,headers = headers,params = datas).text #输出文本
start_data = jsondata.index('{"rc":0,') #取出前面文本
end_data = jsondata.index('}]}}') + len('}]}}') #取出后面文本
for json_data in json.loads(jsondata)['data']['diff']:
bankuai_names = json_data['f14']
bankuai_names1.append(bankuai_names)
zhangdie_fudus = json_data['f3']
zhangdie_fudus1.append(zhangdie_fudus)
zhangdie_edus = json_data['f4']
zhangdie_edus1.append(zhangdie_edus)
new_prices = json_data['f2']
new_prices1.append(new_prices)
for a,c,d,e in zip(bankuai_names1,zhangdie_edus1,zhangdie_fudus1,new_prices1):
with open('股票1.csv','a',newline = '',encoding = 'utf_8_sig') as file_data:
csvwriter = csv.writer(file_data,dialect='excel')
csvwriter.writerow()
print('数据导出成功')
if __name__ == '__main__':
time_stamp = time.time() #取出时间戳
time_stamp = int(time_stamp*1000) #将10位整数变为13位整数
print(time_stamp)
page = input("请输入你想要爬取的页数:")
data(page,time_stamp)
https://static.52pojie.cn/static/image/hrline/1.gif
七.代码部分解析
1.先说一下70和71行的构建时间戳
我们单独运行70行生成的时间戳是1614599311.6949852这种格式的
但我们需要的是13位的所以我们用71行代码进行了一个新的构造
小数点向后移动3位,这样就成了13位整数,然后我们取整就好了
2.接下来就是44,45,46行的代码了,我们在看代码之前我们先看看json数据
其实这个json数据不规范,他多了,前面多了jQuery11240024266496839688845_1614595213722(这一部分
后面多了);这部分,所以我们要进行掐头去尾取中间的操作
index这个方法就很重要了,index()函数可用于查找列表中对应函数的索引值并输出
但我们在取末尾的数据的时候,因为是要把末尾的数据留下,所以我们要把末尾取的数据的长度加上
然后我对46行代码分解一下,大家应该就挺好明白了
原46行代码:
for json_data in json.loads(jsondata)['data']['diff']:
jsondata 这一部分是切片,因为44,45行用index取出来的是索引,这里我们用切片的方式取出中间文本
json.loads(jsondata) 这一部分是对取出的json文本进行json加载
json.loads(jsondata)['data']['diff'] 这一部分是加载完成json代码之后,根据json代码也是键值对的原因,用data和diff取键值对
3.第8,9,10代码和63,64,65行代码
前面的是为了先构建一个csv文件,然后定义一下头部,后面就是分别添加数据,这个语法是固定的,大家只需要记住就行
4.第62行是序列解包,我之前说过,就是有顺序的进行循环各个值
https://static.52pojie.cn/static/image/hrline/1.gif
八.后言
今天这个东方财富实战就算结束了,大家有不理解的可以评论区问我,本人也只是小白一个,有不足的地方也希望各位大佬能及时指正,我绝对虚心受教感谢大家的观看 感谢大佬分享原创作品 vethenc 发表于 2021-3-1 20:30
感谢大佬分享原创作品
大家共同学习 收藏学习了!谢谢分享! 共同学习 dipper 发表于 2021-3-1 20:59
共同学习
共同进步,共同努力 感谢分享 先收藏一波 感谢分享,学习了 共同进步,共同努力加油