写在最前

Github时不时抽风,老是访问不了,诚然,用科学上网能解决一切这类问题,但是,能不翻墙还是不要翻墙的好。这里采用的是通过修改本地hosts,配置域名和IP映射关系,这样一来,当我们访问github时,这些域名可以直接从本地hosts文件中获取IP,而不需要再去DNS服务器上询问一圈。从而提高访问速度。

修改hosts

以Windows系统为例,
hosts的路径是C:\Windows\System32\drivers\etc
打开后将以下内容复制到文件最下方。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
185.199.108.154               github.githubassets.com
199.232.68.133 camo.githubusercontent.com
199.232.68.133 github.map.fastly.net
199.232.69.194 github.global.ssl.fastly.net
140.82.113.3 gist.github.com #gist现在被墙的很彻底,就算添加进hosts也访问不了。
185.199.108.153 github.io
140.82.113.4 github.com
140.82.114.5 api.github.com
199.232.68.133 raw.githubusercontent.com
199.232.68.133 user-images.githubusercontent.com
199.232.68.133 favicons.githubusercontent.com
199.232.68.133 avatars5.githubusercontent.com
199.232.68.133 avatars4.githubusercontent.com
199.232.68.133 avatars3.githubusercontent.com
199.232.68.133 avatars2.githubusercontent.com
199.232.68.133 avatars1.githubusercontent.com
199.232.68.133 avatars0.githubusercontent.com
140.82.114.9 codeload.github.com
52.217.83.84 github-cloud.s3.amazonaws.com
52.216.229.155 github-com.s3.amazonaws.com
52.216.30.60 github-production-release-asset-2e65be.s3.amazonaws.com
52.216.17.0 github-production-user-asset-6210df.s3.amazonaws.com
52.216.236.43 github-production-repository-file-5c1aeb.s3.amazonaws.com

保存后,win+X,按A,以管理员权限启动powershell,输入
1
ipconfig /flushdns

刷新DNS缓存。之后就能变快了……

才怪嘞,因为上述域名的IP是不停在变的,这一串映射仅仅适用于今天而已,到了明天,ip一变动,又登不上了,我总不可能天天来更新吧?

使用爬虫脚本实时获取最新ip

需要查询ip地址的域名有这么多。手动添加肯定是不乐意的了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
github.githubassets.com
camo.githubusercontent.com
github.map.fastly.net
github.global.ssl.fastly.net
gist.github.com #gist现在被墙的很彻底,加进hosts也无济于事
github.io
github.com
api.github.com
raw.githubusercontent.com
user-images.githubusercontent.com
favicons.githubusercontent.com
avatars5.githubusercontent.com
avatars4.githubusercontent.com
avatars3.githubusercontent.com
avatars2.githubusercontent.com
avatars1.githubusercontent.com
avatars0.githubusercontent.com
codeload.github.com
github-cloud.s3.amazonaws.com
github-com.s3.amazonaws.com
github-production-release-asset-2e65be.s3.amazonaws.com
github-production-user-asset-6210df.s3.amazonaws.com
github-production-repository-file-5c1aeb.s3.amazonaws.com

因为github相关的诸多域名的ip是在变动的,为了能够实时获取最新的ip,我们可以使用爬虫来从站长之家或其余ip查询网站上爬取最新ip。

这里要用到python,安装推荐使用Anaconda,Anaconda安装方式推荐参看Win10重装日记的3.2章节。根据Anaconda版本与python版本的对照选择自己需要的Anaconda安装包,然后直接安装即可,路径建议修改为非系统盘,同时务必勾选将python路径加入到环境变量的选项。

新建一个python脚本——githosts.py(最简单的方法,新建一个txt文本文件,把下面的代码粘贴进去以后,修改后缀为.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env python
# 待查询的域名
s = """
github.githubassets.com
camo.githubusercontent.com
github.map.fastly.net
github.global.ssl.fastly.net
gist.github.com
github.io
github.com
api.github.com
raw.githubusercontent.com
user-images.githubusercontent.com
favicons.githubusercontent.com
avatars5.githubusercontent.com
avatars4.githubusercontent.com
avatars3.githubusercontent.com
avatars2.githubusercontent.com
avatars1.githubusercontent.com
avatars0.githubusercontent.com
codeload.github.com
github-cloud.s3.amazonaws.com
github-com.s3.amazonaws.com
github-production-release-asset-2e65be.s3.amazonaws.com
github-production-user-asset-6210df.s3.amazonaws.com
github-production-repository-file-5c1aeb.s3.amazonaws.com
"""
# 引入必要的包库
import requests
from bs4 import BeautifulSoup
import os
# 分割s list,然后逐个查询对应的ip,之后逐个加入到ans list中
ans = []
for i in s.split():
try:
url = "http://ip.tool.chinaz.com/" + i.strip()
resp = requests.get(url)
soup = BeautifulSoup(resp.text,"html5lib")
x = soup.find(class_="IcpMain02")
x = x.find_all("span", class_="Whwtdhalf")
x = "%s %s" % (x[5].string.strip(), i.strip())
print(x)
ans.append(x)
except:
print("返回值为null,查询失败。请确保域名正确")
# 打开hosts文件,写入结果
hosts = r"C:\Windows\System32\drivers\etc\hosts"
with open(hosts, "r") as f:
content = [i for i in f.readlines() if i.startswith("#")]
content.extend(ans)
with open(hosts, "w") as f:
f.write("\n".join(content))
# 调用os,执行刷新dns指令
os.system('ipconfig /flushdns')

然后把githosts.py放到C:\Windows\System32目录下(不放其实也可以,只是这样一来每次都要自己cd路径。)
win+X,按A以管理员权限启动Powershell,输入

1
python githosts.py

然后脚本就会自动爬取最新的IP与域名到你的hosts文件中了。

因为github相关的诸多域名的ip是在变动的,为了能够实时获取最新的ip,我们可以使用爬虫来从站长之家或其余ip查询网站上爬取最新ip。

这里要用到python,安装推荐使用Anaconda,Anaconda安装方式推荐参看Ubuntu重装日记的7.2章节。根据Anaconda版本与python版本的对照选择自己需要的Anaconda安装包,按照教程指示安装,注意安装时控制台输出的提示信息,务必选择将python路径加入到环境变量的选项。

新建一个python脚本——githosts.py(最简单的方法,新建一个txt文本文件,把下面的代码粘贴进去以后,修改后缀为.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python
# 待查询的域名
s = """
github.githubassets.com
camo.githubusercontent.com
github.map.fastly.net
github.global.ssl.fastly.net
gist.github.com
github.io
github.com
api.github.com
raw.githubusercontent.com
user-images.githubusercontent.com
favicons.githubusercontent.com
avatars5.githubusercontent.com
avatars4.githubusercontent.com
avatars3.githubusercontent.com
avatars2.githubusercontent.com
avatars1.githubusercontent.com
avatars0.githubusercontent.com
codeload.github.com
github-cloud.s3.amazonaws.com
github-com.s3.amazonaws.com
github-production-release-asset-2e65be.s3.amazonaws.com
github-production-user-asset-6210df.s3.amazonaws.com
github-production-repository-file-5c1aeb.s3.amazonaws.com
"""
# 引入必要的包库
import requests
from bs4 import BeautifulSoup
import os
# 分割s list,然后逐个查询对应的ip,之后逐个加入到ans list中
ans = []
for i in s.split():
try:
url = "http://ip.tool.chinaz.com/" + i.strip()
resp = requests.get(url)
soup = BeautifulSoup(resp.text,"html5lib")
x = soup.find(class_="IcpMain02")
x = x.find_all("span", class_="Whwtdhalf")
x = "%s %s" % (x[5].string.strip(), i.strip())
print(x)
ans.append(x)
except:
print("返回值为null,查询失败。请确保域名正确")
# 打开hosts文件,写入结果
# 这里是你的hosts文件路径,如果做过修改,记得改成自己的路径
hosts = r"/etc/hosts"
with open(hosts, "r") as f:
content = [i for i in f.readlines() if i.startswith("#")]
content.extend(ans)
with open(hosts, "w") as f:
f.write("\n".join(content))
# 调用os,执行刷新dns指令,MAC用户需要根据版本选择相应版本的指令
# 如果是Mac OS X 10.7 – 10.8
os.system('sudo killall -HUP mDNSResponder')
# 如果是Mac OS X 10.5 – 10.6
# os.system('dscacheutil -flushcache')
# 如果是Mac OS X 10.4
# os.system('lookupd -flushcache')

在脚本所在文件夹打开terminal(即终端),输入指令

1
sudo python githosts.py

然后脚本就会自动爬取最新的IP与域名到你的hosts文件中了。

可能遇到的bug

老老实实按照上面说的来,看仔细加粗的地方,就不会有下面的bug。

没有权限修改hosts

这个应该是windows用户才会遇到,如果是脚本改写,那一定是没有用管理员权限启动Powershell,如果只是单纯手动添加hosts,那么可以直接复制hosts文件到有权限修改的目录下,然后把IP复制进去,接着再复制回原hosts路径,覆盖掉当前hosts。也可以考虑使用火绒安全管家,它的工具箱里有提供直接修改hosts的功能。

python的环境变量没添加

那就是安装的时候没勾选,找到Anaconda的安装目录,在根目录里有python.exe文件,至于怎么添加还请自行百度。(其实卸载了Anaconda以后重新安装,这次记得勾选添加到环境变量也可以。顺带一提,卸载很慢哦,还不如老老实实自己添加一下),UNIX系统的操作也类似。

缺少requests包

一般Anaconda是自带一些基础包库的,没有这个包说明你是从python官网下载的python安装包。不过就算缺少,也可以通过pip install [packages]来安装。遇到安装速度慢的情况,就去自行百度“pip install 换清华源”

报错“NoneType’ object has no attribute ‘find_all”

该报错有两种情况。

最有可能是站长之家的域名网址变动,例如从ip.chinaz.com变为ip.tool.chinaz.com,将源代码中url = "https://ip.tool.chinaz.com/" + i.strip()里的域名改为现行网址即可。

如果是页面元素结构变化则需要通过F12查看原网页元素id或者class来确定元素位置重新改写源代码x = x.find_all("span", class_="Whwtdhalf")中需要find_all的元素(也即是我们需要的ip查询结果)

MAC OS dns刷新失败

博主没使用过mac系统,但是有人反馈了就去查了一下,Mac OS刷新DNS的指令貌似是有在随版本变化的。请读者根据自己的版本选择相应的指令,替换脚本最后一行的指令内容。

1
2
3
4
5
6
# Mac OS X 10.7 – 10.8
sudo killall -HUP mDNSResponder
# Mac OS X 10.5 – 10.6
dscacheutil -flushcache
# Mac OS X 10.4
lookupd -flushcache

参考内容

  1. github访问太慢解决方案:脚本原作者。
  2. GitHub520开源项目:值得添加IP的域名参考。

更多内容