如何将外国网页例如gem5官方文档下载到本地?

问题描述

gem5(http://www.gem5.org/)的官方文档在中国始终不可访问。即使使用vpn,我也会发现我只能偶尔访问,而且每次都必须等待很长时间才能进入,并且经常会出现页面无法访问错误。因此,我想下载此文档。然后,我可以离线访问。我在Internet上找到了很多工具,但是它们只能下载国内网页。外国网页总是没有反应?由于这些工具不可用,我想使用python获取所有的Web链接,然后根据这些链接下载它们吗?我在互联网上使用了一段代码,但是当输出到国内网站的链接时,此代码是正常的,但是当使用gem5的官方文档链接时,再次出现没有响应的错误,这会让我发疯。我不确定在哪里问这些问题?有人可以告诉我该怎么办?

不仅gem5的官方文档还有很多我想下载的外国Web版本文档,以便我可以随时访问它们?有什么办法吗?我已将以前使用的代码上传到github(https://github.com/Yujie-Cui/bin/blob/master/getLink.py)?有人可以帮我看看如何修改吗?

# __author__ = 'Administrat
# coding=utf-8
from urllib.request import urlopen
from urllib.parse import urlparse
from bs4 import BeautifulSoup
import re
import datetime
import random
import io
import os
import sys
from urllib import request
from urllib.request import urlopen
import urllib

pages = set()
random.seed(datetime.datetime.Now())

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}


# 获取页面所有内链的列表
def getInternalLinks(bsObj,includeUrl):
    includeUrl = urlparse(includeUrl).scheme + "://" + urlparse(includeUrl).netloc
    internalLinks = []
    # 找出所有以“/”开头的链接
    for link in bsObj.findAll("a",href=re.compile("^(/|.*" + includeUrl + ")")):
       if link.attrs['href'] is not None:
          if link.attrs['href'] not in internalLinks:
             if (link.attrs['href'].startswith("/")):
                internalLinks.append(includeUrl + link.attrs['href'])
             else:
                internalLinks.append(link.attrs['href'])
    return internalLinks


# 获取页面所有外链的列表
def getExternalLinks(bsObj,excludeUrl):
    externalLinks = []
    # 找出所有以“http”或者“www”开头且不包含当前URL的链接
    for link in bsObj.findAll("a",href=re.compile("^(http|www)((?!" + excludeUrl + ").)*$")):
       if link.attrs['href'] is not None:
          if link.attrs['href'] not in externalLinks:
             externalLinks.append(link.attrs['href'])
    return externalLinks


def getRandomExternalLink(startingPage):
    req = request.Request(startingPage,headers=headers)
    html = urlopen(req)
    bsObj = BeautifulSoup(html.read(),"html.parser")
    externalLinks = getExternalLinks(bsObj,urlparse(startingPage).netloc)
    if len(externalLinks) == 0:
       print("没有外部链接,准备遍历整个网站")
       domain = urlparse(startingPage).scheme + "://" + urlparse(startingPage).netloc
       internalLinks = getInternalLinks(bsObj,domain)
       return getRandomExternalLink(internalLinks[random.randint(0,len(internalLinks) - 1)])
    else:
       return externalLinks[random.randint(0,len(externalLinks) - 1)]


def followExternalOnly(startingSite):
    externalLink = getRandomExternalLink(startingSite)
    print("随机外链是: " + externalLink)
    followExternalOnly(externalLink)


# 收集网站上发现的所有外链列表
allExtLinks = set()
allIntLinks = set()


def getAllExternalLinks(siteUrl):
    # 设置代理IP访问
    # proxy_handler = urllib.request.ProxyHandler({'http': '183.77.250.45:3128'})
    proxy_handler = urllib.request.ProxyHandler({'http': '183.77.250.45:3128'})
    proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
    # proxy_auth_handler.add_password('realm','123.123.2123.123','user','password')
    opener = urllib.request.build_opener(urllib.request.HTTPHandler,proxy_handler)
    urllib.request.install_opener(opener)

    req = request.Request(siteUrl,"html.parser")
    domain = urlparse(siteUrl).scheme + "://" + urlparse(siteUrl).netloc
    internalLinks = getInternalLinks(bsObj,domain)
    externalLinks = getExternalLinks(bsObj,domain)

    #收集外链
    for link in externalLinks:
       if link not in allExtLinks:
          allExtLinks.add(link)
          # print(link)
          print("extern url: " + link)
    # 收集内链
    for link in internalLinks:
       if link not in allIntLinks:
          print("intern url: " + link)
          allIntLinks.add(link)
          getAllExternalLinks(link)


# followExternalOnly("http://bbs.3s001.com/forum-36-1.html")
# allIntLinks.add("http://bbs.3s001.com/forum-36-1.html")
getAllExternalLinks("http://www.gem5.org/documentation/learning_gem5/introduction/")

解决方法

问:我不确定在哪里问这些问题?

A:由于只有中国人有这个问题,所以最好在v2ex之类的中国技术社区中提问。不在中国的人很难理解我们的问题T T。

问:有人可以告诉我该怎么办?

A:作为开源社区的成员,我将给您另一个方面来解决这个问题。现在,大多数文档是由社区编写的,您可以直接获取源文档文件。 我没有使用gem5,但是我找到了如何下载 gem5-website 到本地