jhao104 / proxy_pool

Python ProxyPool for web spider
https://jhao104.github.io/proxy_pool/
MIT License
21.48k stars 5.17k forks source link

请问爬虫过程中一个代理失效后是自动启动下一个代理ip吗? #84

Closed bigdong0410 closed 5 years ago

bigdong0410 commented 6 years ago

如题,还有就是怎么每秒切换多个ip?

jhao104 commented 6 years ago

@bigdong0410 你问的是代理池还是个人的爬虫?

代理池的话有刷新机制,自动检测失效的代理并删除。

你个人的爬虫的话,在文档的 使用 部分用demo代码:

import requests

def get_proxy():
    return requests.get("http://127.0.0.1:5010/get/").content

def delete_proxy(proxy):
    requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))

# your spider code

def getHtml():
    # ....
    retry_count = 5
    proxy = get_proxy()
    while retry_count > 0:
        try:
            html = requests.get('https://www.example.com', proxies={"http": "http://{}".format(proxy)})
            # 使用代理访问
            return html
        except Exception:
            retry_count -= 1
            # 访问失败,计数减一
    # 出错5次, 删除代理池中代理
    delete_proxy(proxy)
    return None

代理池提供了获取删除代理的接口,代理失效在代码里切换就行

bigdong0410 commented 6 years ago

个人爬虫,我爬取微博的时候,发现如果代理ip失效的话,爬虫就暂停了,我得手动重启爬虫,我用的是scrapy框架。谢谢啦,我再看一下文档。

jhao104 commented 6 years ago

@bigdong0410 Scrapy里面有个process_exception的中间件,你可以重写这个,url下载失败时会自动调用这个

bigdong0410 commented 6 years ago

恩,我试试,谢谢了。

bigdong0410 commented 6 years ago

还有一个问题,这个程序不是可以自动检测ip数量够不够用吗,然后自动添加,为什么我多进程跑了一晚上,早上发现显示没有代理了?

jhao104 commented 6 years ago

@bigdong0410 不会检测够不够用,是隔一段时间抓一次代理保留能用的。 如果显示没有代理,先看看日志确保程序在正常运行 log下面 或者你可以看文档里面的demo接口,一直运行起的有数据入库的 http://123.207.35.36:5010

bigdong0410 commented 6 years ago

看了一下log发现昨晚23点后,代理就不能refresh了,您知道是怎么回事吗?

jhao104 commented 6 years ago

@bigdong0410 做晚上我这边也停了,有几个代理网站崩掉了。 你到https://github.com/jhao104/proxy_pool/blob/640eba9eac284ba14ccbe84e260f6852da8acb25/ProxyGetter/getFreeProxy.py#L153 中测试这几个代理网站能不能正常访问。 另外把https://github.com/jhao104/proxy_pool/blob/640eba9eac284ba14ccbe84e260f6852da8acb25/Schedule/ProxyRefreshSchedule.py#L99 中的间隔时间调大些,一次计划任务没在间隔时间内执行完毕,下次就会出问题

bigdong0410 commented 6 years ago

好的

bigdong0410 commented 6 years ago

请问,为什么我先启动ProxyRefreshSchedule.py后再启动ProxyApi.py会显示地址被占用啊,而不能启动?

jhao104 commented 6 years ago

@bigdong0410 端口被占用吗?应该是你之前启动的进程没有杀干净,你ps看下进程

bigdong0410 commented 6 years ago

好的,谢谢啦

Just2co commented 6 years ago

@jhao104 老大,你好,我看到这个工具内置是daili5u,还有西刺代理,貌似都是国内的代理搜集网站啊,没有国外的一些网站,比如socksproxylist.com freeproxylist.com 之类的吗?

jhao104 commented 6 years ago

@Just2co 暂时没有,, 你需要可以自己加,文档里面有添加方法。或者你在这里 https://github.com/jhao104/proxy_pool/issues/71 提出来 我空了加上 :blush:

Just2co commented 6 years ago

好的,这个软件是不是就是用来自动爬取代理搜集网上面的IP跟端口及测试能否使用的,我用的是ubuntu,几十分钟前已经照着教程安装并且启动了,理论上是不是有很多代理已经被测试出来了?这些代理能用于一些工具的前置吗?比如蓝灯/goagent等等

jhao104 commented 6 years ago

@Just2co 如果你配置成功的话应该是的,这工具目的是用作爬虫代理的,翻墙的话可以看看这个https://github.com/XX-net/XX-Net

Just2co commented 6 years ago

@jhao104 你的意思是,这个工具已经自带了能用的前置,所以爬出来的IP都是在前置之后才能通的,我如果直接用这些代理,要先ping一下是不是被block了,然后才能放进去做梯子的前置是吧?

梯子我这里一直超多超多,但是很多失效了,所以要给它套上袜子(SOCKS4/SOCKS5/HTTP前置)才能复活它们!

jhao104 commented 6 years ago

@Just2co 是这么个意思,只是说这些代理用作翻墙不适合,都是网上公开的免费代理,很容易就失效了。除非你自己加写稳定的代理源

Just2co commented 6 years ago

@jhao104 是的,免费的有时候只能用几分钟,但也有一些精品可以用好几天半个月的,速度又快又稳定。如果直接用作浏览器代理,几秒钟就会被办掉,如果给梯子做前置,就能一直用很久,现在很多梯子都是带有混淆的,不用前置直接过墙,GFW都识别不出来,只能办掉中心节点IP,所以套上袜子,能很稳定的用,如果直接把代理袜子放到浏览器代理里面访问墙外网站,几秒钟就会失效!

Just2co commented 6 years ago

@jhao104 我在可视化SSDB网页里面,看到useful_proxy里面有两百多个IP跟端口,从端口上看,很多都是http代理,不知道有没有socks4/5,怎么才能知道这些代理打类型呢?value length下面的1/-1/2是不是就是类型?能否给他们重新定义变量为http/socks4/socks5

jhao104 commented 6 years ago

@Just2co 就像之前说的,这是初衷是给爬虫用的,所以只判断了http,只支持一种类型,如果你要判断socks5, 可以将这里 https://github.com/jhao104/proxy_pool/blob/12cb7205b7518ea8a40447bdeb212f21c5f61397/Util/utilFunction.py#L97 修改为:

 proxies = {"http": "socks5://{proxy}".format(proxy=proxy)}
# 如果你的判断网站是https,将http换成https
Just2co commented 6 years ago

那么相对应的,我要判断socks4,是不超这样改就行了? proxies = {"http": "socks4://{proxy}".format(proxy=proxy)}

jhao104 commented 6 years ago

@Just2co 不行,这个库只支持socks5 :joy: