是这样,我为了练手写了一个 Pixiv 爬虫,主体写完以后准备加上 HTTP 代理,然后突然想起前段时间 Pixiv 已经被墙了,不过只是 DNS 污染而已,我本地改了 DNS 所以没问题。 可是当我要使用国内代理的时候,这个墙就会是问题了对吧?所以能否让 Requests 使用本地设置的 DNS 解析,然后再把请求丢给代理呢? 当然也可以用国外的代理,不过感觉要找个能用的国外代理不容易,速度也是问题。。。 或者有其他方法嘛?
1
ysc3839 2017-10-13 23:30:04 +08:00 via Android
可以考虑用 IP 连接,然后设置一下 Host。
|
2
janxin 2017-10-13 23:32:11 +08:00 via iPhone
最简单的方式你改一下 hosts 啊…
|
3
xmcp 2017-10-13 23:36:30 +08:00 2
|
4
Va1n3R 2017-10-13 23:40:00 +08:00
直接用国外的 VPS,写个爬虫,爬下国外的代理,然后用代理池呗。不一定非要在本机搞呀
|
5
tomczhen 2017-10-13 23:49:31 +08:00 1
说实话只要和 Web 相关的强烈建议先去看看 HTTP 协议的相关书籍或者 RFC。
域名在 Client 的作用是通过 DNS 解析到 Server 的 IP,但是请求需要在 Host 头中带上域名,实际请求还是发送到 IP 的。 举个例子: GET /foo.php HTTP/1.1 Host: example.com Connection: keep-alive Accept-Encoding: gzip, deflate Accept: */* 基于这个过程有两种方法来解决: 第一:基于系统环境解决。 修改本地 Host、指定 DNS 第二:自己构造请求。 这种方法需要可以自定义请求的 Host 头,并且需要自己处理解析这块。可以选择硬编码 IP 或者还是采用第一种方法实现。 可以先使用硬编码 IP 的方式来尝试一下,剩下的就是要确认使用的请求库能否支持自定义 Host 头了。 如果想进一步解决硬编码 IP 的问题,那么就需要一个 DNS 的库来获得正确的解析记录,再来发起请求。 剩下的问题就可能出在 HTTPS 上,因为证书校验是需要靠域名校验的,client 处理的方式细节不同通过 IP 发起请求可能会出现证书校验错误,粗暴的方法就是无视证书错误。 |
7
Kirikora OP |