博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Python抓取全站中的404错误
阅读量:5873 次
发布时间:2019-06-19

本文共 2660 字,大约阅读时间需要 8 分钟。

hot3.png

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

参考原文:

作者:

翻译: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://my.oschina.net/yushulx/blog/488752

你可能感兴趣的文章
20151217jqueryUI--自动补全工具
查看>>
链接脚本与重定位
查看>>
Hibernate 框架基本知识
查看>>
keystone nova v2 python
查看>>
VMware虚拟机Bridged(桥接模式)
查看>>
hdu4747 线段树区间修改值,区间查询和及最大值即最大值位置
查看>>
Python 字符串、列表、字典 操作方法大全 & 正则re
查看>>
Vue.js 介绍及其脚手架工具搭建
查看>>
Register code
查看>>
oracle基础入门(二)
查看>>
java 基础知识-数组的7种算法(排序、求和、最值、遍历...)
查看>>
倒要看看你有啥本事
查看>>
bzu-java(三)
查看>>
【初体验】valgrind分析程序性能
查看>>
testlink(以及服务器)问题定位思路
查看>>
Liferay Portal使用MySQL数据库配置
查看>>
个人代码库の模拟QQ振屏功能
查看>>
51Nod:1268 和为K的组合
查看>>
计科1501韩猛实验8
查看>>
课堂练习 组合数据练习
查看>>