follow "finlab"學習如何抓取資料後,到了第三篇的抓取"綜合損益表",怎麼搞都沒有資料

發現可以用Chrome的"檢查",來探詢我們需要的資訊

一般來說有兩種不同的資料傳遞方式

Get的資料傳遞方式:

使用get的網頁,可以發現在網址內可以看出傳遞的參數

例如

https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20190908&stockNo=0050&_=1567946426100

你會發現

date 時間是 "20190908"

stockNo查詢的股票代碼是"0050"

response=json 是資料格式

image

Post的資料傳遞方式:

最明顯的方法可以從網址上發現,使用post的網頁,就無法從網址看出來

得利用工具Chrome 按右鍵的"檢查",來找出傳給網頁的參數是什麼

20190908-02.jpg

原因是這種Post的資料傳遞方式,是用來判斷是否為爬從機器人來抓取資料,也因此只要在Python程式碼中加入這項資訊,便可以騙過伺服器,也許今天可以,明天該伺服器判斷的方式又被升級而不同。

我們在python的程式裏頭,得先將所需的資訊,放在payload 將"Form Data" 寫進去,還要再將我們自己瀏覽器的資訊給放進header內,這樣才能騙過伺服器,問到我們想要的資料。

如同以下的程式,爬蟲需要幾個model:(2021/06/06 update)

  • request:用來擷取網頁資訊,但是他常常也會將整個html裏頭的資訊也一併帶回來,這些資訊得先處理過,才能真正只擷取我們需要的資訊。
  • BeautifulSoup:用來將爬來的資訊整理成pandas dataframe,以利後續的分析


import pandas as pd
from bs4 import BeautifulSoup
import requests

payload={
        'encodeURIComponent':1,
        'step':1,
        'firstin':1,
        'off':1,
        'isQuery':'Y',
        'TYPEK':'sii',
        'year':'110', #想要結果的財報年
        'season':'01', #哪一季
        }
headers = {'Host': 'mops.twse.com.tw','User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
url = 'https://mops.twse.com.tw/mops/web/t163sb04'
list_req = requests.post(url, data=payload ,headers=headers)
soup = BeautifulSoup(list_req.content, "html.parser")
stockbroad1=soup.find_all('table', {'class': 'hasBorder'})
dfs=pd.read_html(str(stockbroad1),header=0)
 

程式的資料輸出到dfs內,就樣就爬到我們想要的資料了

Reference

  1. https://www.finlab.tw/Python-財報爬蟲-1-綜合損益表/  --> 大致上都對,但是抓不到資料
  2. https://www.youtube.com/watch?v=Ef0kh6NPiBE  --> 教導 request.post的眉角
  3. https://www.diffen.com/difference/GET-vs-POST-HTTP-Requests  --> 解釋什麼是 get vs request

回到目錄

arrow
arrow

    Cheng yichung 發表在 痞客邦 留言(0) 人氣()