1 背景知识介绍
1、什么叫自动化采集脚本:自动去采集网站上我们需要的数据。
2、批量采集数据:谷歌浏览器—百度—东方财富网。
①安装(pip install)和导入模块(import);
②本次操作需要的模块requests、pandas、re;re不用安装,是python自带的。
③模块说明:requests—用来请求网站的数据;pandas—用来操作表格;re—用来筛选数据的。
3、爬虫:请求某一个网站的数据。
①确定目标:请求哪一个网址;
②以什么样的身份去请求?
③请求
2 怎么找网址:以东方财富网为例
2.1、在谷歌浏览器中搜索百度,进入百度页面
2.2 在百度中搜索东方财富网。
2.3 因为不可能爬首页,要的是数据,所以本文以沪深京为例
2.4 可以看出:有5000多家上市公司的股票数据都在这里。
2.5 注意:网址
https://quote.eastmoney.com/center/gridlist.html#hs_a_board并不是纯数据的网址,还会有数据之外的文字(如行情中心等)。
2.6 如何获取纯数据的网址
按下F12或Fn+F12(哪个会出来就按哪个),打开开发者工具(有些可能是中文,我的电脑显示为英文),选择顶上的network,刷新网页。可见,这里面有73条数据。
2.7 确定73条数据那一条是需要的股票数据
利用搜索功能。比如博士眼镜的股票信息,就搜索其关键字,如300662、博士眼镜,搜索这些关键字就可以确定哪一个是需要的。
2.8 得到股票数据的网址
https://23.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124020177006179756685_1723650631843&pn=1&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&dect=1&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1723650631844
代码:
#step1:确定目标网址url='https://23.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124020177006179756685_1723650631843&pn=1&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&dect=1&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1723650631844' #引号里面是网址
3 以什么样的身份去请求?伪装成一个浏览器
3.1 获取浏览器标识
#step2:获取浏览器标识wz={'user-agent':'浏览器标识'}
3.2 怎么找浏览器标识,在上一步找网址的最下面
3.3 获取浏览器标识最终代码。
#step2:获取浏览器标识wz={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'}
4 请求数据
4.1 需要用到工具requests.
#step3:请求数据,requests模块的获取功能get,给定网址和身份,就可以返回给我们需要的数据。res=requests.get(url,wz) #网址和身份
4.2 运行结果
4.3 网页中的数据是可以在运行结果中找到的
可见,python得到的数据里面有我们需要的数据,也有我们不需要的数据。
5 筛选需要的数据(re,用来筛选数据的模块)
①先举一个理解怎么筛选的例子,有一个文本:
text=‘小明喜欢喝茶,喜欢唱歌,喜欢爬山,喜欢打篮球,她有很多很多爱好’。现在需要知道小明喜欢什么。
import retext='小明喜欢喝茶,喜欢唱歌,喜欢爬山,喜欢打篮球,她有很多很多爱好'#提取小明喜欢的#将喜欢 和 逗号 中间的东西提取出来#.*? 表示有几个算几个name=re.findall('喜欢(.*?),',text)print(name)
6 提取股票代码等,观察每一个股票代码前面和后面。
#step4:利用re模块筛选需要的数据#提起股票代码import recodelist=re.findall('"f12":"(.*?)","f13"' ,res.text)print(codelist)
#提取股票名称namelist=re.findall('"f14":"(.*?)","f15"',res.text)print(namelist)
#提取最新价格new_price=re.findall('"f2":(.*?),"f3"',res.text)print(new_price)
以此类推,可以提取每一个属性下的数据。
7 组合数据
7.1 散乱数据说明
上一步拿到的数据是这样,但是并没有对应起来,想按照名称-代码-最新价组合起来。
7.2 列表相关的知识点
name=['张三','李四','王五']
1、列表中有多少个元素
len(name) #3个
2、索引:张三是0,李四是1,王五是2。如果要找张三:data[0]
3、range函数,打印某个东西5次。0、1、2、3、4左闭右开。
7.3 组合数据
codelist有20个数据;
namelist有20个数据;
new_price有20个数据;(纯手动数的,代码就用len实现)
#step5:组合数据for i in range(0,len(codelist)): #print(codelist[i],namelist[i],new_price[i]) 代码不是很好,单独打印 newlist=[codelist[i],namelist[i],new_price[i]] #将它们组合为一个新的列表 print(newlist)
但是我们可以发现,截至目前为止,只拿到了第一页的20条数据。但是我们可以推测,每一页数据的网址肯定有一定的相似性。
回到网址里观察:pn=1,即pagenumber=1
现在想要pn从1到282:利用for page in range(1:283):
改url的格式:
8 完整版代码(笔记版)
后面pycharm没出结果,改用jupyter可以出结果。
import requests # 请求模块import re #筛选模块import pandas #表格模块#--------------------------------------------------------------#创建一个空列表,储存最终版数据totaldata = []for pn in range(1,283):#step1:确定目标网址 url=f'https://23.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124020177006179756685_1723650631843&pn={pn}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&dect=1&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1723650631844' #引号里面是网址#step2:以什么样的身份去请求:浏览器标识 wz={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'}#step3:请求数据,requests模块的获取功能get,给定网址和身份,就可以返回给我们需要的数据。 res=requests.get(url,wz) #网址和身份 #print(res.text) #res不是一个东西,而是由多个属性组成的 #res.text 以文本的形式存储 #res.content 以二进制的形式存储#step4:利用re模块筛选需要的数据 #提起股票代码 codelist=re.findall('"f12":"(.*?)","f13"',res.text) #print(codelist) #提取股票名称 namelist=re.findall('"f14":"(.*?)","f15"',res.text) #print(namelist) #提取最新价格 new_price=re.findall('"f2":(.*?),"f3"',res.text) #print(new_price)#step5:组合数据 for i in range(0,len(codelist)):#左闭右开 newlist=[codelist[i],namelist[i],new_price[i]] #将它们组合为一个新的列表 #print(newlist) totaldata.append(newlist) #把每一次运行的20条数据汇总到totaldata中#step6:写入表格 data = pandas.DataFrame(totaldata) data.to_excel('A股实时数据.xlsx')
9 完整版代码(精简版)
import requests # 请求模块import re #筛选模块import pandas #表格模块#创建一个空列表,储存最终版数据totaldata = []for pn in range(1,283): #获取文本数据 url=f'https://23.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124020177006179756685_1723650631843&pn={pn}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&dect=1&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&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&_=1723650631844' #引号里面是网址 wz={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'} res=requests.get(url,wz) #网址和身份 #从文本里提取需要的数据 codelist=re.findall('"f12":"(.*?)","f13"',res.text) namelist=re.findall('"f14":"(.*?)","f15"',res.text) new_price=re.findall('"f2":(.*?),"f3"',res.text) #组合需要的数据 for i in range(0,len(codelist)):#左闭右开 newlist=[codelist[i],namelist[i],new_price[i]] #将它们组合为一个新的列表 #将每一页的数据汇总到一起 totaldata.append(newlist) #把每一次运行的20条数据汇总到totaldata中 #写入表格 data = pandas.DataFrame(totaldata) data.to_excel('A股实时数据.xlsx')