如何使用urllib下载整个网站?

5

我需要使用Python的urllib下载整个网站,就像这样:

import urllib

site = urllib.urlopen('http://www.mathrubumi.com/index.php')
site_data = site.read()

它只下载第一页,也就是index.php。我该如何使代码下载整个网站? 通过循环吗? 还是有其他方法? 例如在wget中,代码不需要循环。
wget \ --recursive \--no-clobber \ --page-requisites \ --html-extension \  --convert-links \
     --restrict-file-names=windows \ --domains website.org \    --no-parent \    www.website.org/tutorials/html/

1
如果你所说的“整个网站”包括图片、样式表等,甚至是同一域名下的所有其他页面,那么你应该扫描页面上链接到这些元素的链接,并进行递归下载。 - tobias_k
@tobias_k 我需要网站中的所有页面。就像当我尝试使用wget获取时。 - user2085779
可能是重复的问题:编写一个递归地遍历页面链接的Python脚本 - Torxed
@karu 是的,但是你最初的问题与wget无关,你问的是在Python中是否可能(特别是使用urllib),但是它不可能。然而,例如BeautifulSoup具有此功能,就像wget、scrapy和其他一些工具一样。但是urllib没有,我给你提供的重复链接展示了如何在BeautifulSoup中实现它(顺便说一下,我讨厌那个名字,太长了):P - Torxed
@Torxed。是的,你说得对。我知道可以用Python执行wget。但是我需要另一个。 - user2085779
显示剩余2条评论
3个回答

7
如果你想使用urllib下载一个完整的网站,你需要解析每个页面,找到所有链接并下载它们。这是可行的,但很难做到正确。我建议你要么研究一下scrapy,如果你想要一个纯Python解决方案,要么只需从你的脚本中调用wget即可。

但是您能否编写一个Scrapy代码来实现这个功能呢? - FabioSpaghetti

1

由于用户(在另一个问题中提出的但因为某些原因已删除)指出可以使用BeautifulSoup作为替代方案,这里提供一个可行的示例来检索所有<a href="something.html">something</a>链接并将它们保存在本地:

import urllib2
from BeautifulSoup import BeautifulSoup, SoupStrainer
from os.path import basename

def store_links(page):
    with open(basename(page), 'wb') as fh:
        site = urllib.urlopen(page)
        site_data = site.read()

        fh.write(site_data)

        for link in BeautifulSoup(site_data, parseOnlyThese=SoupStrainer('a')):
            if link.has_attr('href'):
                store_links(link['href'])

store_links('http://www.nytimes.com')

注意:尚未测试,目前在一个受限机器上,因此可能会出现语法错误,但思路是相同的:

  1. 创建一个递归函数,每当它找到一个链接时就调用自身
  2. 给这个递归函数一个起点,让它自由运行

呵呵,今晚我可以更正它们(一旦我再次回到我的私人电脑上,那里我碰巧有BeautifulSoup..这是由我的脑海编译器写出的): P - Torxed
代码到底有什么问题呢?完全没有反应吗? :) 如前所述,稍后可以修复小错误,尝试调整一下,因为这是一个99%的工作概念,只是可能存在一些小故障。 - Torxed
@DanielHepper 我也考虑过这个,但没写代码,只是为了证明概念而保持“简单”,并没有为karu做全部工作,但发帖后我突然想到了 :) - Torxed
@Torxed 这不是一款简单的游戏。这就像创建新的wget一样。 - user2085779
显示剩余4条评论

0
  1. 如果您没有使用urlencode方法,那么您可以使用urllib2,它允许您设置标头和UA。或者您可以使用支持更多API的requests。请在此处查看文档
  2. 要使用urllib下载整个网站,该网站必须启用目录列表,大多数网站所有者将通过在.htaccess中进行设置来禁止此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接