解决方案:百度统计工具是什么?百度统计工具有什么用呢?
优采云 发布时间: 2022-11-26 23:11解决方案:百度统计工具是什么?百度统计工具有什么用呢?
百度统计工具其实是个很有用的东西,只是优化人员不太重视!不知道为什么,如果用好百度统计工具和百度站长工具,在做优化的时候,其实会事半功倍!于是,最近在很多优化师的帮助下开始问我百度统计工具有什么用?只需与大多数优化器交谈即可!
1、什么是百度统计工具?
百度统计工具是每天访问者通过百度搜索引擎点击关键词访问您网站的数据!里面有最近30天每天访问的页面,还有入口页面,关键词每天用来进入你网站的,还有新老访客记录,还有独立ip,pv 、uv、跳出率、平均访问时间等。
" />
二、百度统计工具中的这些有什么用?
1、从百度统计来看跳出率,如果跳出率高,那一定是网站内容的专业性和营销性没有到位!所以如果我们能从百度统计中看到跳出率的问题,我们就可以从这方面来改善我们网站的问题!这样一来,网站的跳出率就低,我们网站的交易量也会随之增加!
2、从百度统计看独立ip,如果独立ip每天都能增加,说明每天访问网站的人数在增加,再从一周开始比较。如果ip增加了,说明你的网站整体ip在增加!然后要看ip源所在的区域,结合判断!时间长了,肯定会有一批粉丝!
3、从百度统计中的访问页入口来看,看浏览者对什么样的文章和产品感兴趣!关键词有兴趣可以画什么样的产品!那么我们就可以对这个相关性关键词进行精准优化了!这样不仅可以增加我们网站的访问量,还可以提高我们网站的关键词准确排名!那么交易量肯定会大大增加!
" />
4、看百度统计的日均访问时长,如果和前一周或前一个月比较,如果有下降,说明我们文章发布的产品文章质量不好!你应该努力提高自己网站产品的文章质量和营销!
5、从百度统计的访问地区统计一下,看看你网站的产品客户是否主要集中在中国那些地区!那么总结一下,就可以从这几个方面进行推广和营销了!
总结:什么是百度统计工具?有什么用?以上已经介绍过了!熟练掌握和分析使用百度统计工具!那么您的网站优化和网站转化率就会有很大的提高!
解决方案:PyQt5制作一个爬虫小工具,爬取雪球网上市公司的财务数据
最近需要朋友帮忙写一个爬虫脚本,爬取雪球网上一些上市公司的财务数据。小伙伴希望能够按照自己的选择自由的去抓取,所以索性给小伙伴一个脚本。小伙伴还需要自己搭建python环境,需要熟悉一些参数修改操作。想想也太麻烦了。.
于是,结合之前做的汇率计算器小工具,决定用PyQt5为朋友做一个爬虫小工具,方便他操作可视化。
一、效果演示
二、功能说明 三、生产工艺
首先导入需要的库
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow,QFileDialog
import os
import requests
from fake_useragent import UserAgent
import json
import logging
import time
import pandas as pd
from openpyxl import load_workbook
雪球拆解
这一步的目的是获取待爬数据的真实URL地址模式。
当我选择一只股票查看财务数据和某类数据报告时,点击下一页,网址没有变化。基本可以知道这是动态加载的数据。对于这类数据,我可以使用F12打开开发者模式。
在开发者模式下,选择Network—>XHR可以查看到真实的数据获取地址URL和请求方式(一般是请求URL和请求方式描述,Request Headers有请求头信息,比如cookies,Query String Parameters 都有可变参数项,一般来说,数据源URL由base URL和这里的可变参数组成)
我们分析这个URL,可以发现它的基本结构如下:
基于以上结构,我们拆分最终的组合URL地址如下
#基础网站
base_url = f'https://stock.xueqiu.com/v5/stock/finance/{ABtype}'
#组合url地址
url = f'{base_url}/{data_type}.json?symbol={ipo_code}&type=all&is_detail=true&count={count_num}×tamp={start_time}'
操作界面设计
操作界面设计使用PyQt5,这里不再详细介绍,后续会讲解PyQt5的使用。
使用QT designer可视化设计操作界面,参考如下:
Snowball Data Extraction.ui中各组件的相关设置,参考如下:
.ui文件可以使用pyuic5命令编译生成对应的.py文件,或者我们也可以直接在vscode中翻译(这里不做更详细的介绍,详见后续专题讲解)。
本文并没有单独使用操作界面定义文件,而是将所有代码集中在同一个.py文件中,所以翻译后的代码可以用来做备份。
获取cookies和基本参数 获取cookies
为了方便小工具的使用,我们需要自动获取cookie地址并附在请求头中,而不是在开发者模式下手动打开网页获取cookie并填写。
自动获取cookies,这里使用的requests库的session会话对象。
请求库的会话对象可以跨请求保留某些参数。简单来说,比如你使用session成功登录了一个网站,在再次使用session对象请求该网站的其他网页之前,默认会使用session。使用的cookie等参数
import requests
from fake_useragent import UserAgent
url = 'https://xueqiu.com'
session = requests.Session()
headers = {"User-Agent": UserAgent(verify_ssl=False).random}
session.get(url, headers=headers)
#获取当前的Cookie
Cookie= dict(session.cookies)
基本参数
basic参数用于请求金融数据时选择原创
URL组成参数。我们需要在可视化操作工具中选择财务数据类型,所以这里需要建立一个财务数据类型字典。
#原始网址
original_url = 'https://xueqiu.com'
#财务数据类型字典
dataType = {'全选':'all',
'主要指标':'indicator',
'利润表':'income',
'资产负债表':'balance',
'*敏*感*词*流量表':'cash_flow'}
获取 获取各个证券市场的上市名单
因为我们在可视化操作工具上选择股票代码后抓取相关数据并导出,我们希望导出的文件名以股票代码+公司名称(SH600000上海浦东发展银行)的形式存储,所以我们需要获取股票代码与名称对应关系的字典表。
这其实就是一个简单的网络爬虫和数据格式调整过程,实现代码如下:
1import requests
2import pandas as pd
3import json
4from fake_useragent import UserAgent
5#请求头设置
6headers = {"User-Agent": UserAgent(verify_ssl=False).random}
7#股票清单列表地址解析(通过设置参数size为9999可以只使用1个静态地址,全部股票数量不足5000)
8url = 'https://xueqiu.com/service/v5/stock/screener/quote/list?page=1&size=9999&order=desc&orderby=percent&order_by=percent&market=CN&type=sh_sz'
9#请求原始数据
10response = requests.get(url,headers = headers)
11#获取股票列表数据
12df = response.text
13#数据格式转化
14data = json.loads(df)
15#获取所需要的股票代码及股票名称数据
16data = data['data']['list']
17#将数据转化为dataframe格式,并进行相关调整
<p>
" />
18data = pd.DataFrame(data)
19data = data[['symbol','name']]
20data['name'] = data['symbol']+' '+data['name']
21data.sort_values(by = ['symbol'],inplace=True)
22data = data.set_index(data['symbol'])['name']
23#将股票列表转化为字典,键为股票代码,值为股票代码和股票名称的组合
24ipoCodecn = data.to_dict()
</p>
A股股票代码及公司名称词典如下:
获取并导出上市公司财务数据
根据可视化操作界面选择的财报时间间隔、财报数据类型、选择的股市类型、输入的股票代码,首先需要根据这些参数形成我们需要请求数据的URL,然后执行数据请求。
由于请求的数据是json格式,可以直接转成dataframe类型再导出。在导出数据的时候,我们需要判断数据文件是否存在,存在则添加,不存在则新建。
获取上市公司财务数据
通过选择的参数生成财务数据URL,然后根据是否全选来决定后续数据请求的操作,所以可以拆分为获取数据URL和请求明细数据两部分。
获取数据地址
根据证券市场类型、金融数据类型、股票代码、单页数、起始时间戳确定数据URL,这些参数均通过可视化操作界面进行设置。
证券市场类型控件是radioButton,可以通过你的ischecked()方法判断是否选中,然后使用if-else设置参数;
由于财务数据类型和股票代码支持全选,需要先进行全选判断(全选条件下需要循环获取数据URL,否则只是单次获取),所以这部分需要再次分裂;
单页数考虑到每年有4份财务报表,所以这里默认为年差*4;
时间戳是根据开始时间中的结束时间计算的。由于可视化界面输入的是整数年,我们可以通过mktime()方法获取时间戳。
1def Get_url(self,name,ipo_code):
2 #获取开始结束时间戳(开始和结束时间手动输入)
3 inputstartTime = str(self.start_dateEdit.date().toPyDate().year)
4 inputendTime = str(self.end_dateEdit.date().toPyDate().year)
5 endTime = f'{inputendTime}-12-31 00:00:00'
6 timeArray = time.strptime(endTime, "%Y-%m-%d %H:%M:%S")
7
8 #获取指定的数据类型及股票代码
9 filename = ipo_code
10 data_type =dataType[name]
11 #计算需要采集的数据量(一年以四个算)
12 count_num = (int(inputendTime) - int(inputstartTime) +1) * 4
13 start_time = f'{int(time.mktime(timeArray))}001'
14
15 #证券市场类型
16 if (self.radioButtonCN.isChecked()):
17 ABtype = 'cn'
18 num = 3
19 elif (self.radioButtonUS.isChecked()):
20 ABtype = 'us'
21 num = 6
22 elif (self.radioButtonHK.isChecked()):
23 ABtype = 'hk'
24 num = 6
25 else:
26 ABtype = 'cn'
27 num = 3
28
29 #基础网站
30 base_url = f'https://stock.xueqiu.com/v5/stock/finance/{ABtype}'
31
32 #组合url地址
33 url = f'{base_url}/{data_type}.json?symbol={ipo_code}&type=all&is_detail=true&count={count_num}×tamp={start_time}'
34
35 return url,num
请求详细数据
有必要根据用户输入确定数据采集
方法。代码主要是根据用户的输入进行判断,然后请求详细的数据。
1#根据用户输入决定数据采集方式
2def Get_data(self):
3 #name为财务报告数据类型(全选或单个)
4 name = self.Typelist_comboBox.currentText()
5 #股票代码(全选或单个)
6 ipo_code = self.lineEditCode.text()
7 #判断证券市场类型
8 if (self.radioButtonCN.isChecked()):
9 ipoCodex=ipoCodecn
10 elif (self.radioButtonUS.isChecked()):
11 ipoCodex=ipoCodeus
12 elif (self.radioButtonHK.isChecked()):
13 ipoCodex=ipoCodehk
14 else:
15 ipoCodex=ipoCodecn
16#根据财务报告数据类型和股票代码类型决定数据采集的方式
17 if name == '全选' and ipo_code == '全选':
18 for ipo_code in list(ipoCodex.keys()):
19 for name in list(dataType.keys())[1:]:
20 self.re_data(name,ipo_code)
21 elif name == '全选' and ipo_code != '全选':
22 for name in list(dataType.keys())[1:]:
23 self.re_data(name,ipo_code)
24 elif ipo_code == '全选' and name != '全选':
25 for ipo_code in list(ipoCodex.keys()):
26 self.re_data(name,ipo_code)
27 else:
28 self.re_data(name,ipo_code)
29
30#数据采集,需要调用数据网址(Get.url(name,ipo_code)
31def re_data(self,name,ipo_code):
32 name = name
<p>
" />
33 #获取url和num(url为详情数据网址,num是详情数据中根据不同证券市场类型决定的需要提取的数据起始位置)
34 url,num = self.Get_url(name,ipo_code)
35 #请求头
36 headers = {"User-Agent": UserAgent(verify_ssl=False).random}
37 #请求数据
38 df = requests.get(url,headers = headers,cookies = cookies)
39
40 df = df.text
41try:
42 data = json.loads(df)
43 pd_df = pd.DataFrame(data['data']['list'])
44 to_xlsx(num,pd_df)
45 except KeyError:
46 log = '该股票此类型报告不存在,请重新选择股票代码或数据类型'
47 self.rizhi_textBrowser.append(log)
</p>
财务数据处理与导出
简单数据导出是比较简单的操作,直接to_excel()即可。但是考虑到同一个上市公司的财务数据有四类,我们希望都保存在同一个文件下,而且可能会出现同一类数据的批量导出,希望加上。因此需要特殊处理,使用pd.ExcelWriter()方法进行操作。
1 #数据处理并导出
2def to_xlsx(self,num,data):
3 pd_df = data
4 #获取可视化操作界面输入的导出文件保存文件夹目录
5 filepath = self.filepath_lineEdit.text()
6 #获取文件名
7 filename = ipoCode[ipo_code]
8 #组合成文件详情(地址+文件名+文件类型)
9 path = f'{filepath}\{filename}.xlsx'
10 #获取原始数据列字段
11 cols = pd_df.columns.tolist()
12 #创建空dataframe类型用于存储
13 data = pd.DataFrame()
14 #创建报告名称字段
15 data['报告名称'] = pd_df['report_name']
16 #由于不同证券市场类型下各股票财务报告详情页数据从不同的列才是需要的数据,因此需要用num作为点
17 for i in range(num,len(cols)):
18 col = cols[i]
19 try:
20 #每列数据中是列表形式,第一个是值,第二个是同比
21 data[col] = pd_df[col].apply(lambda x:x[0])
22 # data[f'{col}_同比'] = pd_df[col].apply(lambda x:x[1])
23 except TypeError:
24 pass
25 data = data.set_index('报告名称')
26 log = f'{filename}的{name}数据已经爬取成功'
27 self.rizhi_textBrowser.append(log)
28 #由于存储的数据行索引为数据指标,所以需要对采集的数据进行转T处理
29 dataT = data.T
30 dataT.rename(index = eval(f'_{name}'),inplace=True)
31 #以下为判断数据报告文件是否存在,若存在则追加,不存在则重新创建
32 try:
33 if os.path.exists(path):
34 #读取文件全部页签
35 df_dic = pd.read_excel(path,None)
36 if name not in list(df_dic.keys()):
37 log = f'{filename}的{name}数据页签不存在,创建新页签'
38 self.rizhi_textBrowser.append(log)
39 #追加新的页签
40 with pd.ExcelWriter(path,mode='a') as writer:
41 book = load_workbook(path)
42 writer.book = book
43 dataT.to_excel(writer,sheet_name=name)
44 writer.save()
45 else:
46 log = f'{filename}的{name}数据页签已存在,合并中'
47 self.rizhi_textBrowser.append(log)
48 df = pd.read_excel(path,sheet_name = name,index_col=0)
49 d_ = list(set(list(dataT.columns)) - set(list(df.columns)))
50 #使用merge()进行数据合并
51 dataT = pd.merge(df,dataT[d_],how='outer',left_index=True,right_index=True)
52 dataT.sort_index(axis=1,ascending=False,inplace=True)
53 #页签中追加数据不影响其他页签
54 with pd.ExcelWriter(path,engine='openpyxl') as writer:
55 book = load_workbook(path)
56 writer.book = book
57 idx = writer.book.sheetnames.index(name)
58 #删除同名的,然后重新创建一个同名的
59 writer.book.remove(writer.book.worksheets[idx])
60 writer.book.create_sheet(name, idx)
61 writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
62
63 dataT.to_excel(writer,sheet_name=name,startcol=0)
64 writer.save()
65 else:
66 dataT.to_excel(path,sheet_name=name)
67
68 log = f'{filename}的{name}数据已经保存成功'
69 self.rizhi_textBrowser.append(log)
70
71 except FileNotFoundError:
72 log = '未设置存储目录或存储目录不存在,请重新选择文件夹'
73 self.rizhi_textBrowser.append(log)