Stata+Python:同花顺里爬取创历史新高的股票

发布时间:2022-05-20 阅读 597

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者: 李青塬 (广东工业大学)
邮箱: qingyuanli95@gmail.com


目录


1. 引言

中国A股市场上如何择股?有一类投资者偏好投资创历史新高的股票。其逻辑是股价创新高有创新高的道理,可能有很好的业绩支撑或者公司业务有突破性发展,只是当前消息还没有公布,所以有的资本市场的弄潮儿偏好这类股票。本文尝试利用 Stata 爬取同花顺数据中心提供的创历史新高股票数据,实现自动爬取每个交易日的数据,不过需要 Stata 中配置 Python 环境才可运行。

2. 过程简介

该爬虫难度不大,只需要把网页数据抓取得到即可。一共需要编写 3 个函数,主函数、请求函数和解析函数。随后,把请求得到的数据写入文件中。爬取的目标网址是同花顺金融中心技术选股创新高栏目,具体网址是 http://data.10jqka.com.cn/rank/cxg/###

3. 具体代码

在具体执行程序前,需要设定文件路径,以及提前下载可以自动生成Cookie的js文件到本地。

global root= "E:\high"
global raw_data= "$root\Raw_data"
cap !mkdir "$raw_data"
cd $raw_data
copy  https://gitee.com/qingyuanlee/data-center/raw/master/aes.min.js "$raw_data\"

在 Stata 中设定好可以运行 Python 的环境,此处根据安装路径自行修改。设定好好,打开 Python 环境 。

set python_exec  D:\Python\python.exe
python

该项目需要综合利用不同工具箱的工具,需要导入以下的 Python 工具包。

import urllib.request
import execjs
import gzip
import xlwt
from bs4 import BeautifulSoup
import os
import datetime as dtm

接下来开始编写请求函数,使用刚刚开始下载的 js 文件生成Cookie,注入Cookie 到请求头,并发送请求。

def ask(requestUrl):
    with open('./aes.min.js', 'r') as f:
        jsContent = f.read()
    context = execjs.compile(jsContent)
    header = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
        'Accept-Encoding': 'gzip, deflate',
        "Accept-Language": "zh-CN,zh;q=0.9",
        'Cache-Control': 'max-age=0',
        'Cookie': '',
        'Host': 'data.10jqka.com.cn',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    header['Cookie'] = 'v={}'.format(context.call("v"))
    req = urllib.request.Request(url=requestUrl, headers=header)
    response = urllib.request.urlopen(req)
    return response

编写解析函数,将获取的数据进行解析。

def analyzing(response):
    html = gzip.decompress(response.read()).decode("gbk")
    soups = BeautifulSoup(html, "html.parser")
    return soups

编写主函数,访问目标链接。

url = "http://data.10jqka.com.cn/rank/cxg/board/1/field/stockcode/order/asc/page/1/ajax/1/free/1/"
soup = analyzing(ask(url))

有时候,创历史新高股票较多,有好几页,所以我们需要获取爬取的总页面数。

item = soup.findAll("a", class_="changePage")
lens = 0
if len(item) != 0:
    lens = item[len(item) - 1].attrs["page"]
    lens = int(lens)

创建待写入的表格形式。

workbook = xlwt.Workbook(encoding="UTF-8")
worksheet = workbook.add_sheet("sheet1")
worksheet.write(0, 0, '序号')
worksheet.write(0, 1, '股票代码')
worksheet.write(0, 2, '股票简称')
worksheet.write(0, 3, '涨跌幅')
worksheet.write(0, 4, '换手率')
worksheet.write(0, 5, '最新价(元)')
worksheet.write(0, 6, '前期高点')
worksheet.write(0, 7, '前期高点日期')

先对第一页进行解析到表格中,如果有第二页可以继续解析到表格中。

i = 0
for item in soup.findAll("tr"):
    j = 0
    for data in item.findAll("td"):
        worksheet.write(i, j, data.string)
        j = j + 1
    i = i + 1
if lens != 0:
    url = "http://data.10jqka.com.cn/rank/cxg/board/1/field/stockcode/order/asc/page/" 
	ed = "/ajax/1/free/1/"
    for p in range(2, lens+1):
        soup = analyzing(ask(url + str(p) + ed))
        i = i-1
        for item in soup.findAll("tr"):
            j = 0
            for data in item.findAll("td"):
                worksheet.write(i, j, data.string)
                j = j + 1
            i = i + 1

按交易日期格式保存表格到相应文件夹中。

a=dtm.date.today()
endtime=a.strftime('%Y-%m-%d') 
b=endtime.split('-')
day=b[0]+b[1]+b[2]
workbook.save("E:/high/Raw_data/high_%s.xlsx"%(day))

4. 所有代码

以下代码需要 Stata 中配置 Python 环境,仅需修改 Python 运行环境路径,即可运行所有代码。

global root= "E:\high"
global raw_data= "$root\Raw_data"
cap !mkdir "$raw_data"
cd $raw_data
copy  https://gitee.com/qingyuanlee/data-center/raw/master/aes.min.js "$raw_data\"
set python_exec  D:\Python\python.exe       //此处根据安装路径自行修改
python
import urllib.request
import execjs
import gzip
import xlwt
from bs4 import BeautifulSoup
import os
import datetime as dtm
def ask(requestUrl):
    with open('./aes.min.js', 'r') as f:
        jsContent = f.read()
    context = execjs.compile(jsContent)
    header = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
        'Accept-Encoding': 'gzip, deflate',
        "Accept-Language": "zh-CN,zh;q=0.9",
        'Cache-Control': 'max-age=0',
        'Cookie': '',
        'Host': 'data.10jqka.com.cn',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    header['Cookie'] = 'v={}'.format(context.call("v"))
    req = urllib.request.Request(url=requestUrl, headers=header)
    response = urllib.request.urlopen(req)
    return response
def analyzing(response):
    html = gzip.decompress(response.read()).decode("gbk")
    soups = BeautifulSoup(html, "html.parser")
    return soups
url = "http://data.10jqka.com.cn/rank/cxg/board/1/field/stockcode/order/asc/page/1/ajax/1/free/1/"
soup = analyzing(ask(url))
item = soup.findAll("a", class_="changePage")
lens = 0
if len(item) != 0:
    lens = item[len(item) - 1].attrs["page"]
    lens = int(lens)
workbook = xlwt.Workbook(encoding="UTF-8")
worksheet = workbook.add_sheet("sheet1")
worksheet.write(0, 0, '序号')
worksheet.write(0, 1, '股票代码')
worksheet.write(0, 2, '股票简称')
worksheet.write(0, 3, '涨跌幅')
worksheet.write(0, 4, '换手率')
worksheet.write(0, 5, '最新价(元)')
worksheet.write(0, 6, '前期高点')
worksheet.write(0, 7, '前期高点日期')
i = 0
for item in soup.findAll("tr"):
    j = 0
    for data in item.findAll("td"):
        worksheet.write(i, j, data.string)
        j = j + 1
    i = i + 1
if lens != 0:
    url = "http://data.10jqka.com.cn/rank/cxg/board/1/field/stockcode/order/asc/page/" 
	ed = "/ajax/1/free/1/"
    for p in range(2, lens+1):
        soup = analyzing(ask(url + str(p) + ed))
        i = i-1
        for item in soup.findAll("tr"):
            j = 0
            for data in item.findAll("td"):
                worksheet.write(i, j, data.string)
                j = j + 1
            i = i + 1
a=dtm.date.today()
endtime=a.strftime('%Y-%m-%d') 
b=endtime.split('-')
day=b[0]+b[1]+b[2]
workbook.save("E:/high/Raw_data/high_%s.xlsx"%(day))
end

5. 相关推文

Note:产生如下推文列表的命令为:lianxh 金融 爬虫 , m

安装最新版 lianxh 命令:ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh