用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

时间: 2024-12-07 18:15:05

用Python抓取全站中的404错误的相关文章

浅谈如何使用python抓取网页中的动态数据

我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到浏览器后动态生成的,而之前并没有的. 在编写爬虫进行网页数据抓取的时候,经常会遇到这种需要动态加载数据的HTML网页,如果还是直接从网页上抓取那么将无法获得任何数据. 今天,我们就在这里简单聊一聊如何用python来抓取页面中的JS动态加载的数据. 给出一个网页:豆瓣电影排行榜,其中的所有电影信息都

Python抓取网页中的图片到本地

今天在网上找了个从网页中通过图片URL,抓取图片并保存到本地的例子: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # Author: xixihuang 5 # Date : 2016/08/28 10:12 AM 6 # Desc: 抓取网页,获取图片URL,抓取图片内容并保存到本地. 7 8 import os 9 import uuid 10 import urllib2 11 import cookielib 12 '''获取

运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中

原文地址:运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中 依赖包: 1.jieba 2.pymongo 3.HTMLParser # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ from HTMLParser import HTMLParser import re import time from datetime import date im

运用python抓取博客园首页的全部数据,并且定时持续抓取新发布的内容存入mongodb中

原文地址:运用python抓取博客园首页的全部数据,并且定时持续抓取新发布的内容存入mongodb中 依赖包: 1.jieba 2.pymongo 3.HTMLParser # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ from HTMLParser import HTMLParser import re import time from datetime import date im

python抓取伯乐在线的所有文章,对标题分词后存入mongodb中

依赖包: 1.pymongo 2.jieba # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ from HTMLParser import HTMLParser import urllib2 import sys import pymongo import time import jieba import traceback default_encoding = 'utf-8' if s

使用 Python 抓取欧洲足球联赛数据

Web Scraping 在大数据时代,一切都要用数据来说话,大数据处理的过程一般需要经过以下的几个步骤 数据的采集和获取 数据的清洗,抽取,变形和装载 数据的分析,探索和预测 数据的展现 其中首先要做的就是获取数据,并提炼出有效地数据,为下一步的分析做好准备. 数据的来源多种多样,以为我本身是足球爱好者,而世界杯就要来了,所以我就想提取欧洲联赛的数据来做一个分析.许多的网站都提供了详细的足球数据,例如: 网易 http://goal.sports.163.com/ 腾讯体育 http://so

Python抓取需要cookie的网页

Python抓取需要cookie的网页 在仿照<Python小练习:可视化人人好友关系>一文时,需要登录模拟登录人人网.然而自从CSDN事件之后,人人网开始使用加密方式处理登录名和密码,直接使用post方式已经无法登陆人人网.这时,从豆瓣讨论中找到了解决方法: 1. 首先使用浏览器登陆人人,然后找到浏览器中关于登陆的Cookie: 2. 将Cookie记录下来,在Python中使用cookie模块模拟浏览器的行为: 3. 取得并解析数据. 1. HTTP协议与Cookie 抓取网页的过程跟浏览

Python抓取网页&amp;批量下载文件方法初探(正则表达式+BeautifulSoup) (转)

Python抓取网页&批量下载文件方法初探(正则表达式+BeautifulSoup) 最近两周都在学习Python抓取网页方法,任务是批量下载网站上的文件.对于一个刚刚入门python的人来说,在很多细节上都有需要注意的地方,以下就分享一下我在初学python过程中遇到的问题及解决方法. 一.用Python抓取网页 基本方法: [python] view plaincopyprint? import urllib2,urllib url = 'http://www.baidu.com' req 

抓取scrapy中文文档 第一个Scrapy项目实现

使用Scrapy这个python的网络爬虫框架抓取Scrapy中文文档 开发第一步:新建项目scrapy startproject myfirst 目录结构: myfirst │ scrapy.cfg Scrapy项目配置文件 │ └─myfirst Scrapy项目代码存放目录 │ items.py 存储从抓取的网页中需要保存的数据,再其中指定要存储的域 │ pipelines.py 管道文件,用于存储从抓取的网页中解析出的其他页面的url,相当于任务队列 │ settings.py 爬虫配置