iT邦幫忙

1

進階爬蟲問題

是否有不一樣的方法來爬資料呢?

我最近在寫一個自動交易股票的機器人,想當然需要抓趨勢圖中現在的股價。至於這個操作簡單,可以用python 的 requests 、 selenium 來達到。但問題是,如果要及時得到資料,就必須不斷向對方server 提出request ,有很大機率會被對方server鎖IP。

我有另一個想法是,是否可以透過對方server push 過來資料,我就不需要一直提request了。
會有這種想法是因為,當我在看盤的時候,趨勢圖中的股價是隨時變動的。但我沒有request資料,為何瀏覽器上的股價會隨時變動? 是不是代表交易所的server隨時會push 資料過來,使我的瀏覽器可以即時呈現資料?
那我該如何透過此方法獲得即時的股價資訊呢?

如圖片所示,該區塊是一直變動的(代表對方server 在 push 資料過來?)。

haward79 iT邦研究生 3 級 ‧ 2021-06-18 07:47:36 檢舉
通常是 client 會定時向 server 傳送 request 然後再動態更新網頁上的資料。
你如果怕被鎖 IP 的話,可以把 request 發送的間隔拉大,例如 1 秒 1 次。
請問這代表我的瀏覽器內已經寫好多久向serevr請求資料了 嗎?已刷新瀏覽器介面
那這麼一來,我若要取得目標資料,豈不是不需要再向serevr request 一次(
因為瀏覽器上面已經有我想要的資料了,直接從瀏覽器內部挖資料就好)
ccutmis iT邦高手 2 級 ‧ 2021-06-18 12:03:53 檢舉
建議研究一下Http Socket 的基本知識
https://twgame.wordpress.com/2015/02/03/tcpiphttpsocketudp/
-----
要抓盤中的分筆成交數據是不建議直接爬交易所網站 可以找一些有提供報價的軟體或APP安裝起來 研究裡面的資料如何定時匯出 這個也是Python能做的(自動化)
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2

基本來說,這得看對方而定。
如果對方的設計上,是屬於SOCK方式的,這倒是有可能可以。

我們總不可能命令對方自已送資料出來的。
只能去請求。

再來,無論是AJAX或是SOCK。都已經可以做到背景 request 的動作。且你不自覺了。
想了解的話,你可以開瀏覽器後,再開F12的NETWORK查看。
正常你會發現會有東西,你沒做任何動作,但它會跑。(如果是SOCK的話,就看不到就是了)

看更多先前的回應...收起先前的回應...

不好意思,我對網路架構這一塊較不了解
請問我該如何知道我跟對方伺服器之間的關係是
1. clients 定期向 srever 傳送 request 以刷新瀏覽器介面?
2. srever 與 client 之間已建立連線,server 可以主動向 client push 資料以刷新介面?

請問我該往哪發向研究,才可以透過從瀏覽器上面取得我想要的即時價格資訊?來實現我上面不須額外再寫爬蟲程式向serevr 傳送request的狀況?

其實,你想要的,一直以來都是大家想要的。
但很多東西並非是你片面的想像。也不能你用
「不好意思,我對網路架構這一塊較不了解」一句話。就不管所有說的限制。

先對你說很殘酷的話

來實現我上面不須額外再寫爬蟲程式向serevr 傳送request的狀況?

基本上不可能,因為不是 client 端request,就是 server 端request。或是兩邊雙向 request。
request的動作是不變的。一定是需要的。

但基本上,client是我們控管的,這樣當然是沒問題。
server端是別人的。你無法也不可能叫SERVER去做你想要的動作。
你總不能站在人家門口喊「站住!美女!錢!」
人家就會乖乖的給你美女跟錢了吧。

所以,你說要往哪個方向去研究???我唯一能想到的就是當「黑客」了。
你去試試吧

那我可以單純了解為何上面股價會在瀏覽器上面持續變動嗎?
這個是怎麼辦到的?

我不是教你了,你先用F12查看NETWORK。你有先做了嘛??先看了嘛?
你的瀏覽器並不是你不動作。它就真的不會請求。

你明白何謂AJAX嘛?我先不要說專用術語好了,我用白話點。
你知道有所謂的背景方式的請求嘛? NETWORK 就可以看到背景式的請求了。

這樣你是否明白了??認真來說,要頁面持續變動資料更新。
並不是你認為需要POST還是GET才能做到的事。

我已經給你關鍵字了。AJAX與SOCK。但無論哪一種都是要自已寫程式。
自已寫分析處理(爬蟲原理)。
但你要的是SERVER (PUSH?)的方法。我沒辦法教你跟給你方向。
因為我也辦不到這件事。(辦的到我就發了)

froce iT邦大師 1 級 ‧ 2021-06-18 11:53:37 檢舉

有個東西叫 setInterval,另外有個技術叫 websocket。
如果我是卷商,我要push我也不可能讓你任意連接,流量不用錢?
你想要的你該去問卷商,有沒有提供該服務。

0
japhenchen
iT邦超人 1 級 ‧ 2021-06-18 10:00:03

那家銀行或線上交易公司是你開的?
不然你如何要求他push資料到你這?
你有公網IP可以讓他push?
還是你有辦法去他們公司的電腦裡埋木馬?

看更多先前的回應...收起先前的回應...

其實很多線上交易都有開放EXCEL安裝他們寫好的DDE做看盤工具,而不是真的沒有request..只是這類request是不會被封的,應該都有登入取得權限

我只是很好奇為何看盤網頁的價格可以一直浮動?是否代表對方server 是有持續push資料過來的?
如果對方server 有push 及時價格過來,我何必再次向對方request 我所需要的資料?

所以你對網路、程式不了解,就不要用自已的解讀方式了。
你真的確定是SERVER PUSH過來的嘛??(連PUSH名詞都出現了)
要SERVER能自動回傳。目前能想到的就是SOCK機制。

那你知道要跑SOCK機制,也是需要先透過驗証後,才能與SERVER端連線嘛?

你總不可能對別人家說,我要接你家的網路用用,人家就會給你用吧。

DDE只取得某支股票的即時資料,資料量不大,更新時間也不會太短,5分鐘更新一次即可

而電子交易,差0.5秒,損失就是好幾%

對吧?

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-06-18 13:16:11

我最近在寫一個自動交易股票的機器人,想當然需要抓趨勢圖中現在的股價

如果你是認真
你可以找證券商提供的 API
既不會被擋 IP,資料也又快又準確
不用自己從 Browser 端搞東搞西

如果你只是「寫個爬即時股價的爬蟲程式」
那就算我沒說

如果你還是堅心想知道實作技術
我看了一下 investing.com
確認是用websocket的方式達到即時呈現資料的效果
說明如下:
1.向 socket server 登記
https://ithelp.ithome.com.tw/upload/images/20210618/20001787yFmeNMn37t.png
2.socket server 名稱
https://ithelp.ithome.com.tw/upload/images/20210618/20001787bQbXlLrZHn.png
3.連上 investing.com 後,持續收到 TCP 封包
https://ithelp.ithome.com.tw/upload/images/20210618/200017878HUtNDfJwe.png

0
huahualiu
iT邦新手 2 級 ‧ 2021-06-18 17:01:25

如果需要抓取國內的股票資訊
我會選用永豐金開發的 python API 來抓及時資料 (他也是用 Websocket 開監聽)

如果需要抓取國外(美股)的相關資訊
我可能會買 XQ 的美股模組,輸出成 DDE 到 Excel
再自己寫程式去讀 Excel 的即時資料

這樣這種需要長時間開著程式的問題,只要有一台 24hr 開著的雲端主機就能解決

如果透過爬蟲來抓及時資料,個人認為費時費力
中間會有很多層面的問題導致你資料輸出的不穩定
例如:他網站只要改版、心血來潮擋一下爬蟲,或者瀏覽器升級導致程式不支援,你資料基本上就會斷掉,這對交易來說風險太大,報價源穩定,後面才好談交易

目前自己研究下來,會認為爬蟲僅適合抓取更新頻率沒那麼高的資料 (ex.經濟數據、盤後籌碼等)
要 real-time 的資料,還是要走專門的 API 協定做監聽才比較保險

0
JC
iT邦新手 3 級 ‧ 2021-06-19 23:31:06

同樓上,想要取得 Real-Time 的報價源的話建議可以串接台股的 "報價 API" 通常券商會有簡單的免費版API可以串,有些資料源則要付費

WebSocket 你可以研究一下

我要發表回答

立即登入回答