近日使用python進(jìn)行網(wǎng)頁爬取時(shí),發(fā)現(xiàn)某些網(wǎng)頁無法打開的問題,搜索了一番后,總結(jié)了以下幾點(diǎn)可能原因和解決方案。
1. 網(wǎng)頁服務(wù)器禁止爬蟲訪問。為了防止爬蟲的攻擊,有些網(wǎng)站會(huì)設(shè)置robots.txt文件,明確告訴網(wǎng)絡(luò)爬蟲哪些網(wǎng)頁可以被爬取,哪些網(wǎng)頁不能被爬取。在使用python進(jìn)行網(wǎng)頁爬取時(shí),需要注意設(shè)置header,模仿用戶訪問,否則會(huì)被服務(wù)器認(rèn)為是爬蟲而拒絕。
# 設(shè)置header信息 headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} req = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(req)
2. 網(wǎng)頁內(nèi)容被加密。一些私密的網(wǎng)頁會(huì)采取加密方式,防止外部泄漏信息。在使用python訪問這樣的網(wǎng)頁時(shí),需要先解密后才能正常使用。具體的解密方式需要根據(jù)加密算法來選擇。
# 加密方式為:AES128-CBC-PKCS7 from Crypto.Cipher import AES def decrypt(text, key, iv): padding = AES.block_size - len(text) % AES.block_size text = text + padding * chr(padding) aes = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8')) plaintext = aes.decrypt(text.encode('utf-8')) plaintext = plaintext.decode('utf-8').rstrip(chr(padding)) return plaintext
3. 網(wǎng)頁存在驗(yàn)證碼。一些網(wǎng)站為了防止爬蟲惡意訪問,會(huì)設(shè)置驗(yàn)證碼機(jī)制,需要用戶手動(dòng)輸入驗(yàn)證碼才能進(jìn)入網(wǎng)站。在使用python進(jìn)行網(wǎng)頁爬取時(shí),需要通過其他方式獲取驗(yàn)證碼,再手動(dòng)輸入才能進(jìn)行訪問。
# 使用tesseract-OCR進(jìn)行驗(yàn)證碼識(shí)別 from PIL import Image import pytesseract # 圖片處理 img = Image.open('captcha.png') text = pytesseract.image_to_string(img)
以上是我總結(jié)的一些關(guān)于python無法打開網(wǎng)頁的常見原因和解決方案,希望對(duì)您有幫助。