iT邦幫忙

0

如何爬取期交所表格資訊

小弟是自學程式的新手,在爬蟲上遇到一些問題,想和各位前輩們請益,
這是我嘗試想要爬期交所某個網頁的程式碼,
但表格的部分不曉得怎麼解析,還請各位前輩們能給小弟指點一下迷津.
表格的標題應該算是解析得出來,但內容不曉得怎麼處理.
import pandas as ps
import requests
from bs4 import BeautifulSoup
import re

data = {"queryType": "2",
"marketCode": "0",
"commodity_id": "TXO",
"queryDate": "2019/04/03",
"MarketCode": "0",
"commodity_idt":"TXO"}
url = requests.post('http://www.taifex.com.tw/cht/3/optDailyMarketReport',data).text
bs = BeautifulSoup(url,'html.parser')
table_f = bs.find('table',{'class':'table_f'}).tbody
title = []
for th in table_f.find('tr',{'class':'12whit'}) :
if th.string == None:
th = th.find('div',{'align':'center'})
if th.string == None:
title.append(th.text)
else:
title.append(th.string)
else:
title.append(th.string)
newtitle = []
for te in title:
if te != '\n' :
newtitle.append(te)
body = []
for td in table_f.find_all('tr').td:
body.append(td.string)
print(body)

ccutmis iT邦高手 9 級 ‧ 2019-04-08 10:28:20 檢舉
有本書對Python新手來說不錯 推薦樓主可以去書局找看看 或是 google "python編程快速上手 — — 讓繁瑣工作自動化" 或許會有幫助
感謝ccuntmis 大大的建議~
我會去找看看的~~

1 個回答

5
ccutmis
iT邦高手 9 級 ‧ 2019-04-08 10:17:03
最佳解答

網路爬虫枝節太多有技術面問題也有法律面問題,
建議 google搜 'python beautifulsoup' 就有一堆教學了或是買本書來參考,
寫作遇到問題可以先用google搜'python stackoverflow'加你遇到的問題用英文描述,大多可以找到方向。
針對樓主問題我這邊簡單舉個例給您參考...

from bs4 import BeautifulSoup
html_doc = """
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-TW">

<head><meta http-equiv="X-UA-Compatible" content="IE=edge"></head><!doctype html>
<html><head><title>選擇權每日交易行情查詢</title></head><body>
<table cellspacing="1" cellpadding="2" width="965" border="0" class="table_f">
<tbody> 
<tr bgcolor="#6699CC" class="12whit"> 
<th width=32>契約</th>
<th width=55> <div align="center">到期月份<br>(週別)</div></th>
<th width=50> <div align="center">履約價</div></th>
<th width=50> <div align="center">買賣權</div></th>
</tr>
<tr>
<td class="12bk"><div align="center">TXO</div></td>
<td class="12bk"><div align="center">201904W2</div></td>
<td align="right" class="12bk">9900</td>
</tr>
</tbody></table>
</body></html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
a_tags = soup.find_all(name='td',attrs={"class":"12bk"})
for i in a_tags: print(i.text)
# print TXO\n201904W2\n9900

假設你要抓取的是裡面的表格,先分析目標頁面的html碼,
會發現資料td的格式為

<td class="12bk"><div align="center">我要的資料</div></td>

這時用find_all(name='td',attrs={"class":"12bk"})就可以篩出全部符合的td
諸如此類的細節太雜了不好說,總之加油了~

看更多先前的回應...收起先前的回應...
froce iT邦大師 4 級 ‧ 2019-04-08 11:48:05 檢舉

我現在都推別人用requests-html,方便多了。
Ex:

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://python.org/')

about = r.html.find('#about', first=True)
ccutmis iT邦高手 9 級 ‧ 2019-04-08 12:22:43 檢舉

您說的確實是呢^^" 不過樓主問了bs的問題 我就用bs的解法回了

froce iT邦大師 4 級 ‧ 2019-04-08 13:11:14 檢舉

所以我回在回應啊。XD
方便的盡量推,不要網路上文章教BS4,結果放著好用的沒人用。

ccutmis iT邦高手 9 級 ‧ 2019-04-08 15:00:24 檢舉

/images/emoticon/emoticon39.gif

感謝froce大大的推薦!!
我會多方嘗試看看的!!!
如果有碰到其他問題~我會再丟上來向各位前輩們請教的

ccutmis iT邦高手 9 級 ‧ 2019-04-08 18:01:09 檢舉
import re
import requests

url = 'http://www.taifex.com.tw/cht/3/optDailyMarketReport'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Cafari/537.36'}
source = requests.get(url, headers=headers, timeout=10).text

source=source.replace("\r\n","").replace("\n","").replace("\t","").replace("<FONT color=black>","").replace("<FONT color=green>","").replace("</FONT>","").replace("<font color=\"red\">","").replace("</font>","")

data = [list(filter(None, i))[:] for i in re.findall('<td[^c]*class="12bk"><div align="center">(.*?)</div></td>|<td align="right" class="12bk">(.*?)</td>|<TD align=right class="12bk">(.*?)</TD>|<td align="middle" class="12green">(.*?)</td>', source)]

for j in range(0,len(data)-1,19):
	tmpStr=""
	for i in range(j,j+19,1):
		if i!=0 and i%19!=0: tmpStr=tmpStr+','
		tmpStr=tmpStr+data[i][0].strip()
	print(tmpStr)
	print("--------------------------------------------------")

再提供一個簡單範例 假如抓下來的網頁源碼裡有亂七八糟的code(像樓主要抓的那個網頁源碼),先用.replace()把亂七八糟的東西移掉,再用最基本的re去篩選要的內容,最後的結果是一個陣列,我用一個二元廻圈把它排成表格(這個跟程式設計書本上常見的九九乘法表原理一樣,原理懂了之後怎麼改都很簡單)。

我要發表回答

立即登入回答