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
Kvip
V2EX  ›  Python

小白请教各大佬点 Python requests 库的 ip 代理池的知识

  •  
  •   Kvip · 2020-06-26 22:14:31 +08:00 · 2840 次点击
    这是一个创建于 1615 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这阵子写了点爬虫,目前已顺利将目标网站数据爬下来。现在我想要给程序的请求加个 ip 代理池。
    初次学习,产生了两个疑惑,可能问题太过小白,因此没能在网上找到答案,在此特来请教下各位大佬。

    1 、如果我们使用的 ip 代理池中某个 ip 失效了,requests 请求是否会自动帮我们从 IP 代理池换个新的 ip 重新进行请求,还是直接就挂掉?

    2 、同个 session 下进行有不同的 post 请求,如果前后请求 ip 出现不一样,是否会翻车(后面的是否会请求失败)

    3 、求大佬推荐免费的代理池,因为目前只是个人学习乐趣,暂不考虑收费代理池。

    以下是我爬虫程序的核心代码:

    session = requests.Session()
    proxies = {
      "http":"http://ip:端口号"
      "https":"https://ip:端口号"
    }
    session.get(url, proxies=proxies)
    session.post(url, data, proxies=proxies)
    session.close()
    
    10 条回复    2020-06-28 00:11:38 +08:00
    mckelvin
        1
    mckelvin  
       2020-06-26 22:24:02 +08:00
    先考虑下能不能通过 x-forwarded-for 头来伪造 IP
    jeeyong
        2
    jeeyong  
       2020-06-26 23:25:54 +08:00
    不是直接人采集任务去判断代理 IP 是否可用吧?
    我都是先判断 ip 是否可用, 可用的话压入一个队列.
    需要用的时候取出来...
    当然每个 ip 的生命周期有多长就要看你选的 ip 怎么样了.
    推荐能用的在 30 秒内用完.
    Cy86
        3
    Cy86  
       2020-06-27 07:18:10 +08:00
    1. 貌似没有, 我都是 try 保护自己写换 ip 逻辑
    2. 最好不要, 如果有反爬注意这块的话 会翻车, 可以先测试下容忍度
    3. Github 上搜 ip 代理池, 有一堆, 最好从中获取这些网站, 然后自己爬下来写代理池
    老白建议:
    先给你个 开放代理:ip.ihuan.me
    最好按一楼说的试一下, 比如爬 91 这招就贼好使, 但也要控制速度, 每秒 1000 的话 会封 ip
    如果要爬的域名是大厂 or 比较有价值,这种反爬比较严重,那还是直接买代理吧, 开放代理都差不多封完了
    xingshu1990
        4
    xingshu1990  
       2020-06-27 08:33:01 +08:00
    建议还是用阿布云的收费(1 元 1 小时的那种可以玩玩),这里还有接入文档: https://www.abuyun.com/http-proxy/dyn-manual.html
    ![QQ 截图 20200627082317.png]( https://i.loli.net/2020/06/27/spVvoz239ydeKxt.png)
    ![QQ 截图 20200627082339.png]( https://i.loli.net/2020/06/27/lLA2zHMCJux1yYp.png)
    我看了一下网络上的教程 好像没有说 requests 自带更换 IP 请求。
    那只能是写 try except,另外阿布云目前只是提供国内 IP.
    freakxx
        5
    freakxx  
       2020-06-27 11:19:17 +08:00
    1 、如果我们使用的 ip 代理池中某个 ip 失效了,requests 请求是否会自动帮我们从 IP 代理池换个新的 ip 重新进行请求,还是直接就挂掉?
    requests 不会,
    但你可以自己封多一层
    每次随机从 ip 池中拿,
    写个修饰器,或者用 partial 事先把 headers 包好。

    2 、同个 session 下进行有不同的 post 请求,如果前后请求 ip 出现不一样,是否会翻车(后面的是否会请求失败)
    这个一般不会,看反爬的容忍度,你就直接试下不就好咯。
    Kvip
        6
    Kvip  
    OP
       2020-06-28 00:00:42 +08:00
    @jeeyong 感谢您提供的思路,这是一个不错的解决方案
    Kvip
        7
    Kvip  
    OP
       2020-06-28 00:03:55 +08:00
    @mckelvin x-forwarded-for 是确实是一种不错的解决思路,我查看了下其原理,应该可以更简便地解决我的问题,明天深入测试下,感谢您提供了一个非常不错的思路。
    Kvip
        8
    Kvip  
    OP
       2020-06-28 00:08:02 +08:00
    @Cy86 谢谢您提供的见解,一楼提供的方案确实不错,明天试下
    Kvip
        9
    Kvip  
    OP
       2020-06-28 00:09:32 +08:00
    @xingshu1990 谢谢您的提供的网站,我会考虑的
    Kvip
        10
    Kvip  
    OP
       2020-06-28 00:11:38 +08:00
    @freakxx 谢谢您提供的处理思路,我测试了下同 session 不同 ip 进行请求后,有效,谢谢您的解答
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5208 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:13 · PVG 09:13 · LAX 17:13 · JFK 20:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.