解決 Python 指令碼無法生成結果的問題

华科云商小雪發表於2024-03-07

我們在python程式設計時,始終無法生成想要的成果,其實問題並非單一的,可能有多種情況導致的結果;例如: 語法錯誤 執行時錯誤 依賴項問題 許可權問題 死鎖或阻塞 等問題,下面我將舉例說明遇到這些問題該如何解決!

1、問題背景

一位開發者編寫了一個 Python 指令碼,旨在從一個網站“”中抓取資料。該網站允許使用者透過輸入郵政編碼和距離來搜尋附近的診所。當使用者手動輸入郵政編碼和距離後,網站會顯示相關搜尋結果。然而,當開發者使用指令碼嘗試執行相同的操作時,指令碼並沒有返回任何結果,也沒有丟擲任何錯誤。

2、解決方案

為了解決這個問題,開發者需要檢查指令碼中的以下幾個方面:
  1. 檢查請求頭 :在指令碼中,開發者使用 requests 模組來傳送 HTTP 請求。需要注意的是,某些網站可能會對請求頭做出限制,因此需要確保指令碼中使用的請求頭是正確的。可以嘗試新增以下請求頭:


headers 
= {

"User-Agent": "Mozilla/5.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Connection": "keep-alive"
}
  1. 檢查代理 :如果開發者所在的網路環境存在一些限制,可能會導致指令碼無法訪問目標網站。可以嘗試使用代理來繞過這些限制。在指令碼中,可以新增以下程式碼來使用代理:


proxy 
= {
"http": 
", 
"https": 
"}

session = requests. Session()
response = session. post( link, data = payload, headers = headers, proxies = proxy)
  1. 檢查驗證碼 :某些網站會使用驗證碼來防止爬蟲抓取資料。如果目標網站使用了驗證碼,則需要在指令碼中處理驗證碼。可以嘗試使用驗證碼識別庫,例如 pytesseract EasyOCR ,來識別驗證碼。

  2. 檢查延遲 :為了避免被網站檢測為爬蟲,可以嘗試在指令碼中新增延遲。在傳送請求之前,可以新增以下程式碼來引入延遲:


import 
time

time. sleep( 2)
  1. 檢查網站結構 :如果以上方法都不奏效,則需要檢查網站的結構是否存在變化。網站可能會對結構進行調整,導致指令碼無法正確解析資料。在這種情況下,需要修改指令碼以適應網站結構的變化。

程式碼示例

以下是一段完整的指令碼,可以用於抓取目標網站的資料:


import 
requests

from bs4 import BeautifulSoup

url = ''

payload = {
'zip': '66109',
'strdistance': '10000',
'SelectedState': 'Select State or Region'
}

headers = {
"User-Agent": "Mozilla/5.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
"Connection": "keep-alive"
}

def get_clinics( link):
session = requests. Session()

# 新增延遲
import time
time. sleep( 2)

response = session. post( link, data = payload, headers = headers)
soup = BeautifulSoup( response. text, "lxml")
item = soup. select_one( ".clinics__search-meta"). text
print( item)

if __name__ == '__main__':
get_clinics( url)

透過對指令碼進行以上修改,開發者可以解決網站搜尋結果抓取失敗的問題,併成功地獲取到所需的資料。

如果大家能提供更多的指令碼的資訊,例如指令碼的內容、執行環境等,我可以幫助大家更詳細地分析問題並給出解決建議。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3008301/,如需轉載,請註明出處,否則將追究法律責任。

相關文章