2016-03-18 81 views
0

我正在使用Python 3.4構建一個斷開的鏈接檢查器,以幫助確保我管理的大量文章的質量。最初,我使用GET請求來檢查鏈接是否可行,但是我試圖在ping我檢查的URL時儘可能地好,所以我都確保我不檢查被測試爲更有效的URL比一次,我已經試圖做正題。Broken Link Checker失敗Head Request

但是,我發現一個網站,導致這只是停止。它既不拋出一個錯誤,也沒有打開:

https://www.icann.org/resources/pages/policy-2012-03-07-en

鏈接本身是功能齊全。所以理想情況下,我想找到一種處理類似鏈接的方法。此代碼在Python 3.4將重現該問題:

import urllib 
import urllib.request 

URL = 'https://www.icann.org/resources/pages/policy-2012-03-07-en' 
req=urllib.request.Request(URL, None, {'User-Agent': 'Mozilla/5.0 (X11; Linux i686; G518Rco3Yp0uLV40Lcc9hAzC1BOROTJADjicLjOmlr4=) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3','Accept-Encoding': 'gzip, deflate, sdch','Accept-Language': 'en-US,en;q=0.8','Connection': 'keep-alive'}, method='HEAD')>>> from http.cookiejar import CookieJar 
cj = CookieJar() 
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) 
response = opener.open(req) 

,因爲它不拋出一個錯誤,我真的不知道如何進一步解決此超出縮小下來到停止整個檢查程序的鏈接。我如何檢查這個鏈接是否有效?

+0

你認爲什麼是斷鏈?錯誤404? –

+0

404,502,504,403,超時錯誤...基本上任何響應代碼都超過200.如果我可以確定如果在瀏覽器中訪問頁面,將會加載頁面,這就是我需要的。我不能指望它以任何其他方式理解鏈接是正確的。 –

+0

如果有幫助,任何對「https:// www.icann.org /」的請求都會掛起......奇怪的 –

回答

0
From bs4 import BeautifulSoup,SoupStrainer  
import urllib2  
import requests  
import re  
import certifi  
import ssl  
ssl._create_default_https_context = ssl._create_unverified_context 

def getStatus(url): 
    a=requests.get(url,verify=False) 
    report = str(a.status_code) 
    return report 


alllinks=[] 
passlinks=[] 
faillinks=[] 
html_page = urllib2.urlopen("https://link") 

soup = BeautifulSoup(html_page,"html.parser") 
for link in soup.findAll('a', attrs={'href': re.compile("^http*")}): 
    #print link.get('href') 
    status = getStatus(link.get('href')) 
    #print ('URL---->',link.get('href'),'Status---->',status) 
    link='URL---->',link.get('href'),'Status---->',status 
    alllinks.append(link) 

    if status == '200': 
     passlinks.append(link) 
    else: 
     faillinks.append(link) 


print alllinks 
print passlinks 
print faillinks