数据收集—自动化采集脚本(爬虫)

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 re
text='小明喜欢喝茶,喜欢唱歌,喜欢爬山,喜欢打篮球,她有很多很多爱好'
#提取小明喜欢的
#将喜欢 和 逗号 中间的东西提取出来
#.*? 表示有几个算几个
name=re.findall('喜欢(.*?),',text)
print(name)

在这里插入图片描述

6 提取股票代码等,观察每一个股票代码前面和后面。

在这里插入图片描述

#step4:利用re模块筛选需要的数据
#提起股票代码
import 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)

在这里插入图片描述
以此类推,可以提取每一个属性下的数据。
在这里插入图片描述

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')
  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值