损坏的 Link Checker 未能通过 Head 请求
Broken Link Checker Fails Head Requests
我正在使用 Python 3.4 构建一个损坏的 link 检查器,以帮助确保我管理的大量文章的质量。最初我使用 GET 请求来检查 link 是否可行,但是我在 ping 我正在检查的 URL 时尝试尽可能好,所以我都确保我不检查一个 URL 被测试为工作不止一次,我试图只做 head 请求。
但是,我发现了一个网站可以简单地停止此操作。它既不会引发错误,也不会打开:
https://www.icann.org/resources/pages/policy-2012-03-07-en
link 本身功能齐全。所以理想情况下,我想找到一种方法来处理类似的 links。 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)
因为它没有抛出错误,我真的不知道如何进一步排除故障,而不是将它缩小到停止整个检查器的 link。我如何检查此 link 是否有效?
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
我正在使用 Python 3.4 构建一个损坏的 link 检查器,以帮助确保我管理的大量文章的质量。最初我使用 GET 请求来检查 link 是否可行,但是我在 ping 我正在检查的 URL 时尝试尽可能好,所以我都确保我不检查一个 URL 被测试为工作不止一次,我试图只做 head 请求。
但是,我发现了一个网站可以简单地停止此操作。它既不会引发错误,也不会打开:
https://www.icann.org/resources/pages/policy-2012-03-07-en
link 本身功能齐全。所以理想情况下,我想找到一种方法来处理类似的 links。 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)
因为它没有抛出错误,我真的不知道如何进一步排除故障,而不是将它缩小到停止整个检查器的 link。我如何检查此 link 是否有效?
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