V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Kirikora
V2EX  ›  Python

请教一个关于 Python Requests 设置 DNS 的问题

  •  
  •   Kirikora · 2017-10-13 22:46:40 +08:00 · 7852 次点击
    这是一个创建于 2600 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样,我为了练手写了一个 Pixiv 爬虫,主体写完以后准备加上 HTTP 代理,然后突然想起前段时间 Pixiv 已经被墙了,不过只是 DNS 污染而已,我本地改了 DNS 所以没问题。 可是当我要使用国内代理的时候,这个墙就会是问题了对吧?所以能否让 Requests 使用本地设置的 DNS 解析,然后再把请求丢给代理呢? 当然也可以用国外的代理,不过感觉要找个能用的国外代理不容易,速度也是问题。。。 或者有其他方法嘛?

    11 条回复    2017-10-14 15:15:32 +08:00
    ysc3839
        1
    ysc3839  
       2017-10-13 23:30:04 +08:00 via Android
    可以考虑用 IP 连接,然后设置一下 Host。
    janxin
        2
    janxin  
       2017-10-13 23:32:11 +08:00 via iPhone
    最简单的方式你改一下 hosts 啊…
    xmcp
        3
    xmcp  
       2017-10-13 23:36:30 +08:00   ❤️ 2
    像这样?

    requests.get('http://123.125.114.144',headers={'Host':'www.baidu.com'})
    Va1n3R
        4
    Va1n3R  
       2017-10-13 23:40:00 +08:00
    直接用国外的 VPS,写个爬虫,爬下国外的代理,然后用代理池呗。不一定非要在本机搞呀
    tomczhen
        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 发起请求可能会出现证书校验错误,粗暴的方法就是无视证书错误。
    Kirikora
        6
    Kirikora  
    OP
       2017-10-14 00:08:03 +08:00
    @tomczhen 非常感谢!已下单《计算机网络:自顶向下方法》,准备好好学一波
    Kirikora
        7
    Kirikora  
    OP
       2017-10-14 00:12:07 +08:00
    @ysc3839
    @janxin
    @xmcp
    改 hosts 有想到过,不过考虑到 cdn 的问题不知道能不能成功,这方面了解的太少了,明天试试。谢谢回复!
    @Va1n3R
    也是个法子~之前考虑的是能写好打包给同学用用,只是他们不一定有 VPS。
    tomczhen
        8
    tomczhen  
       2017-10-14 00:18:56 +08:00
    @Kirikora 个人觉得对 Web 开发来说专注应用层性价比更高一些,当然有兴趣就随意了。
    时间多个人推荐《 HTTP 权威指南》,时间有限可以看看《图解 HTTP 》。
    Kirikora
        9
    Kirikora  
    OP
       2017-10-14 10:15:13 +08:00
    @tomczhen 好的,主要是计算机三级还没考,准备顺便学一波来着
    ysc3839
        10
    ysc3839  
       2017-10-14 14:00:28 +08:00 via Android
    @Kirikora 我说的是改 HTTP Header 里面的 Host
    hcnhcn012
        11
    hcnhcn012  
       2017-10-14 15:15:32 +08:00 via iPhone
    @Kirikora 计算机网络自顶向下在 http 方面没有 http 权威指南讲的详细,如果光写爬虫的话还是先看后者吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1186 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:34 · PVG 02:34 · LAX 10:34 · JFK 13:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.