zoukankan      html  css  js  c++  java
  • Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页

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

    使用的系统: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:Python27python.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文件,是使用索引号的方法来爬取一个站点中所有的网页的。

  • 相关阅读:
    Mysql关键字冲突的解决方案
    js日期时间函数
    Mysql字符串字段中是否包含某个字符串,用 find_in_set
    mysql中 where in 用法
    Best of Best系列(4)——AAAI
    Best of Best系列(5)——IJCAI
    Best of Best系列(3)——ICML
    Best of Best系列(6)——SIGIR
    Best of Best系列(2)——ICCV
    Best of Best系列(1)——CVPR
  • 原文地址:https://www.cnblogs.com/aobosir/p/5928542.html
Copyright © 2011-2022 走看看