事前准备
面对复杂严峻的国际环境和国内疫情带来的冲击,我国经济依然实现了正增长。其中,中小微企业既为广大人民群众直接提供了大量物质产品和服务,又成为吸纳和调节就业的“蓄水池”,对我国经济发展、民生改善、社会稳定作出突出贡献。现实生活中,伴随着我国信贷业务的不断发展,信用债违约风险等事件也有所增多。为较大程度规避信贷违约风险,通常需要对企业信用评级,从而保障银行的资金安全。
因此,本次作业我选择爬取了深圳证券交易所中信息披露栏中监管信息公开的信息披露考评的信息数据。首先打开浏览器的开发者工具对数据表进行元素定位,通过一层一层的展开,得到如下信息:
定位到所需信息以后,右键获取当前位置的 xpath://*[@id=”1760_zsn_nav1″]/div[1]/div[1]/ div/table/tbody,使用 python 的 requests 进行常规爬取方式进行爬取。
代码如下:
import requests from lxml import etree url = 'http://www.szse.cn/disclosure/supervision/check/index.html' headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;'} res = requests.get(url=url, headers=headers) res.encoding = 'utf-8' html = res.text if len(html) > 100: print('解析成功') else: print('解析失败', len(html)) tree = etree.HTML(html) divs = tree.xpath('/html/body/div[5]/div/div[2]/div/div/div[4]/div/div/div[2]/div[1]/div[1]/div[1]/div/table/tbody/tr[1]') print(divs)
运行后结果为空串,即没有得到任何信息。直接输出 requests 获取的 html 信息也发现所需的数据并没有被获取。
通过漫长的查阅资料后,发现这种现象是由于网站设置了通过 Ajax 请求动态加载 json 文件来实现快速访问的目的造成的,因此爬取这些信息就需要获得动态获取 json 的方法。
得到这个有效的信息后,开始针对性的查阅资料,首先需要准备好访问头部信息,以确保可以被识别为浏览器,以人的身份去爬取信息。打开浏览器的开发者工具,进行访问获得访问信息,查看访问信息的头部信息如下图。
随后就需要确认网站是如何发出 Ajax 请求的,仍然是打开开发者工具,选择 Network。刷新网页,然后点击下一页,连续几次发现每次点击后都会形成一个以 data 开头的交互数据。查看详细信息以后发现这就是我们需要的数据。
点按查看详细信息得到几次访问的 url 资源:
通过对比各个字段发现差异仅在于 PAGENO 字段和 random 字段,每次点击下一页 PAGENO 字段就会加一,因此推断其为页码。而 random 则是一个随机数,得到这些有效信息以后就可以正式进行爬取信息了。
代码展示
from random import randint import requests import pandas as pd import json import time savedatapath = r'D:\University\大三\数据挖掘\第四次作业\深交所数据.csv' url1 = r'http://www.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=1760_zsn&TABKEY=tab2&PAGENO=' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', 'Referer': 'http://www.szse.cn/disclosure/supervision/check/index.html' } # 爬十页以示尊重 for i in range(1, 10): print("正在爬取第" + str(i) + "页数据") # 生成随机请求码 url2 = str(i) + r'&random=0.' + str(randint(1, 99999)) + str(randint(1, 99999)) + str(randint(1, 999999)) response = requests.get(url1 + url2, headers=headers) content = response.text # 处理 json 文件 content = json.loads(content) # 写数据 data = content[0]["data"] a = pd.DataFrame(data) a.to_csv(savedatapath, mode='a', encoding='gbk', header=False) # 等待 10s 防止被禁 time.sleep(10)