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/
4

3 回答 3

7

如果你想用 下载一个完整的网站urllib,你必须解析每个页面,找到所有链接并下载它们。这是可行的,但要做到正确可能会很棘手。

如果你想要一个纯 python 解决方案,或者只是从你的脚本中调用,我建议你要么研究scrapy 。wget

于 2013-10-16T08:54:26.433 回答
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. 给那个递归函数一个起点,让它发疯
于 2013-10-16T10:00:08.230 回答
0
  1. 如果您不使用 urlencode 方法,那么您可以使用 urllib2,它允许您设置标头和 UA。或者您可以使用支持更多 API 的请求。在此处查看文档
  2. 要使用 urllib 下载整个网站,网站必须启用目录列表,大多数网站所有者不会通过在 .htaccess 中设置来允许。
于 2013-10-16T09:05:59.393 回答