如何使用 Python 抓取雪球网页

2024-05-12 07:13

1. 如何使用 Python 抓取雪球网页

雪球网已经改了很多规则,以前的很多代码估计都不能用了
雪球网的模拟登录,fuck-login/012 xueqiu.com at master · xchaoinfo/fuck-login · GitHub
在此基础上修改,可以达到题主的目的,而且可以做到更加简单。
处理 cookies ,不需要每次都登录一次的方法,可以参考 fuck-login/001 zhihu at master · xchaoinfo/fuck-login · GitHub 的处理方法。

如何使用 Python 抓取雪球网页

2. 如何使用 Python 抓取雪球网页

最简单可以用urllib,python2.x和python3.x的用法不同,以python2.x为例:
import urllib
html = urllib.open(url)
text = html.read()
复杂些可以用requests库,支持各种请求类型,支持cookies,header等
再复杂些的可以用selenium,支持抓取javascript产生的文本

3. 如何使用 Python 抓取雪球网页

最简单可以用urllib,python2.x和python3.x的用法不同,以python2.x为例:  import urllib html = urllib.open(url) text = html.read() 复杂些可以用requests库,支持各种请求类型,支持cookies,header等 再复杂些的可以用selenium,支持抓取javascript产生的文本

如何使用 Python 抓取雪球网页

4. 如何使用 Python 抓取雪球网页

Step.1 分析页面
要抓一个网页,首先自然是要“研究”这个网页。通常我会用两种方式:
一个是 Chrome 的 Developer Tools。通过它里面的 Network 功能可以看到页面发出的所有网络请求,而大多数数据请求都会在 XHR 标签下。点击某一个请求,可以看到其具体信息,以及服务器的返回结果。很多网站在对于某些数据会有专门的请求接口,返回一组 json 或者 XML 格式的数据,供前台处理后显示。
 
 
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 数据分析
数据有了,你要怎么用它,这是个很大的问题。可以简单的统计现象,也可以想办法深入分析背后隐藏的逻辑。不多说,我也还只是在摸索之中。

5. 如何使用 Python 抓取雪球网页

需要两个模块配合:

爬虫模块:单纯负责抓取和存储数据
数据处理模块:处理爬虫存储的数据。如发现某个人某个持仓数据发生了变化,向你发出通知

该爬虫的简单的流程:

定时访问目标页面
抓取当前目标页面的数据,存入数据库
数据处理模块简单的流程:

定时访问数据库
数据库中的数据满足某个条件时执行自己设定的动作

如何使用 Python 抓取雪球网页

6. 如何使用 Python 抓取雪球网页

代码


import urllib.request
import json
import http.cookiejar

#设置cookie
CookieJar = http.cookiejar.CookieJar()
CookieProcessor = urllib.request.HTTPCookieProcessor(CookieJar)
opener = urllib.request.build_opener(CookieProcessor)
urllib.request.install_opener(opener)

#登陆获得cookie
params = urllib.parse.urlencode({'username':'*****','password':'*****'}).encode(encoding='UTF8')
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0'}
request = urllib.request.Request('http://xueqiu.com/user/login',headers=headers)
httpf = opener.open(request, params)

#获得组合
url = 'http://xueqiu.com/cubes/rebalancing/history.json?cube_symbol=ZH340739&count=20&page=1'
req = urllib.request.Request(url,headers=headers)
html = urllib.request.urlopen(req).read().decode('utf-8')
data = json.loads(html)
stockdata = data['list'][0]['rebalancing_histories']
for i in range(len(stockdata)):
    print('股票名称',end=':')
    print(stockdata[i]['stock_name'],end='   持仓变化')
    print(stockdata[i]['prev_weight'],end='-->')
    print(stockdata[i]['target_weight'])

7. 我想做雪球软件上的评论数据挖掘,应该怎么做啊?训练集是什么意思

首先你得能抓取雪球上的评论数据,或者从雪球购买
训练集是机器学习用的,就是有个样本,比如:这只股票太好了  ,这句话评价是好
再有类似的话出现,那么评价也是好

我想做雪球软件上的评论数据挖掘,应该怎么做啊?训练集是什么意思