通过网站地图爬取目标站点的所有网页

使用的系统:Windows 10 64位

Python 语言版本:Python 2.7.10 V

使用的编程 Python 的集成开发环境:PyCharm 2016 04

我使用的 urllib 的版本:urllib2

注意: 我没这里使用的是 Python2 ,而不是Python3


一 . 前言

通过前两节(爬取一个网页 的网络爬虫解决爬取到的网页显示时乱码问题),我们终于完成了最终的 download() 函数。

这一节 和我未来的两节,我一个介绍 3种方法来爬取一个站点里面所有的网页。

这一篇博客,就来介绍第一种方法:使用目标网站的网站地图文件Sitemap.xml)来爬取 目标站点里面的所有的网页。


二 . 原理

之前,我们在目标网站的 robots.txt 文件中发现了网站地图(Sitemap.xml 文件),网站地图中包含了这个站点里面所有网页的URL。想要下载目标网站里面的所有网页,我们可以通过一个简单的正则表达式来解析网站地图(Sitemap.xml 文件)。如何解析?很简单,只需要从<loc>标签中提取出 URL 即可,就是这点工作。

在以后的博客中,我还会介绍一种更加健壮的解析方法 — CCS选择器


三 . 代码

import re

def crawl_sitemap(url):
# download the sitemap file
sitemap = download(url)
# extract the sitemap links
links = re.findall('<loc>(.*?)</loc>', sitemap)
# download each link
for link in links:
# scrape html here
# ...
html = download(link)

其中,代码中使用的 download(url) 函数的代码在 这一篇博客的最下面。

四 . 解释代码

需要解释的就是下面这句 使用正则表达式来解析 Sitemap文件里面的 URL

    links = re.findall('<loc>(.*?)</loc>', sitemap)

findall() 函数是找到所有符合条件的Str字符串。<loc>(.*?)</loc>指的是:(.*?) 意思是:匹配所有<loc>(xxxx)</loc> 这样字符串,并将括号内的数据作为结果返回。

详细的内容,请见下面的两个博客:

Python 正则表达式 总结

Python 正则表达式 — findall()方法


五 . 运行

先将 Python 终端交互程序启动:(在 PyCharm 软件 中的 Terminal 窗口里,或者在Windows 系统的DOS窗口。)

> C:\Python27\python.exe -i 1-4-2-sitema
p_scrape.py

现在运行网站地图爬虫,从目标网站(http://example.webscraping.com/sitemap.xml)中下载所有网页。

>>> crawl_sitemap('http://example.webscraping.com/sitemap.xml')
Downloading: http://example.webscraping.com/sitemap.xml
Downloading: http://example.webscraping.com/view/Afghanistan-1
Downloading: http://example.webscraping.com/view/Aland-Islands-2
Downloading: http://example.webscraping.com/view/Albania-3
Downloading: http://example.webscraping.com/view/Algeria-4
...


总结:

可以看到,程序运行的效果和我们的预期一致。

但是不是每个站点都可以依靠Sitemap文件来爬取站点中的每个网页。有些站点可能根本就没有 Sitemap文件。

所以我们下一节在介绍一种方法,它不会依赖Sitemap文件,是使用索引号的方法来爬取一个站点中所有的网页的。

Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页的更多相关文章

  1. Python 网络爬虫 008 (编程) 通过ID索引号遍历目标网页里链接的所有网页

    通过 ID索引号 遍历目标网页里链接的所有网页 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyChar ...

  2. (转)Python网络爬虫实战:世纪佳缘爬取近6万条数据

    又是一年双十一了,不知道从什么时候开始,双十一从“光棍节”变成了“双十一购物狂欢节”,最后一个属于单身狗的节日也成功被攻陷,成为了情侣们送礼物秀恩爱的节日. 翻着安静到死寂的聊天列表,我忽然惊醒,不行 ...

  3. Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码

    通过 正则表达式 来获取一个网页中的所有的 URL链接,并下载这些 URL链接 的源代码 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 ...

  4. Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页

    爬取目标站点里所有的网页 使用的系统:Windows 10 64位 Python语言版本:Python 3.5.0 V 使用的编程Python的集成开发环境:PyCharm 2016 04 一 . 首 ...

  5. Python 网络爬虫 006 (编程) 解决下载(或叫:爬取)到的网页乱码问题

    解决下载(或叫:爬取)到的网页乱码问题 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 20 ...

  6. Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫

    如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:P ...

  7. 一篇文章带你用Python网络爬虫实现网易云音乐歌词抓取

    前几天小编给大家分享了数据可视化分析,在文尾提及了网易云音乐歌词爬取,今天小编给大家分享网易云音乐歌词爬取方法. 本文的总体思路如下: 找到正确的URL,获取源码: 利用bs4解析源码,获取歌曲名和歌 ...

  8. 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)

    原文地址http://blog.csdn.net/qy20115549/article/details/52203722 本文为原创博客,仅供技术学习使用.未经允许,禁止将其复制下来上传到百度文库等平 ...

  9. ASP.NET网络爬虫小研究 HtmlAgilityPack基础,爬取数据保存在数据库中再显示再自己的网页中

    1.什么是网络爬虫 关于爬虫百度百科这样定义的:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些 ...

随机推荐

  1. 01-THREE.JS 第一个场景

    THREE.JS第一个场景 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  2. 如何下载中文语言包让Eclipse汉化?

    Eclipse软件是JAVA开发必备的软件,对于英语不好的人而言面对英文代码还好,但是软件也是英语的那就头疼了,怎么解决?可以去官网下载中文语言包解压到Eclipse安装目录就可以汉化了.   工具/ ...

  3. 原生MapReduce开发样例

    一.需求 data: 将相同名字合并为一个,并计算出平均数 tom 小明 jerry 2哈 tom tom 小明 二.编码 1.导入jar包 2.编码 2.1Map编写 package com.wzy ...

  4. hdu4442 Physical Examination(贪心)

    这种样式的最优解问题一看就是贪心.如果一下不好看,那么可以按照由特殊到一般的思维方式,先看n==2时怎么选顺序(这种由特殊到一般的思维方式是思考很多问题的入口): 有两个队时,若先选第一个,则ans= ...

  5. Codeforces Round #263 (Div. 2)C(贪心,联想到huffman算法)

    数学家伯利亚在<怎样解题>里说过的解题步骤第二步就是迅速想到与该题有关的原型题.(积累的重要性!) 对于这道题,可以发现其实和huffman算法的思想很相似(可能出题人就是照着改编的).当 ...

  6. HDFS常用的Java Api详解

    转自:http://blog.csdn.net/michaelwubo/article/details/50879832 一.使用Hadoop URL读取数据 package hadoop; impo ...

  7. Rebranding(字母代换)

    个人心得:题目意思就是每次给出可以互换的字母,如果每次命令的时候就执行的话一定会超时. 所以我就是将输入的字母从a到z的数目和路径依次保存,再建立一个book数组表示字母现在所指的字母 ,一开始就直接 ...

  8. 2017.10.7北京清北综合强化班DAY7

    1.计数 (count.cpp/c/pas) 时间限制:1s 内存限制:256MB [问题描述] 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍 ...

  9. redis 双写一致性问题

    首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作. 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者 ...

  10. js中的点击事件(click)的实现方式

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...