網頁

2019/8/24

Python 使用 Requests 套件抓取 PTT 網頁資料

本範例介紹如何使用Python 3及Requests函式庫來抓取網頁資料。


本範例為Windows 7 64 bit作業系統。

先在電腦安裝好Python 3套件管理工具pip

接著在cmd命令視窗輸入python -m pip install requests安裝抓取網頁需要的Requests套件。執行後出現如下內容代表安裝完成。

C:\Users\matt>python -m pip install requests
Collecting requests
  Downloading https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89
d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl (57kB)
     |████████████████████████████████| 61kB 563kB/s
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests)
  Downloading https://files.pythonhosted.org/packages/e6/60/247f23a7121ae632d62811ba7f273d0e58972d75
e58a94d329d51550a47d/urllib3-1.25.3-py2.py3-none-any.whl (150kB)
     |████████████████████████████████| 153kB 1.3MB/s
Collecting certifi>=2017.4.17 (from requests)
  Downloading https://files.pythonhosted.org/packages/69/1b/b853c7a9d4f6a6d00749e94eb6f3a041e342a885
b87340b79c1ef73e3a78/certifi-2019.6.16-py2.py3-none-any.whl (157kB)
     |████████████████████████████████| 163kB 1.6MB/s
Collecting idna<2.9,>=2.5 (from requests)
  Downloading https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e
7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl (58kB)
     |████████████████████████████████| 61kB 3.8MB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec751
0b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
     |████████████████████████████████| 143kB 2.2MB/s
Installing collected packages: urllib3, certifi, idna, chardet, requests
  WARNING: The script chardetect.exe is installed in 'C:\Users\matt\AppData\Local\Programs\Python\Py
thon37\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-s
cript-location.
Successfully installed certifi-2019.6.16 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.3

然後打開程式編輯器(本範例使用Visual Studio Code)建立一支get-html.py,並輸入以下內容。

以下程式抓取PTT表特版(Beauty)的文章列表頁面https://www.ptt.cc/bbs/Beauty/index.html

get-html.py

import requests

s = requests.session() #取得Request Session

#通過檢查是否超過18歲的頁面
s.post('https://www.ptt.cc/ask/over18', 
          data = {'from': '/bbs/Beauty/index.html', 'yes': 'yes'})

res = s.get('https://www.ptt.cc/bbs/Beauty/index.html') #取得HTML頁面
print(res.text) #印出取回的HTML內容

以下是每行程式的簡單說明。

import requests的意思是把剛安裝的Requests套件引入到此程式,下面才能用requests物件。

requests.session()的意思是使用requestssession()函式建立一個requests.Session物件s, 此物件能用get()post()發送帶cookies的請求。


s.post('https://www.ptt.cc/ask/over18', data = {'from': '/bbs/Beauty/index.html', 'yes': 'yes'})的意思是使用 requests.Sessionpost()HTTP POST方法傳送請求至https://www.ptt.cc/ask/over18並夾帶資料data

會需要這段的程式的原因是第一次進入PTT看板時,會先導向https://www.ptt.cc/ask/over18這個頁面詢問是否已滿18歲,當點選的時候,請求中會夾帶以下Form Data資料給PTT,然後才會導向原本要去的看版頁面https://www.ptt.cc/bbs/Beauty/index.html

{
    from: "/bbs/Beauty/index.html",
    yes: "yes"
}

在通過18歲驗證頁面並導向至原先要去的頁面後,打開Chrome開發人員工具,在[Network]標籤下即可觀察到以上動作。



當通過18歲驗證頁面後,PTT會存一份帶有over18=1的cookie在你的電腦,日後再次請求PTT頁面時會夾帶這cookie傳給PTT伺服器,所以就不用再次通過18歲頁面的驗證。

同樣地可以在Chrome的開發人員工具的[Application]標籤下的[Cookies]找到以上內容。



s.get('https://www.ptt.cc/bbs/Beauty/index.html')的意思是傳送請求給https://www.ptt.cc/bbs/Beauty/index.html並取得回應結果requests.Response物件res

最後使用print()在終端機印出requests.Response.text的內容。

C:\Users\matt>C:/Users/matt/AppData/Local/Programs/Python/Python37/python.exe d:/mypython/get-html.py

到此便完成了網頁的抓取,之後就可以用Beautiful Soup套件篩出要抓取的內容然後存到資料庫等。

此外也可以用更方便的Requests-HTMLPTTLibrary等套件來爬PTT的資料。


沒有留言:

張貼留言