用Python抓取全站中的404错误

链接是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。所以基本步骤是:

  1. 读取sitemap.xml,获取所有的站内链接。

  2. 从每个链接中再读取所有的链接,可能包含inbound link或者outbound link。

  3. 检查所有链接的状态。

软件安装

使用BeautifulSoup库来分析网页元素会非常方便:

pip install beautifulsoup4

如何使用Python抓取网页

因为程序运行的时间可能会很长,要随时打断的话,需要注入键盘事件:

def ctrl_c(signum, frame):
    global shutdown_event
    shutdown_event.set()
    raise SystemExit('\nCancelling...')
 
global shutdown_event
shutdown_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,seo)