##并购重组数据爬取案例
1、寻找并购数据网址,网址见案例代码;
2、分析数据在网页上存在的形式。
例如本文:每次跳转页面,都会发送一个请求,返回一个Json格式的结果。
我们可以看到json里面的数据就是我们在网页中看到的并购数据,我们可以对该json文件进行解析就可以获取到需要的并购重组数据;
3、通过目前的json获取到的数据仅仅只是一个页面的数据,我们查看请求地址发现,页面跳转,参数pageNumber跟随着页面的跳转变化。
因此我们可以通过遍历pageNumber来爬取所以页码。
当然由于pageSize参数的存在,实际上,给我们提供了一次性爬取的技巧,但是本文暂不是使用该参数进行偷懒,采用遍历页码的方式爬取。
https://datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery112304752391324797971_1649497021854&sortColumns=SCGGRQ&sortTypes=-1&pageSize=50&pageNumber=2&columns=ALL&source=WEB&token=894050c76af8597a853f5b408b759f5d&reportName=RPTA_WEB_BGCZMX
4、通过python写脚本实时获取该网页的页数;
def tablelenth(self):
"""
:comment:获取实时爬取数据的页码的长度
:return:脚本运行时间下的东方财富并购重组页面下数据表的页数
"""
bingouhtml=request.urlopen(r'https://data.eastmoney.com/bgcz/').read()
bingouhtml=str(bingouhtml)
pattern=r'"pages":(\d{4,5})'
lenlist=re.findall(pattern,bingouhtml)
if len(lenlist)==1:
return int(lenlist[0])
else:
print('页码长度获取异常')
sys.exit(0)
5、批量生成请求连接URL
def geturl(self):
"""
:comment 根据page_length,获取并购url链接,每从第1页开始到page_length页;
:return url链接列表
"""
page_length=self.tablelenth()
urlList=[]
for i in range (page_length):
json_url='https://datacenter-web.eastmoney.com/api/data/get?callback=jQuery112304809089840055041_1640451070306&st=SCGGRQ&sr=-1&ps=50&p=' +str(i+1)+'&sty=ALL&source=WEB&token=894050c76af8597a853f5b408b759f5d&type=RPTA_WEB_BGCZMX'
urlList.append(json_url)
return urlList
6、遍历请求连接获取并购数据,将并购数据写入excel中。
def get_data(self):
'''
:comment 根据url连接,获取并购数据,并将他们写入到execl中
【⚠️该方法主要通过json.loads,将str类型转化为dict,通过对dict的解析获取数据,缺点在于没办法直接解析到json中带[]部分的内容】
:return:
'''
urlList=self.geturl()
datamatrix = []
for i in range(len(urlList)):
result=request.urlopen(urlList[i]).read().decode("utf-8")
pattern=r'jQuery112304809089840055041_1640451070306\((.*)\)'
result=re.findall(pattern,result)
result=json.loads(result[0])
result=result["result"]["data"]
for data in result:
rowlist=[]
rowlist.append(data['MXID'])
rowlist.append(data['H_COMNAME'])
rowlist.append(data['G_GOMNAME'])
rowlist.append(data['S_COMNAME'])
rowlist.append(data['SCODE'])
rowlist.append(data['SNAME'])
rowlist.append(data['ZRBL'])
rowlist.append(data['OBJTYPE'])
rowlist.append(data['JYJE'])
rowlist.append(data['JD'])
rowlist.append(data['ZRFS'])
rowlist.append(data['SCGGRQ'])
rowlist.append(data['ANNOUNDATE'])
rowlist.append(data['BZNAME'])
rowlist.append(data['TJEBZH'])
rowlist.append(data['MKT'])
rowlist.append(data['REORGANIZECODE'])
datamatrix.append(rowlist)
workbook = xlwt.Workbook()
sheet = workbook.add_sheet("并购数据")
for i in range(len(datamatrix)):
for j in range(len(datamatrix[i])):
sheet.write(i, j, datamatrix[i][j])
workbook.save(r"并购数据.xlsx")
7、分享本案例代码【复制即可运行】
#自行导入对应第三方包,pip都能弄到。
import json
import re
import jsonpath
import xlwt
from urllib import request
import sys
class CatchBinGouData():
def tablelenth(self):
"""
:comment:获取实时爬取数据的页码的长度
:return:脚本运行时间下的东方财富并购重组页面下数据表的页数
"""
bingouhtml=request.urlopen(r'https://data.eastmoney.com/bgcz/').read()
bingouhtml=str(bingouhtml)
pattern=r'"pages":(\d{4,5})'
lenlist=re.findall(pattern,bingouhtml)
if len(lenlist)==1:
return int(lenlist[0])
else:
print('页码长度获取异常')
sys.exit(0)
def geturl(self):
"""
:comment 根据page_length,获取并购url链接,每从第1页开始到page_length页;
:return url链接列表
"""
page_length=self.tablelenth()
urlList=[]
for i in range (page_length):
json_url='https://datacenter-web.eastmoney.com/api/data/get?callback=jQuery112304809089840055041_1640451070306&st=SCGGRQ&sr=-1&ps=50&p=' +str(i+1)+'&sty=ALL&source=WEB&token=894050c76af8597a853f5b408b759f5d&type=RPTA_WEB_BGCZMX'
urlList.append(json_url)
return urlList
def get_data(self):
'''
:comment 根据url连接,获取并购数据,并将他们写入到execl中
【⚠️该方法主要通过json.loads,将str类型转化为dict,通过对dict的解析获取数据,缺点在于没办法直接解析到json中带[]部分的内容】
:return:
'''
urlList=self.geturl()
datamatrix = []
for i in range(len(urlList)):
result=request.urlopen(urlList[i]).read().decode("utf-8")
pattern=r'jQuery112304809089840055041_1640451070306\((.*)\)'
result=re.findall(pattern,result)
result=json.loads(result[0])
result=result["result"]["data"]
for data in result:
rowlist=[]
rowlist.append(data['MXID'])
rowlist.append(data['H_COMNAME'])
rowlist.append(data['G_GOMNAME'])
rowlist.append(data['S_COMNAME'])
rowlist.append(data['SCODE'])
rowlist.append(data['SNAME'])
rowlist.append(data['ZRBL'])
rowlist.append(data['OBJTYPE'])
rowlist.append(data['JYJE'])
rowlist.append(data['JD'])
rowlist.append(data['ZRFS'])
rowlist.append(data['SCGGRQ'])
rowlist.append(data['ANNOUNDATE'])
rowlist.append(data['BZNAME'])
rowlist.append(data['TJEBZH'])
rowlist.append(data['MKT'])
rowlist.append(data['REORGANIZECODE'])
datamatrix.append(rowlist)
workbook = xlwt.Workbook()
sheet = workbook.add_sheet("并购数据")
for i in range(len(datamatrix)):
for j in range(len(datamatrix[i])):
sheet.write(i, j, datamatrix[i][j])
workbook.save(r"并购数据.xlsx")
if __name__ == '__main__':
bgd=CatchBinGouData()
table=bgd.get_data()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)