Mike的Python學院

HTTP協定、資料搜集、Python、網頁爬蟲、網頁資料擷取與分析 Python、HTTP、程式語言

Mike Ku

Learn Code With Mike品牌創辦人

2021/11/18

掌握這6個開發重點優化Python網頁爬蟲的效率與穩定度

Q:如何正確設定Python網頁爬蟲的HTTP Headers(標頭)?
由於現在很多人使用Python網頁爬蟲爬取所需的資料,因此,有些網站會針對網頁爬蟲進行偵測,當Python網頁爬蟲沒有設定HTTP Headers(標頭),很容易就會被擋下來。
所以,Python網頁爬蟲在發送請求時,最好要設定HTTP Headers(標頭),如下範例:
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=5)
如果不知道自己的User Agent(使用者代理),可以在Google搜尋的地方輸入「what is my user agnet」,按下搜尋即可得到。
Q:如何正確設定Python網頁爬蟲的設定HTTP Request timeout(超時)屬性?
Python網頁爬蟲在發送請求時,如果沒有設定timeout(超時)屬性,當目標網站沒有回應,請求將會持續嘗試和等待回應,除了造成目標網站的困擾,Python網頁爬蟲也無法繼續執行。如下範例:
headers = {
'user-agent': '...'
}
response = requests.get(url, headers=headers, timeout=5)
只要Python網頁爬蟲發送請求後,5秒內沒有接收回應,就會停止嘗試和等待。
Q:Python網頁爬蟲如何檢查HTTP Status Code(狀態碼)?
Python網頁爬蟲接收到網站的回應結果後,最好可以檢查HTTP Status Code(狀態碼)來確認是否正確,如下範例:
if response.status_code == 200: #正確
#接續執行
或是如下範例:
if response.status_code != 200: #不正確
return False
Q:Python網頁爬蟲如何檢查爬取的元素是否存在?
Python網頁爬蟲最普遍會遇到的問題,就是網頁的元素或樣式改變,導致整個網頁爬蟲中斷和發生錯誤。而最好的預防方法就是先檢查爬取的元素(Element)是否存在,再執行其它的任務,如下範例:
if title: #標題元素存在
#接續執行
else:
# 顯示警告訊息或發送訊息給管理人員
Q:Python網頁爬蟲的例外處理機制是什麼?
為了預防Python網頁爬蟲在執行的過程中,發生預期外的錯誤,以及後續能夠有效追蹤問題,最好實作例外處理機制,如下範例:
try:
# 爬蟲邏輯
...
titles = soup.find_all('h3', {'class': 'post_title'})
result = []
for title in titles:
if title:
result.append(title.getText())
else:
print('元素不存在')
else:
print('回應結果錯誤')
except Exception as e:
print("發生其它錯誤")
print(str(e))
Q:Python網頁爬蟲的檔案輸入/出(I/O)機制是什麼?
Python網頁爬蟲爬取到資料後,最常見的就是資料儲存,像是寫入資料庫、CSV或文字檔等,相較於在爬取的迴圈中進行讀、寫操作,會建議先將爬取的資料打包成串列(List)、元組(Tuple)或字典(Dictionary)等,爬取結束時再一次性寫入較有效率。如下範例:
try:
with open('post.txt', 'w') as file:
file.write('\n'.join(result)) #寫入爬取結果
except Exception as ex:
print(str(ex))
如果想要學習更多的Python應用教學,歡迎前往Learn Code With Mike( https://www.learncodewithmike.com/2021/11/6-tips-to-build-an-efficient-python-scraper.html )網站觀看更多精彩內容。
2 0 391 2