吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9354|回复: 73
收起左侧

[学习记录] 【笔记】python自学笔记(爬虫篇)——东方财富实战

  [复制链接]
qianshang666 发表于 2021-3-1 20:15
本帖最后由 qianshang666 于 2021-3-1 20:19 编辑

一.前言
今天的话是说一下东方财富网实战,这节是我讲的第一个JS动态加载的实战,也是第一个涉及到大量修改参数提交的,里面会讲到json解析,csv格式保存,包括时间戳的构建

二.对界面刷新
因为这个网站里面数据有点多,所以我就选取指数中的数据进行爬取,我们依旧按照我们之前的步骤,先对界面进行刷新,看看刷新的包,但我们找到刷新包的preview的时候,我们却在这个界面里面没有找到我们要爬取的数据
刷新界面.png

三.先查看网页源代码
这证明这些数据要么是源代码动态加载,要么就是JS动态加载的,我们先看源代码里有没有,鼠标单击右键,然后我们查看网页源代码
查看网页源代码.png
我们在网页源代码按下CTRL+F键,打开搜索框,然后随便复制一个值,查找一下,我们没有找到
源代码查找.png

四.接下来从我们就要看是不是JS动态加载的了
第一步,我们抓一下翻页的包看看数据包
翻页数据.png
第二步,接下来我们查看一下这个包的preview,我们可以很清晰的看到这里有很多的数据,其实这些就是我们要爬取的数据
翻页preview.png
第三步,我们重新开始分析一下第一步中抓到的数据包
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来改就可以
分析数据2.png

五.处理一下类似加密数据
ut=bd1d9ddb04089700cf9c27f6f7426281这个参数有点像是加密,如果是加密的话我们就要解密,我们查看一下
我们先找到search
search.png
然后对关键字进行查找,我们发现它是固定的,直接是明文,这里我们修改参数时对这个参数不修改就可以了
ut无加密.png

六.接下来就是代码部分了
[Python] 纯文本查看 复制代码
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[start_data:end_data])['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([a,c,d,e])
    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)


七.代码部分解析
1.先说一下70和71行的构建时间戳
我们单独运行70行生成的时间戳是1614599311.6949852这种格式的
但我们需要的是13位的所以我们用71行代码进行了一个新的构造
小数点向后移动3位,这样就成了13位整数,然后我们取整就好了
2.接下来就是44,45,46行的代码了,我们在看代码之前我们先看看json数据
json数据.png
其实这个json数据不规范,他多了,前面多了jQuery11240024266496839688845_1614595213722(这一部分
后面多了);这部分,所以我们要进行掐头去尾取中间的操作
index这个方法就很重要了,index()函数可用于查找列表中对应函数的索引值并输出
但我们在取末尾的数据的时候,因为是要把末尾的数据留下,所以我们要把末尾取的数据的长度加上
然后我对46行代码分解一下,大家应该就挺好明白了
原46行代码:
[Python] 纯文本查看 复制代码
for json_data in json.loads(jsondata[start_data:end_data])['data']['diff']:

jsondata[start_data:end_data]    这一部分是切片,因为44,45行用index取出来的是索引,这里我们用切片的方式取出中间文本
json.loads(jsondata[start_data:end_data])    这一部分是对取出的json文本进行json加载
json.loads(jsondata[start_data:end_data])['data']['diff']    这一部分是加载完成json代码之后,根据json代码也是键值对的原因,用data和diff取键值对
3.第8,9,10代码和63,64,65行代码
前面的是为了先构建一个csv文件,然后定义一下头部,后面就是分别添加数据,这个语法是固定的,大家只需要记住就行
4.第62行是序列解包,我之前说过,就是有顺序的进行循环各个值

八.后言
今天这个东方财富实战就算结束了,大家有不理解的可以评论区问我,本人也只是小白一个,有不足的地方也希望各位大佬能及时指正,我绝对虚心受教感谢大家的观看

免费评分

参与人数 18吾爱币 +16 热心值 +15 收起 理由
yufei8051 + 1 + 1 谢谢@Thanks!
lua11 + 1 + 1 用心讨论,共获提升!
lymzzy + 1 谢谢@Thanks!
爱穹妹 + 1 + 1 谢谢@Thanks!
Reer + 1 + 1 我很赞同!
ckyanc + 1 + 1 用心讨论,共获提升!
sam喵喵 + 1 谢谢@Thanks!
Triple.J + 1 我很赞同!
日入一万刀 + 1 + 1 先把赞点上,等会来研究,谢谢!
zhangli777 + 1 + 1 用心讨论,共获提升!
comon + 1 谢谢@Thanks!
raelag + 1 我很赞同!
久住飞鸟 + 1 + 1 我很赞同!
奕余君 + 1 + 1 已关注,真高产啊
kai-memory + 1 我很赞同!
叙隐微觉 + 1 + 1 我很赞同!
vethenc + 2 + 1 谢谢@Thanks!
制冷设备 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

vethenc 发表于 2021-3-1 20:30
感谢大佬分享原创作品
 楼主| qianshang666 发表于 2021-3-1 20:31
xjshuaishuai 发表于 2021-3-1 20:33
dipper 发表于 2021-3-1 20:59
共同学习
 楼主| qianshang666 发表于 2021-3-1 21:15

共同进步,共同努力
ciker_li 发表于 2021-3-1 21:56
感谢分享
喜欢你和酸奶 发表于 2021-3-1 21:57
先收藏一波
csz383 发表于 2021-3-1 23:45
感谢分享,学习了
zhang0395 发表于 2021-3-2 09:30
共同进步,共同努力加油
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-10 10:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表