本範例介紹如何使用Python 3及Requests函式庫來抓取網頁資料。
本範例為Windows 7 64 bit作業系統。
接著在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()
的意思是使用requests
的session()
函式建立一個requests.Session
物件s
,
此物件能用get()
及
post()
發送帶cookies的請求。
s.post('https://www.ptt.cc/ask/over18', data = {'from': '/bbs/Beauty/index.html', 'yes': 'yes'})
的意思是使用
requests.Session
的post()
以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-HTML,PTTLibrary等套件來爬PTT的資料。
沒有留言:
張貼留言