如果需要做"地緣券商"特徵需要知道公司地址跟券商地址
根據之前爬的股票代碼來爬每家公司的資訊
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
定期刪除這張表,重新爬蟲取得新上市上櫃的資訊