问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用python 抓取雪球网页

发布网友 发布时间:2022-05-10 10:22

我来回答

2个回答

热心网友 时间:2022-05-10 11:51

现在关注一个组合,就会有持仓变动的提示了。不过我觉得这事情挺有意思的。比如可以把很多持仓的数据都抓下来,做一些综合的分析,看看现在网站上被持有最多的股票是哪一支,某一天被调入最多的又是哪一支之类。
于是我决定来抓抓看,顺便借此说说我通常用程序做自动抓取的过程。
Step.1 分析页面
要抓一个网页,首先自然是要“研究”这个网页。通常我会用两种方式:
一个是 Chrome 的 Developer Tools。通过它里面的 Network 功能可以看到页面发出的所有网络请求,而大多数数据请求都会在 XHR 标签下。点击某一个请求,可以看到其具体信息,以及服务器的返回结果。很多网站在对于某些数据会有专门的请求接口,返回一组 json 或者 XML 格式的数据,供前台处理后显示。

另一个就是直接查看网页源代码。通常浏览器的右键菜单里都有这个功能。从页面的 HTML 源码里直接寻找你要的数据,分析它格式,为抓取做准备。
对于雪球上的一个组合页面 粗略地看了一下它发出的请求,并没有如预想那样直接找到某个数据接口。看源代码,发现有这样一段:
SNB.cubeInfo = {"id":10289,"name":"誓把老刀挑下位","symbol":"ZH010389" ...此处略过三千字... "created_date":"2014.11.25"}
SNB.cubePieData = [{"name":"汽车","weight":100,"color":"#537299"}];

cubeInfo 是一个 json 格式的数据,看上去就是我们需要的内容。一般我会找个格式化 json 的网站把数据复制进去方便查看。

这应该就是组合的持仓数据。那么接下来,一切似乎都简单了。只要直接发送网页请求,然后把其中 cubeInfo 这段文字取出,按 json 读出数据,就完成了抓取。甚至不用动用什么 BeautifulSoup、正则表达式。
Step.2 获取页面
分析完毕,开抓。
直接 urllib.urlopen 向目标网页发送请求,读出网页。结果,失败了……
看了下返回结果:
403 Forbidden
You don't have permission to access the URL on this server. Sorry for the inconvenience.

被拒了,所以这种赤裸裸地请求是不行的。没关系,那就稍微包装一下:
send_headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Connection':'keep-alive',
'Host':'xueqiu.com',
'Cookie':r'xxxxxx',
}
req = urllib2.Request(url, headers=send_headers)
resp = urllib2.urlopen(req)
html = resp.read()

header 数据都可以从 Developer Tools 里拿到。这次顺利抓到页面内容。
一般网站或多或少都会对请求来源做一些阻拦,通过加 header 可以搞定大部分情况。
Step.3 提取数据
因为这个数据比较明显,直接用通过一些字符串查找和截取操作就可以取出来。
pos_start = html.find('SNB.cubeInfo = ') + len('SNB.cubeInfo = ')
pos_end = html.find('SNB.cubePieData')
data = html[pos_start:pos_end]
dic = json.loads(data)

dic 就是一个包含数据的字典对象。之后想干什么就随便你了。
对于复杂一点的情况,可以通过 BeautifulSoup 来定位 html 标签。再不好办的,就用正则表达式,基本都可以解决掉。
Step.4 处理数据
因为我想对数据进行持久化存储,并且做展示和分析,所以我用了 django 里的 ORM 来处理抓下来的数据。
# add Portfolio
portfolio, c = models.Portfolio.objects.get_or_create(code=dic['symbol'])
portfolio.name = dic['name']
portfolio.earnings = dic['total_gain']
portfolio.save()
# add Stock
stocks = dic['view_rebalancing']['holdings']
for s in stocks:
stock, c = models.Stock.objects.get_or_create(code=s['stock_symbol'])
stock.name = s['stock_name']
stock.count += 1
stock.weight += s['weight']
stock.save()

Portfolio 记录下组合及其收益,Stock则记录每支股票的被收录数和总收录份额。
对于抓取到的,一般也可以存在文件中,或者直接通过 SQL 存入数据库,视不同情况和个人喜好而定。
Step.5 批量抓取
前面的一套做下来,就完整地抓取了一组数据。要达到目的,还要设计一下批量抓取的程序。
一个要解决的问题就是如何获得组合列表。这个可以再通过另一个抓取程序来实现。然后根据这些列表来循环抓取就可以了。
若要细究,还要考虑列表如何保存和使用,如何处理抓取失败和重复抓取,如何控制抓取频率防止被封,可否并行抓取等等。
Step.6 数据分析
数据有了,你要怎么用它,这是个很大的问题。可以简单的统计现象,也可以想办法深入分析背后隐藏的逻辑。不多说,我也还只是在摸索之中。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 家里面楼梯是水泥的不想铺地毯或者地砖还能铺什么 楼梯的水泥台阶上可以铺地板革吗 手机腾讯会议共享屏幕播放视频没声 腾讯会议共享屏幕没声音怎么办 三穷水尽疑无路,柳暗花明又一春的意思 三潭印月与三潭映月有什么区别? ...人面不知何处去,桃花依旧笑春风.请问这首诗是什么意思. 行至盛夏,花木扶疏,安好。 什么意思? 田畴载绿、花木扶疏是什么意思? 花木扶疏是不是成语? 花木扶疏什么意思 用和密码能在电脑上登陆微信吗? 请求制作个小程序,打开后是打开微信网页版“https://login.weixin.qq.com/”登陆页面,可关闭和最小化 support.weixin.qq我要找回账号 企业公众是从微信公众平台登陆吗?具体的登录网址是 https://qy.weixin.qq.com/ 吗? 企业怎么注销 ps“任何像素都不打于50%选区将不可见”比如一个20px*20px的选区那么它的羽化值设置多大才 PS里的羽化选区最大数值与最小数值是多少 用什么方法可以知道磁铁的两极 怎样判断磁铁的南北极用什么方法 用什么方法制造小磁铁? 辨别磁铁南北极的方法有哪些?具体怎么操作? 苹果双系统win7系统键盘失灵怎么回事 苹果一体机装的双系统,win7系统里的鼠标键盘驱动坏了,没法用了怎么_百 ... 这两个遥控器怎么办 susv是什么牌子电脑 柳岩低调庆祝41岁生日,蛋糕仅3百出头,都有哪些圈内好友送去了祝福? susv笔记本有显卡吗 我想重装电脑系统怎个装?(我的电脑不得放光盘的功能只有两个USB接口电脑牌子是SUSV而且是笔记本 42岁生日蛋糕插多腊烛 susv笔记本电脑卡机怎么办,开机到一半卡住了,鼠标可以动 SUSV笔记本电脑密码怎么设置 susv笔记本开不了机 爸爸过40岁生日买几层蛋糕好? Panasonic是什么牌子笔记本 40岁生日蛋糕 上面搞什么动物好一点? 四十多岁的爸爸生日蛋糕应该放几根蜡烛? 笔记本什么牌子的 cvvso笔记本怎么样,是个什么牌子啊? 笔记本什么牌子好,笔记本十大品牌排行榜 痛经可以吃猕猴桃吗?有什么好处坏处?请简单说明 谢谢 来姨妈吃猕猴桃的后果 win 10怎么把软件放到桌面 求美少女战士同人《木星的无奈》《水星的堕落》等漫画。要全集 要中文版本的