我的Gitee
要求:用requests和自选提取信息方法定向爬取股票相关信息,并存储在数据库中。候选网站:东方财富网:https://www.eastmoney.com/
新浪股票:http://finance.sina.com.cn/stock/
技巧:在谷歌浏览器中进入F12调试模式进行抓包,查找股票列表加载使用的url,并分析api
返回的值,并根据所要求的参数可适当更改api的请求参数。根据URL可观察请求的参数f1、
f2可获取不同的数值,根据情况可删减请求的参数。
参考链接:[https://gitee.com/chen-benyuan/CHEN/blob/master/实验二/实验二作业三.py)
输出信息:
序号 |
股票代码 |
股票名称 |
最新报价 |
涨跌幅 |
涨跌额 |
成交量 |
成交额 |
振幅 |
最高 |
最低 |
今开 |
昨收 |
---|
1 |
688093 |
N世华 |
28.47 |
62.22% |
10.92 |
26.13万 |
7.6亿 |
22.34 |
32.0 |
28.08 |
30.2 |
17.55 |
2...... |
|
|
|
|
|
|
|
|
|
|
|
|
(2)爬取股票相关信息
实验过程:
1.在谷歌浏览器中进入F12调试模式进行抓包,查找股票列表加载使用的url
url = "http://59.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124004035526877987472_1634114986169\
&pn="+str(page)+"&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&_=1634114986170"
2.导入JsonSearch,先通过正则表达式拆枝,将不是json格式的部分去除,在利用
jsOndata= JsonSearch(object=json2, mode='j'),调用jsOndata=search_all_value方法
pat = "jQuery1124004035526877987472_1634114986169 \((.*?)\)"
str1 = re.compile(pat,re.S).findall(str)[0]
json2 = json.loads(str1)
jsOndata= JsonSearch(object=json2, mode='j')
Symbollist = jsondata.search_all_value(key='f12')
namelist = jsondata.search_all_value(key='f14')
# 这里展示一部分
3.利用数据库插入功能进行数据插入
self.db.insert( index,Symbollist[i], namelist[i], LastTradelist[i], Chglist[i], Changelist[i], Volume, Turnover, slist[i], helist[i], lelist[i], Openlist[i], PrevCloselist[i])
至于创建数据库的过程与题目一类似,这里不做展示,见源代码
运行结果
心得体会
本次作业与之前几次显然不同,刚刚开始感觉一头雾水,东方财富网页面包含的所有股票信息被分成了多个板块,导致我们无法直接通过网页的url爬取所有数据,因此本题采用动态抓包,使用f12进行抓包抓取js,分析得到数据对应的url就能实现爬取操作。紧接着可以通过严格的json格式,进行jsonSearch,或者正则表达式筛选信息都可以。
作业③:
我的Gitee
- 要求:爬取中国大学2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)所
有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加入至博客中。
技巧:分析该网站的发包情况,分析获取数据的api
输出信息:
(3)爬取大学相关信息
实验过程:
1.一页20个大学,可以考虑翻页,但也可以选择用抓包的方法,获取js
url = "https://www.shanghairanking.cn/_nuxt/static/1632381606/rankings/bcur/2021/payload.js"
2.对抓包得到的数据进行正则匹配:
score = r'score:(.*?),'
scorelist = re.findall(score,data)
# print(scorelist)
name = r'univNameCn:"(.*?)"'
namelist = re.findall(name,data)
部分学校总分数据有异常采用如下方法处理
for i in range(len(namelist)):
try:
if 'a'<=scorelist[i]<='z' or 'A'<=scorelist[i]<='Z':
ulist.append([i+1,namelist[i], "--"])
else:
ulist.append([i + 1, namelist[i], scorelist[i]])
原本以为是混入了乱码直接用--代替,后来发现与整个js文件首尾的键值对有关所以又做了以下处理:
key = re.findall(r'function\((.*?)\)', data) # 获取键
str = ''.join(key)
key2 = str.split(',')
# print(key2)
value = re.findall(r'"",(.*?)\)', data)
str2 = ''.join(value)
# print(str2)
str3 = str2.replace('"',"")
# print(str3)
value2 = str3.split(',')
# print(value2) # 获取值
获取了键值对后与srocelist和ranklist进行比较(这里特别处理了"h:一流学科"的错误)
for i in range(len(scorelist)):
for j in range(len(key2)):
if scorelist[i]==key2[j]:
scorelist[i]=value2[j]
elif ranklist[i]==key2[j]:
ranklist[i]=value2[j]
ranklist[210] = "211"
3.插入数据库(一样的操作)
运行结果
更改后的结果
可以与上面的结果进行对比,完美解决。(这里的图样式和上面的不太一样,原因是pycharm出了点毛病,被我重装了)
心得体会
第三题所用的技术与第二题类似,本次实验对于抓包有了全面的认识,第二题用search_all_value分析js,第三题则采用另一种正则表达式分析。
gif: