如何将国外网页(如gem5官方文件)下载到本地



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

不仅是gem5的官方文件,还有很多国外的网页版文件我想下载,以便我可以随时访问它们?有什么办法吗?我将我使用的代码上传到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, headers=headers)
html = urlopen(req)
bsObj = BeautifulSoup(html.read(), "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/")

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

A: 既然只有中国人有这个问题,你最好去中国的技术社区问问,比如v2ex。不在中国的人很难理解我们的问题

Q: 有人能告诉我该怎么办吗?

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

最新更新