爬虫技巧 | 通过解析动态网页真实地址爬取网页表格
本文作者:李文星 张欢 张建波,暨南大学
本文编辑:尚晨曦
技术总编:王子一
Stata&Python云端课程来啦!
为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》、《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!
之前我们推送过许多通过selenium模拟浏览器抓取来获取动态网页内容的推文。今天我们以东方财富网站沪深A股行情数据(http://quote.eastmoney.com/center/gridlist.html#hs_a_board)为例,向大家展示另外一种方法:通过浏览器审查元素解析真实网页地址并爬取网页表格内容。
首先登陆界面,并开始分析:
点击行情页面“下一页”,表格数据发生了变化,但网页地址并没有变化。而且,查看网页源代码,我们也看不到网页上的行情数据。显然,表格内容都是动态加载的。
我们的目标是步爬取沪深A股所有股票当天的行情数据,每页有20只股票的行情,合计共228页的表格数据要爬取。
首先,打开行情页面后,在键盘上点击“F12”,或者在浏览器的“工具”菜单中点击“开发者工具”。其次,在“开发者工具”界面点击“Network”,在出现的界面中选择“JS”按钮,并刷新页面。这时,在下面的“name”栏下出现很多链接。我们发现,以“get?cb=jQuery”为开头的链接所对应的“headers”中显示了网页地址的真实地址,内容过长,这里我们将不进行展示。
我们通过查看与“Headers”并列的“Response”栏,可以找到行情页面的所有行情数据。或者将该链接复制到地址栏并回车,可以看到如下图所示数据。对比发现这些数据就是行情页面的个股行情数据。
1#导入相应的库:
2import requests
3import re
4import pandas as pd
5
6#先为拟爬取的内容建立空列表:
7allCodeList = [] #股票代码
8allNameList = [] #股票名称
9allnewList = [] #最新价
10allpchgList = [] #涨跌幅
11allchgList = [] #涨跌额
12allvotList = [] #成交量
13allvatList = [] #成交额
14allhighList = [] #最高价
15alllowList = [] #最低价
16
17#爬取第一页的内容:
18url =
19"http://54.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112400796989391213252_1625581572372&pn=1&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23&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&_=1625581572373"
20 headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'} #浏览器的身份验证信息,防止反爬虫。在“开发者工具”中的“headers”栏目下可以找到。
21 response = requests.get(url,headers=headers) #对网页发起请求。这里没有设置参数params也没有影响爬取内容。
22 web_page = response.text # text属性表示从上一步的结果中提取网页源代码字符串
23
24#定义正则规则
25 codeRe = re.compile(r'"f12":"(.*?)"') # 用于查找股票代码的正则表达式
26 nameRe = re.compile(r'"f14":"(.*?)"') # 用于查找股票简称的正则表达式
27 pnewRe = re.compile(r'"f2":(\d+\.+\d+|"-")') # 用于查找股票最新价的正则表达式
28 pchgRe = re.compile(r'"f3":(-?\d+\.\d+|"-")') # 用于查找股票涨跌幅的正则表达式
29 chgRe = re.compile(r'"f4":(-?\d+\.\d+|"-")') # 用于查找股票涨跌额的正则表达式
30 votRe = re.compile(r'"f5":(\d+|"-")') # 用于查找股票成交量(手)的正则表达式
31 vatRe = re.compile(r'"f6":(\d+\.+\d+|"-")') #用于查找股票 成交额的正则表达式
32 highRe = re.compile(r'"f15":(\d+\.+\d+|"-")') # 用于查找股票最高价的正则表达式
33 lowRe = re.compile(r'"f16":(\d+\.+\d+|"-")') # 用于查找股票最低价的正则表达式
34
35#根据正则规则查找内容
36 codeList = codeRe.findall(str(web_page))
37 nameList = nameRe.findall(str(web_page))
38 pnewList = pnewRe.findall(str(web_page))
39 pchgList = pchgRe.findall(str(web_page))
40 chgList = chgRe.findall(str(web_page))
41 votList = votRe.findall(str(web_page))
42 vatList = vatRe.findall(str(web_page))
43 highList = highRe.findall(str(web_page))
44 lowList = lowRe.findall(str(web_page))
45
46#将找到的符合正则规则的内容依次写入前面已经建好的空列表中
47 allCodeList += codeList
48 allNameList += nameList
49 allnewList += pnewList
50 allpchgList += pchgList
51 allchgList += chgList
52 allvotList += votList
53 allvatList += vatList
54 allhighList += highList
55 alllowList += lowList
56
57#将爬取的数据转换成数据框
58stockData = pd.DataFrame({'股票代码':allCodeList, '股票简称':allNameList,
59 '最新价':allnewList,'涨跌幅':allpchgList,
60 '涨跌额':allchgList,'成交量':allvotList,
61 '成交额':allvatList,'最高价':allhighList,
62 '最低价':alllowList})
63
64#将数据保存到电脑,默认保留在当前工作目录。
65stockData.to_csv('pricehistory.csv', encoding='utf_8_sig',index=False)
66# encoding='utf_8_sig':确保正确显示中文,否则会出现乱码。
67# index=False:因为有股票代码,不必另外再建立一个索引。
翻页爬取的关键是找到真实地址的“翻页”规律。初看东方财富行情网页地址,发现地址每次都不同,似乎是完全无序的。但仔细查看繁杂的真实地址,发现其中的参数“pn=1”表示第一页,将其中的1变称2,真实地址对应网页的第二页内容,依次类推,可以访问所有页面的真实地址。
地址:
http://54.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112400796989391213252_1625581572372&pn=1&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23&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&_=1625581572373
接着我们嵌套一个循环,让其自动爬取:
1for i in range(1,229): #总共228页,所以range()中的结束值设置为229。
2url =
3http://54.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112400796989391213252_1625581572372&pn=”+str(i)+”&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23&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&_=1625581572373”
请转发并联系后台小编哦。
欢迎大家点赞、评论、转发呦~
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
如何处理缺失值?这一篇搞定!
善用dataex命令,高效沟通你我他
大数据下的大学分数线排行榜,快来围观!
《觉醒年代》—带你回到百年前
用Stata画的三维图很奇怪怎么办?
如何随机生成满足特定数据特征的新变量?
爬取无法翻页网页——自然科学基金项目及可视化
爬取京东评论数据进行情感分类
Stata与音乐之间的酷炫连接
这些年,爬虫俱乐部走出的博士们!看这里,近五年各校高被引论文上榜名单!
高校经管类核心期刊发文排行榜
疯狂的科研创新加速器——Stata!
可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!
好玩有趣的手绘图形库——cutecharts
爬虫实战|摩尔庄园微博话题讨论
一季度财报出炉,哪些公司最烧钱?
一季度财报出炉,哪些公司最赚钱?
技能篇 | 图片合并大法
批量空气质量数据文件合并分析
Stata17之日期时间新功能
Stata17之Lasso新功能
爱奇艺视频弹幕爬取之《小舍得》数据可视化利器——Matplotlib从第七次人口普查看中国人口变化|Stata与Python交互绘图
200万投资者关注!!哪家公司这么牛?
带你领略一天天气之变化
利用pyecharts看微博粉丝地区分布
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。