链接是SEO的一个重要因素。为了在搜索引擎中获取更好的排名,一定要定期检查下网站中的链接是否依然有效。特别是由于一些巨大的改动可能会导致坏链接的出现。要检测这些站内的链接问题,可以通过一些在线的工具。比如Google Analytics,Bing Webmaster Tools,brokenlinkcheck.com等。尽管有现成的工具,我们也可以自己来编写一个。使用Python会非常容易。
参考原文:
作者:
翻译: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
源码