【爬虫】爬取动态网页内容并储存到表格

爬取东方财富网的基金行情

网站链接:http://quote.eastmoney.com/

 进入到网站之后点击基金

e8f0ed1fadd94cf3b3fdfc968b66d440.png

 再点击排行

bd888aa1f8aa49e08a24a1865c87a8db.png

 下面这张图就是我们想要获取的内容了

85535dc0d9e94737835095ab708d578b.png

1.分析所有页的请求url 

爬虫的第一步就是要获取网站的请求url,在这里我们是在第一页,然后点击下一页跳转到第二页之后发现,网页左上角的网址是没有变的。因为这是动态网页是通过Ajax动态加载的,无论你点击到哪一页,左上角的网址都是不会变的。

b2615ee83821453d8bb36fcda79df78e.png

 既然这是个动态网页那我们想要的数据肯定不是在网页源代码里的了,所以我们直接右击检查打开开发者工具,然后点击网络,选择Fetch/XHR,刷新网页,查看左边的网页

9fafbefaa8cb475ea8f4aa3bd1106b7e.png

 查看完之后发现我们想要的数据都不在里面,那么我们在JS里看看,点击JS,再选择清除,然后点击第二页刷新一下数据,然后查找

ee16baf67d9849c186789935d24c31bc.png

 在我们点进第二页后发现已经刷新出了一些新的数据,我们依次点击,然后查看预览发现第一个就是我们想要的数据,而且很明显可以看出我们想要的数据是json数据。

8026892aeeb9489d9fcdefb71ee08bd8.png

 再查看一下这一页的请求url情况,点击标头

179209ce54dc4a4683a5a94a9fad571b.png

 可以发现这页的请求url后面一大串,但其实疑问号"?"后面的都是参数,接下来我们看一下参数情况,点击负载

009055d735714833bfda372d0d99867f.png

 在负载里我们看到每一个参数,其中pn=2就是最关键的了,这其实就是代表着当前的页数。为了确保我们没有弄错,我们点击清除,再选择回到我们的第一页查看第一页的参数后发现,第一页的pn=1那就说明我们没有弄错

9bdc1c98cafc40b0beb0d35adfb2766f.png

 既然pn=1是第一页,pn=2是第二页那么每一页都有对应一个pn值,也就是说我们想要获取哪页的请求url就把其中pn的值替换成相应的值就行了,这样我们就可以获取所有页的请求url。

2.导入相应的库

在这里我测试了一下创建一个线程与不创建线程的运行时间,所以导入了Thread和time。

import csv
import time
import json
import requests
from threading import Thread 
from urllib.parse import urlencode

3.创建相应的表格表头

    # 创建表格
    f=open('股票行情2.csv','a+',encoding='utf-8')
    a=csv.writer(f)
    # 创建表头
    a.writerow(('代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额','振幅','最高','最低','今开','昨收','量比','换手率','市盈率','市净率'))

4.数据清洗

因为通过requests得到的数据是这样的,是一个字符串类型。

2e5cca955be34e1697848345f1f11e68.png

 而我们想要的是里面的json数据,所以在这我取巧了,直接用字符串的切片把里面的json数据给拿出来了然后再用loads()方法转化为python字典对象。

def get_info(url):
    response=requests.get(url,headers=head)
    response=response.text[42:-2] # 取出json数据
    data=json.loads(response)  # 转化为python对象
    datas=data['data']['diff']
    for i in datas:
        d={
            '代码':i['f12'],'名称':i['f14'],'最新价':i['f2'],'涨跌幅':i['f3'],'涨跌额':i['f4'],'成交量':i['f5'],'成交额':i['f6'],'振幅':i['f7'],
            '最高':i['f15'],'最低':i['f16'],'今开':i['f17'],'昨收':i['f18'],'量比':i['f10'],'换手率':i['f8'],'市盈率':i['f9'],'市净率':i['f23']
        }
        #添加进表格
        a.writerow((d['代码'],d['名称'],d['最新价'],d['涨跌幅'],d['涨跌额'],d['成交量'],d['成交额'],d['振幅'],d['最高'],d['最低'],d['今开'],d['昨收'],d['量比'],d['换手率'],d['市盈率'],d['市净率']))

完整代码

import csv
import time
import json
import requests
from threading import Thread 
from urllib.parse import urlencode

def get_info(url):
    response=requests.get(url,headers=head)
    response=response.text[42:-2] 
    data=json.loads(response)  
    datas=data['data']['diff']
    for i in datas:
        d={
            '代码':i['f12'],'名称':i['f14'],'最新价':i['f2'],'涨跌幅':i['f3'],'涨跌额':i['f4'],'成交量':i['f5'],'成交额':i['f6'],'振幅':i['f7'],
            '最高':i['f15'],'最低':i['f16'],'今开':i['f17'],'昨收':i['f18'],'量比':i['f10'],'换手率':i['f8'],'市盈率':i['f9'],'市净率':i['f23']
        }
        a.writerow((d['代码'],d['名称'],d['最新价'],d['涨跌幅'],d['涨跌额'],d['成交量'],d['成交额'],d['振幅'],d['最高'],d['最低'],d['今开'],d['昨收'],d['量比'],d['换手率'],d['市盈率'],d['市净率']))

if __name__ == '__main__':
    start=time.time()
    # 创建表格
    f=open('股票行情.csv','a+',encoding='utf-8')
    a=csv.writer(f)
    # 创建表头
    a.writerow(('代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额','振幅','最高','最低','今开','昨收','量比','换手率','市盈率','市净率'))

    head = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.34'}
    url=' http://98.push2.eastmoney.com/api/qt/clist/get?'
    for i in range(1,270):
        parmas={
            "cb": "jQuery112406972859260835329_1681831227889",
            "pn": f"{i}",
            "pz": "20",
            "po": "1",
            "np": "1",
            "ut": "bd1d9ddb04089700cf9c27f6f7426281",
            "fltt": "2",
            "invt": "2",
            "wbp2u": "|0|0|0|web",
            "fid": "f3",
            "fs": "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048",
            "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
            "_": "1681831228407"
        }
        new_url=url+urlencode(parmas)
        # 创建线程
        t1 = Thread(target=get_info, args=(new_url,))
        t1.start()
        print(f'第{i}页爬取完毕!!!')

    end=time.time()
    print(f'总共用时{end-start}秒')

下面左图是创建了线程运行的,右图是正常运行的,可以发现使用多线程爬虫确实快得多。

9ae199231d304103b8917e0ed0e2c6eb.png

 部分结果如下图

d9ccafe35a2f4c8dafcff73e45998186.png

本人初学爬虫,如有误,希望大家多指正!!!

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值