qianshang666 发表于 2021-3-1 20:15

【笔记】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

感谢大佬分享原创作品

qianshang666 发表于 2021-3-1 20:31

vethenc 发表于 2021-3-1 20:30
感谢大佬分享原创作品

大家共同学习

xjshuaishuai 发表于 2021-3-1 20:33

收藏学习了!谢谢分享!

dipper 发表于 2021-3-1 20:59

共同学习

qianshang666 发表于 2021-3-1 21:15

dipper 发表于 2021-3-1 20:59
共同学习

共同进步,共同努力

ciker_li 发表于 2021-3-1 21:56

感谢分享

喜欢你和酸奶 发表于 2021-3-1 21:57

先收藏一波

csz383 发表于 2021-3-1 23:45

感谢分享,学习了

zhang0395 发表于 2021-3-2 09:30

共同进步,共同努力加油
页: [1] 2 3 4 5 6 7 8
查看完整版本: 【笔记】python自学笔记(爬虫篇)——东方财富实战