如何爬取新三板数据(一)
新三板数据是实证分析中较常用到的一个数据库,其包含了一万多家挂牌中小企业,涵盖了制造业,交通运输,现代信息服务,文化服务,商业服务等除第一产业外的几乎全部国民行业。新三板挂牌公司地域分布广泛,公司经营状况良好,其大部分属于高新技术企业,公司重视技术研发,往往在细分行业领域具有较强的核心竞争力。将新三板挂牌公司的财务状况和宏观经济运行相结合能够研究多方面问题。如宏观税负、研发投资等。
目前获取新三板数据的途径也较多,如国泰安数据库、wind数据库、锐思数据等都包含或部分包含了新三新数据。但这些数据库也存在着一定的不足,如数据披露不够及时等
使用爬虫爬取新三板数据信息能够克服数据披露不及时的缺点,可以帮助您及时地获取最新的挂牌公司数据。
以下以东方财富网披露的新三板数据为例编写一个简单的爬虫。
1.分析页面请求url
首先,打开东方财富网http://xinsanban.eastmoney.com/DataCenter/CompanyListing/ListingDetails
挂牌公司明细列表,查看源代码,我们发现,代码,公司名称以及挂牌日期等的信息并不存在于网页源码中,在页面下方点击下一页后浏览器的地址信息并没有发生任何改变,由此判断,该页面为动页面。使用firefox浏览器打开该页面,在空白处单击右键,选择查看元素,调出审查元素面板,切换到网络选项卡,按下F5键刷新该页面线,目的是让页面重新进行网页资源请求,这时,该页面所有网络请求就会列到网络选项卡下,在其中找到 json 类型的网络请求,点击后发现在右侧显示该消息头的详细信息,http://xinsanban.eastmoney.com/api/DataCenter/GSGP/GetGPGSMX?level=1&page=1&pagesize=20&sortType=LISTINGDATE&sortRule=-1,点击下一页后,重新记录相应的消息头发现,消息头中只有page参数发生了改变,由此判断,page参数即为真实的请求页面信息。由此,在后续的网络请求中,只需变换page参数即可实现不同的页面请求。
2.导入库
首先导入需要的库。在这里,我们需要用到requests网络请求库,json网页解析库,time时间管理库以及random数学随机数库 。库是包含许多具有相关功能模块的集合。
import requests,json,time,random
3.定义生成网络请求地址函数
将第一步获取到的消息头分成三部分url_base和page参数及url_last部分。其中url_base和url_last固定不变,通过变换page参数的值可以获得新的网络请求地址。查看尾页的json请求信息发现,尾页的消息头中page参数的值为706,因此我们在函数内部写一个while循环来生成新的url地址,并将生成的网络请求地址以元组的形式传递个下一个函数进行处理。
def get_newurl():
url_base = "http://xinsanban.eastmoney.com/api/DataCenter/GSGP/GetGPGSMX?level=1&"
url_last = "&pagesize=20&sortType=LISTINGDATE&sortRule=-1"
i = 1
while i<=706 :
page = "page=%s" %str(i)
url_new = url_base+page+url_last
#print(url_new)
yield url_new
i=i+1
4.定义网络请求头部信息
为了模拟真实的浏览器浏览页面信息,防止由于频繁请求所导致的服务器拒绝连接问题,因此在网络请求中需要附带消息头,告诉服务器这是真实的浏览器浏览行为。另外,由于网络请求非常迅速,通常每秒钟能够达到几十到几百次甚至上万次,但人的浏览行为并不会如此迅速,为了使得爬虫的网络请求和人的浏览行为更为相似,需要在一次请求后暂停一段时间后再发起网络请求。使用time库中的sleep()函数模拟休眠时间及random中的uniform()函数生成一个随机数作为sleep()函数的参数。
headers = {