用Python抓取全站中的404錯誤

來源:互聯網
上載者:User

標籤:

連結是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_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錯誤

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.