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

[求助] 我想用 Python 批量测试 IP 代理是否用

  •  
  •   Ger2EX · 2018-09-26 22:03:21 +08:00 · 14155 次点击
    这是一个创建于 2280 天前的主题,其中的信息可能已经有所发展或是发生改变。

    python 小白,爱好者 求教

    用 shell 抓取到一组代理 IP 并另存为一个文本文件 xiciip.txt 中; 如:

    183.129.153.122:36839
    115.46.71.101:8123
    222.191.233.74:36574
    219.157.144.246:8118
    121.31.163.225:8123
    122.235.168.162:8118
    119.31.210.170:7777
    183.129.207.74:14823
    116.62.134.173:9999
    116.192.171.169:43928
    115.46.77.208:8123
    183.21.81.58:40539
    120.92.74.237:3128
    27.37.46.202:9000
    120.92.74.189:3128
    
    

    shell 没找到方法来测试确认代理 IP 是否可用,网上找一些 python 方法;

    但网上的例子都是指定一个代理 IP 去测试;

    我想用 python 按行读取代理 IP 与端口,然后用 for 循环逐行批量测试 ip 是否可用;

    import requests
    
    f = open("xiciip.txt")   
    
    line = f.readline()  #读取一行,
    for line in f :
    	try:
            requests.get('http://bing.com/', proxies = {"http":"http://120.92.74.189:3128"} )
            #这样是成功的,120.92.74.189:3128 可用
            #我想把 120.92.74.189:3128 用 line 变量来替换,多次测试没成功;
    	except:
    		print  ( "connect failed" )
    	else:
    		print   ( "success" )
    

    请高手指定一下,如何在 proxies = 后面加入 line 变量,我不知道哪里出问题了

    尝试 1 把{}中的内容 做成一个变量

    proxy = '"http":"http://'+line[:-1]+'"' #不知这样定义有无问题,对 shell 和 python 的符号使用很感冒
    requests.get('http://bing.com/', proxies = {proxy} )
    

    但不成功返回全是 failed

    尝试 2

    把 proxies = {"http":"http://120.92.74.189:3128"} 全定义为变量字符串

    请大家帮助指教一下

    如何引入变量 line "http":"http://120.92.74.189:3128"

    解释一下这句语法意思,为什么会多个双引号,还有冒号的 proxies = {"http":"http://120.92.74.189:3128"}

    谢谢!

    12 条回复    2018-09-27 13:32:58 +08:00
    raycool
        1
    raycool  
       2018-09-26 22:08:30 +08:00
    line = 'http://' + line

    requests.get('http://bing.com/', proxies = {"http":line}

    另外,使用多线程效率会大大提升
    bucky
        2
    bucky  
       2018-09-26 22:09:16 +08:00
    proxies 是字典,你要循环的是字典
    Qzier
        3
    Qzier  
       2018-09-27 00:35:28 +08:00 via iPhone
    用 aiohttp
    Trim21
        4
    Trim21  
       2018-09-27 00:43:20 +08:00
    Joshua999
        5
    Joshua999  
       2018-09-27 00:50:19 +08:00 via Android
    试试 print(' "http:" ')输出的是什么就知道了
    xiadong1994
        6
    xiadong1994  
       2018-09-27 07:04:56 +08:00 via iPhone
    把冒号后面换成 line。另外要注意 line 有没有把换行符也一起读进来了。
    在 Shell 里面用 curl 也可以测代理通不通啊。
    bmos
        7
    bmos  
       2018-09-27 08:28:43 +08:00
    xici 的我认为可以直接放弃了,不知道是不是技术原因 99%不能用。在 V2 翻到一个老帖子,推荐一下,感觉可用的很多。https://www.v2ex.com/t/438606
    PythonAnswer
        8
    PythonAnswer  
       2018-09-27 09:37:16 +08:00 via iPhone
    有古老工具可用
    Ger2EX
        9
    Ger2EX  
    OP
       2018-09-27 10:55:48 +08:00
    谢谢,各位的回复;
    PinkFish
        10
    PinkFish  
       2018-09-27 11:56:11 +08:00
    readline 会把每行最后的\n 读进来,把 line strip 一下
    Ger2EX
        11
    Ger2EX  
    OP
       2018-09-27 13:29:03 +08:00
    在网上找到一个多线程的方法,真接把 ip.txt 替换成我的, 但执行后没有反应,也没有生成文件
    Ger2EX
        12
    Ger2EX  
    OP
       2018-09-27 13:32:58 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4730 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:38 · PVG 13:38 · LAX 21:38 · JFK 00:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.