iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 14
0
AI & Data

量化投資與機器學習研究系列 第 14

14.爬公司資訊,地址、資本額(做地緣券商)

  • 分享至 

  • xImage
  •  

如果需要做"地緣券商"特徵需要知道公司地址跟券商地址

爬公司的資訊

根據之前爬的股票代碼來爬每家公司的資訊

payload = {
    'encodeURIComponent': '1',
    'step': '1',
    'firstin': '1',
    'off': '1',
    'keyword4': '',
    'code1': '',
    'TYPEK2': '',
    'checkbtn': '',
    'queryName': 'co_id',
    'inpuType': 'co_id',
    'TYPEK': 'all',
    'co_id': '',
}

url = 'http://mops.twse.com.tw/mops/web/ajax_t05st03'

columns = ['股票代號', '產業類別', '營利事業統一編號', '實收資本額', '已發行普通股數或TDR原股發行股數', '特別股', '電話', '地址', '主要經營業務']

import time
import random

items = []
for row in stock_code[stock_code['dtype'] == '股票'].itertuples():
    time.sleep(random.randrange(8,12))
    payload['co_id'] = row.code
    item = {}
    response_dom = pq(requests.post(url, data=payload).text)
    for col in columns:
        value=response_dom(f"th:contains('{col}')").eq(0).next().text()
        item[col] = value
        
    items.append(item)

data = pd.DataFrame(items)[columns]
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>股票代號</th>
      <th>產業類別</th>
      <th>營利事業統一編號</th>
      <th>實收資本額</th>
      <th>已發行普通股數或TDR原股發行股數</th>
      <th>特別股</th>
      <th>電話</th>
      <th>地址</th>
      <th>主要經營業務</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1101</td>
      <td>水泥工業</td>
      <td>11913502</td>
      <td>51,080,599,110元</td>
      <td>5,108,059,911股 (含私募 0股)</td>
      <td>0股</td>
      <td>2531-7099轉20501</td>
      <td>台北市中山北路2段113號</td>
      <td>有關水泥及水泥製品之生產及運銷\n有關水泥原料及水泥製品原料之開採製造運銷及附屬礦石之開採經...</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1102</td>
      <td>水泥工業</td>
      <td>03244509</td>
      <td>33,614,471,980元</td>
      <td>3,361,447,198股 (含私募 0股)</td>
      <td>0股</td>
      <td>02-2737-8940</td>
      <td>台北市大安區敦化南路2段207號30、31樓</td>
      <td>水泥,水泥之半成品,水泥製品,預拌混凝土及其添加劑之生產運銷\n水泥原料,水泥製品原料及砂石...</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1103</td>
      <td>水泥工業</td>
      <td>11892801</td>
      <td>7,747,805,480元</td>
      <td>774,780,548股 (含私募 0股)</td>
      <td>0股</td>
      <td>(02)2551-5211#243</td>
      <td>台北市中山北路2段96號</td>
      <td>水泥、生產、銷售</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1104</td>
      <td>水泥工業</td>
      <td>07568009</td>
      <td>6,536,091,920元</td>
      <td>653,609,192股 (含私募 0股)</td>
      <td>0股</td>
      <td>02-25077801</td>
      <td>台北市南京東路二段125號10樓</td>
      <td>水泥原料熟料及水泥製品原料之開採製造生產運銷\n石膏板及其原料生產加工運銷,裝潢工程設計安裝...</td>
    </tr>

清理出'實收資本額','已發行普通股數或TDR原股發行股數','特別股'的數字

import re

data.iloc[:, 3:6] = data.iloc[:, 3:6].applymap(re.search('(\d+)', x.replace(',', '')).group())
data.head()

爬資訊時會遇到"查詢過於頻繁,請稍後再試!!"
因為這份資料不常變動所以爬慢點10秒左右爬一次

import re
import scrapy
from skhome.extensions import MongoDatabase

columns = ['產業類別', '營利事業統一編號', '實收資本額', '已發行普通股數或TDR原股發行股數', '特別股', '電話', '地址', '主要經營業務']


class TemplateSpider(scrapy.Spider):
    name = "stock_company_info"

    custom_settings = {
        'DOWNLOAD_DELAY': 10,
        'CONCURRENT_REQUESTS': 1,
        'MONGODB_COLLECTION': name,
        'MONGODB_ITEM_CACHE': 10,
        'COOKIES_ENABLED': False,
        'MONGODB_DROP': True
    }

    def start_requests(self):
        with MongoDatabase('stock_code') as conn:
            stock_code = conn.export_df({'dtype': '股票'}, {'code': 1, 'name': 1, '市場別': 1})

        for row in stock_code.to_dict('row'):
            payload = {
                'encodeURIComponent': '1',
                'step': '1',
                'firstin': '1',
                'off': '1',
                'keyword4': '',
                'code1': '',
                'TYPEK2': '',
                'checkbtn': '',
                'queryName': 'co_id',
                'inpuType': 'co_id',
                'TYPEK': 'all',
                'co_id': row['code'],
            }
            self.logger.info(row['code'] + ': ' + row['name'])
            yield scrapy.FormRequest(url='http://mops.twse.com.tw/mops/web/ajax_t05st03',
                                     formdata=payload, meta={'row': row}, dont_filter=True)

    def parse(self, response):
        item = response.meta['row']
        for col in columns:
            value = response.dom(f"th:contains('{col}')").eq(0).next().text()
            if col in ['實收資本額', '已發行普通股數或TDR原股發行股數', '特別股']:
                item[col] = re.search('(\d+)', value.replace(',', '')).group()
            else:
                item[col] = value
        yield item

定期刪除這張表,重新爬蟲取得新上市上櫃的資訊


上一篇
13.股市資料爬蟲苦主
下一篇
15.各券商分點地址、經緯度(做地緣券商)
系列文
量化投資與機器學習研究30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言