標籤:
連結是SEO的一個重要因素。為了在搜尋引擎中擷取更好的排名,一定要定期檢查下網站中的連結是否依然有效。特別是由於一些巨大的改動可能會導致壞連結的出現。要檢測這些站內的連結問題,可以通過一些線上的工具。比如Google Analytics,Bing Webmaster Tools,brokenlinkcheck.com等。儘管有現成的工具,我們也可以自己來編寫一個。使用Python會非常容易。
參考原文:How to Check Broken Links with 404 Error in Python
Xiao Ling
翻譯:yushulx
如何檢查網站404錯誤
為了讓網站更好的被搜尋引擎抓取,一般的網站都會有一個sitemap.xml。所以基本步驟是:
讀取sitemap.xml,擷取所有的站內連結。
從每個連結中再讀取所有的連結,可能包含inbound link或者outbound link。
檢查所有連結的狀態。
軟體安裝
使用BeautifulSoup庫來分析網頁元素會非常方便:
pip install beautifulsoup4
如何使用Python抓取網頁
因為程式啟動並執行時間可能會很長,要隨時打斷的話,需要注入鍵盤事件:
def ctrl_c(signum, frame): global shutdown_event shutdown_event.set() raise SystemExit(‘\nCancelling...‘) global shutdown_eventshutdown_event = threading.Event()signal.signal(signal.SIGINT, ctrl_c)
使用BeautifulSoup來分析sitemap.xml:
pages = []try: request = build_request("http://kb.dynamsoft.com/sitemap.xml") f = urlopen(request, timeout=3) xml = f.read() soup = BeautifulSoup(xml) urlTags = soup.find_all("url") print "The number of url tags in sitemap: ", str(len(urlTags)) for sitemap in urlTags: link = sitemap.findNext("loc").text pages.append(link) f.close()except HTTPError, URLError: print URLError.code return pages
分析HTML元素擷取所有連結:
def queryLinks(self, result): links = [] content = ‘‘.join(result) soup = BeautifulSoup(content) elements = soup.select(‘a‘) for element in elements: if shutdown_event.isSet(): return GAME_OVER try: link = element.get(‘href‘) if link.startswith(‘http‘): links.append(link) except: print ‘href error!!!‘ continue return links def readHref(self, url): result = [] try: request = build_request(url) f = urlopen(request, timeout=3) while 1 and not shutdown_event.isSet(): tmp = f.read(10240) if len(tmp) == 0: break else: result.append(tmp) f.close() except HTTPError, URLError: print URLError.code if shutdown_event.isSet(): return GAME_OVER return self.queryLinks(result)
檢查link的response傳回值:
def crawlLinks(self, links, file=None): for link in links: if shutdown_event.isSet(): return GAME_OVER status_code = 0 try: request = build_request(link) f = urlopen(request) status_code = f.code f.close() except HTTPError, URLError: status_code = URLError.code if status_code == 404: if file != None: file.write(link + ‘\n‘) print str(status_code), ‘:‘, link return GAME_OVER
源碼
https://github.com/yushulx/crawl-404
用Python抓取全站中的404錯誤