Python实战系列-贵州茅台和华能信托股权穿透研究

news/2024/5/19 3:25:49 标签: python, 贵州茅台, 前沿技术, 人工智能, 爬虫

文章目录

  • 如何对贵州茅台的股权进行穿透研究
  • 茅台股权穿透研究代码如下
  • 发现在29行代码出现问题,就是href取得是空数组,怀疑是p_href的问题
  • 取不到股东信息,所以再仔细查看应该是下面这个第一个地址:
  • 这里注意要加sleep,要不然有时候容易报错,找不到网页元素
  • 你知道i[0:-1]是什么意思吗?
  • 华能信托和贵州茅台股权穿透研究完整代码:

如何对贵州茅台的股权进行穿透研究

在这里插入图片描述
在这里插入图片描述
今天就来讲讲如何对贵州茅台股权进行研究

茅台股权穿透研究代码如下

python">#!/usr/bin/env python
# coding: utf-8

# In[1]:


from selenium import webdriver
import re
import time
import pandas as pd


# In[2]:


company_name = '华能信托'
browser = webdriver.Chrome()
url = 'https://xin.baidu.com/s?q=' + company_name
browser.get(url)
data = browser.page_source
print(data)


# In[3]:


p_href = '<h3 data-v-4dc1d36e="" class="title"><a data-v-4dc1d36e="" target="_blank" href="(.*?)"'
href = re.findall(p_href, data)
url2 = 'https://xin.baidu.com' + href[0]
browser.get(url2)
data = browser.page_source


# In[5]:


table = pd.read_html(data)
df = table[1]
df


# In[7]:


company = df['发起人/股东'][1]
company


# In[12]:


company_split = company.split(' ')
company_split


# In[14]:


company = df['发起人/股东'][0]
company_split = company.split(' ')
for i in company_split:
    if '有限公司' in i:
        print(i)


# In[13]:


company = df['发起人/股东'][0]
company_split = company.split(' ')
for i in company_split:
    if len(i) > 6:
        print(i)


# In[15]:


def baidu(company_name):
    browser = webdriver.Chrome()
    url = 'https://xin.baidu.com/s?q=' + company_name
    browser.get(url)
    time.sleep(2)  # 休息2秒,防止页面没加载完
    data = browser.page_source
    
    p_href = '<h3 data-v-4dc1d36e="" class="title"><a data-v-4dc1d36e="" target="_blank" href="(.*?)"'
    href = re.findall(p_href, data)
    url2 = 'https://xin.baidu.com' + href[0]
    browser.get(url2)
    time.sleep(2)  # 休息2秒,防止页面没加载完
    data = browser.page_source
    table = pd.read_html(data)
    df = table[1]
    
    browser.quit()  # 退出模拟浏览器
    
    company = df['发起人/股东'][0]
    company_split = company.split(' ')
    for i in company_split:
        if len(i) > 6:  # 不要用if '有限公司' in i,这个不太好,例如国资委不含有“有限公司 ”字样
            return i


# In[16]:


baidu('中国华能集团有限公司')


# In[17]:


company_1 = baidu('华能信托')
company_2 = baidu(company_1)
company_3 = baidu(company_2)


# In[18]:


company_1, company_2, company_3


# In[ ]:





# In[ ]:





# In[19]:


company = '贵州茅台'
while True:
    try:
        company = baidu(company)
        print(company)
    except:
        break
        
company


# In[ ]:





# In[ ]:





# In[38]:


num_sum = 0.0
num = 0
for i in df['持股比例']:
    if i == '-':
        num = 1
        break
    i = float(i[0:-1])  # 清除百分号,并转为浮点数
    print(i)
    num_sum = i + num_sum
    num += 1
    if num_sum > 80:
        break
        
print(num)


# In[17]:


for i in range(num):
    company_i = df['发起人/股东'][i]
    company_split = company_i.split(' ')
    for j in company_split:
        if '有限公司' in j:
            print(j)


# In[ ]:





# In[ ]:

执行过程中发现报错:

python">                "app": "universe", // 调用方端内 APP 类型:iOS/Android/universe,非端内传 universe
                "ver": "", // app版本号
            }
            xaf.init(initParams);
        } catch(e) {
            console.log(e);
        }</script> <script src="//xinpub.cdn.bcebos.com/aiqicha/static/1667908976/js/s.031a6934a4e.js"></script> </body></html>
Traceback (most recent call last):
  File "E:/tech/SufferSpace/股权穿透研究-1110.py", line 29, in <module>
    url2 = 'https://xin.baidu.com' + href[0]
IndexError: list index out of range

Process finished with exit code 1

发现在29行代码出现问题,就是href取得是空数组,怀疑是p_href的问题

于是通过网页发现应该是这个地址:
在这里插入图片描述

但是等到执行后面的代码,发现有个“发起人/股东”,因为按照上面这个地址,在这个页面中:https://aiqicha.baidu.com/brand/detail?pid=65781811851309&id=414444999

取不到股东信息,所以再仔细查看应该是下面这个第一个地址:

在这里插入图片描述
通过网址:https://aiqicha.baidu.com/company_detail_65781811851309

修改匹配逻辑如下:

python">p_href = '<h3 data-v-387da8b0="" class="title"><a data-v-387da8b0="" target="_blank" href="(.*?)"'

#p_href = '<a data-v-05558e48="" href="(.*?)" data-log-an="s-brandpanel" data-log-title="s-brandpanel-brand" class="item-inner">'
href = re.findall(p_href, data)
# https://aiqicha.baidu.com/brand/detail?pid=65781811851309&id=414444999
url2 = 'https://xin.baidu.com' + href[0]
#url2 = "https://aiqicha.baidu.com/company_detail_65781811851309"
browser.get(url2)
time.sleep(3)
data = browser.page_source

这里注意要加sleep,要不然有时候容易报错,找不到网页元素

python">time.sleep(3)

修改完后继续执行代码,又报错了

python">    raise KeyError(key) from err
KeyError: '发起人/股东'

Process finished with exit code 1

找不到“发起人/股东”,查看网页,确实没有这个,应该是“股东名称”
在这里插入图片描述
修改完后,继续执行代码,又报错了:

python">    i = float(i[0:-1])  # 清除百分号,并转为浮点数
ValueError: could not convert string to float: '67.92149%持股详情'

Process finished with exit code 1


你知道i[0:-1]是什么意思吗?

a = [0,1,2,3,4,5,6,7,8,9]

b = a[i:j] 表示复制a[i]到a[j-1],以生成新的list对象

b = a[1:3] 那么,b的内容是 [1,2]

当i缺省时,默认为0,即 a[:3]相当于 a[0:3]

当j缺省时,默认为len(alist), 即a[1:]相当于a[1:10]

a[:-1]其实就是去除了这行文本的最后一个字符(换行符)后剩下的部分 ,结果是:[0,1,2,3,4,5,6,7,8]

A = ”67.92149%持股详情>“,这个字符,要取出纯数字,就是:
A[0:-6],-6正好是%的那个位置,然后修改代码如下:

python">num_sum = 0.0
num = 0
for i in df['持股比例']:
    if i == '-':
        num = 1
        break
    i = float(i[0:-6])  # 清除百分号,并转为浮点数
    print(i)
    num_sum = i + num_sum
    num += 1
    if num_sum > 80:
        break
        
print(num)
python">最后执行结果如下:
华能资本服务有限公司
华能资本服务有限公司
贵州省人民政府国有资产监督管理委员会
67.92149
31.47813
2
华能资本服务有限公司
贵州乌江能源投资有限公司

Process finished with exit code 0

华能信托和贵州茅台股权穿透研究完整代码:

python">#!/usr/bin/env python
# coding: utf-8

# In[1]:


from selenium import webdriver
import re
import time
import pandas as pd


# In[2]:


company_name = '华能信托'
browser = webdriver.Chrome()
url = 'https://xin.baidu.com/s?q=' + company_name
browser.get(url)
time.sleep(3)
data = browser.page_source
print(data)


# In[3]:


p_href = '<h3 data-v-387da8b0="" class="title"><a data-v-387da8b0="" target="_blank" href="(.*?)"'
href = re.findall(p_href, data)
url2 = 'https://xin.baidu.com' + href[0]
browser.get(url2)
time.sleep(3)
data = browser.page_source


# In[5]:


table = pd.read_html(data)
df = table[1]
df


# In[7]:


company = df['股东名称'][1]
company


# In[12]:


company_split = company.split(' ')
company_split


# In[14]:


company = df['股东名称'][0]
company_split = company.split(' ')
for i in company_split:
    if '有限公司' in i:
        print(i)


# In[13]:


company = df['股东名称'][0]
company_split = company.split(' ')
for i in company_split:
    if len(i) > 6:
        print(i)


# In[15]:


def baidu(company_name):
    browser = webdriver.Chrome()
    url = 'https://xin.baidu.com/s?q=' + company_name
    browser.get(url)
    time.sleep(2)  # 休息2秒,防止页面没加载完
    data = browser.page_source
    
    p_href = '<h3 data-v-387da8b0="" class="title"><a data-v-387da8b0="" target="_blank" href="(.*?)"'
    href = re.findall(p_href, data)
    url2 = 'https://xin.baidu.com' + href[0]
    browser.get(url2)
    time.sleep(2)  # 休息2秒,防止页面没加载完
    data = browser.page_source
    table = pd.read_html(data)
    df = table[1]
    
    browser.quit()  # 退出模拟浏览器
    
    company = df['股东名称'][0]
    company_split = company.split(' ')
    for i in company_split:
        if len(i) > 6:  # 不要用if '有限公司' in i,这个不太好,例如国资委不含有“有限公司 ”字样
            return i


# In[16]:


baidu('中国华能集团有限公司')


# In[17]:


company_1 = baidu('华能信托')
company_2 = baidu(company_1)
company_3 = baidu(company_2)


# In[18]:


company_1, company_2, company_3


# In[ ]:





# In[ ]:





# In[19]:


company = '贵州茅台'
while True:
    try:
        company = baidu(company)
        print(company)
    except:
        break
        
company


# In[ ]:





# In[ ]:





# In[38]:


num_sum = 0.0
num = 0
for i in df['持股比例']:
    if i == '-':
        num = 1
        break
    i = float(i[0:-6])  # 清除百分号,并转为浮点数
    print(i)
    num_sum = i + num_sum
    num += 1
    if num_sum > 80:
        break
        
print(num)


# In[17]:


for i in range(num):
    company_i = df['股东名称'][i]
    company_split = company_i.split(' ')
    for j in company_split:
        if '有限公司' in j:
            print(j)


# In[ ]:





# In[ ]:

http://www.niftyadmin.cn/n/4689.html

相关文章

【学习日志】2022.11.10 C++11常量表达式、用户定义字面量、原生字符串字面值、类的改进、Leetcode疼迅优选50提T1

常量表达式 常量表达式主要是允许一些计算发生在编译时&#xff0c;即发生在代码编译而不是运行的时候。 这是很大的优化&#xff1a;假如有些事情可以在编译时做&#xff0c;它将只做一次&#xff0c;而不是每次程序运行时都计算。 使用constexpr&#xff0c;你可以创建一个…

ASP.NET教育行业OA办公系统源码(带文档)免费分享

ASP.NET教育OA源码 教育行业OA源码带文档 需要源码学习可私信。 一、源码描述 这款教育OA是对整个教学业务信息进行管理&#xff0c;其中包括教师排课&#xff0c;学生基本信息&#xff0c;学生学籍变更&#xff0c;成绩管理&#xff0c;宿舍管理&#xff0c;后勤服务等。对…

08_聚合函数

我们上一章讲到了sQL单行函数。实际上sQL函数还有一类&#xff0c;叫做聚合&#xff08;或聚集、分组)函数,它是对一组数据进行汇总的函数&#xff0c;输入的是一组数据的集合&#xff0c;输出的是单个值。 1.聚合函数介绍 1.1 AVG和SUM函数 1.2MIN和MAX函数 1.3 COUNT函数 2.…

【黄啊码】PHP压缩图片(简洁易懂版,不懂我下次不写)

大家好&#xff0c;我是黄啊码&#xff0c;今天我们来解决一件头疼的事情。作为技术人员&#xff0c;我们一般传图片都知道尽量传清晰和大小适中的图片&#xff0c;部署的时候当然也希望客户能按说明办事&#xff0c;但有的客户偏偏不听&#xff0c;就传大的&#xff0c;就传大…

Linux学习-32-ACL访问控制权限

9.7 Linux ACL访问控制权限&#xff08;包含开启方式&#xff09; Linux 系统传统的权限控制方式&#xff0c;无非是利用 3 种身份&#xff08;文件所有者&#xff0c;所属群组&#xff0c;其他用户&#xff09;&#xff0c;并分别搭配 3 种权限&#xff08;读 r&#xff0c;写…

springboot(java)使用javamail实现邮件的接收、转发、发送、清除

前言 最近在弄邮件相关的功能&#xff0c;被搞的头大&#xff0c;很多找的方法根本不知道该怎么往下走&#xff0c;就目前为止&#xff0c; 经过各种的碰壁和失败&#xff0c;就整理出来如何使用javamail实现邮件的接收、转发、发送、清除 不单单是分享&#xff0c;也为我后续…

背包问题详解(含代码)

前两天组长让我给社团的新生们出些简单的C题目&#xff0c;然后他让我出些算法题。然后我就从《趣学算法》里面找了两道题&#xff08;自己出题实在是折磨人&#xff09;&#xff0c;其中就有背包问题。 在之前看到的一篇文章《背包问题九讲》里&#xff0c;把背包问题系统分成…

基于微信小程序的食堂窗口自助点餐系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…