Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
bigdong0410 opened this issue Nov 8, 2017 · 23 comments

Comments

@bigdong0410
Copy link

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

@jhao104
Copy link
Owner

jhao104 commented Nov 8, 2017

@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
Copy link
Author

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

@jhao104
Copy link
Owner

jhao104 commented Nov 8, 2017

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

@bigdong0410
Copy link
Author

恩,我试试,谢谢了。

@bigdong0410
Copy link
Author

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

@jhao104
Copy link
Owner

jhao104 commented Nov 9, 2017

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

@bigdong0410
Copy link
Author

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

@jhao104
Copy link
Owner

jhao104 commented Nov 9, 2017

@bigdong0410 做晚上我这边也停了,有几个代理网站崩掉了。
你到

if __name__ == '__main__':
中测试这几个代理网站能不能正常访问。
另外把
sched.add_job(main, 'interval', minutes=10) # 每10分钟抓取一次
中的间隔时间调大些,一次计划任务没在间隔时间内执行完毕,下次就会出问题

@bigdong0410
Copy link
Author

好的

@bigdong0410
Copy link
Author

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

@jhao104
Copy link
Owner

jhao104 commented Nov 9, 2017

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

@bigdong0410
Copy link
Author

好的,谢谢啦

@Just2co
Copy link

Just2co commented Nov 13, 2017

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

@jhao104
Copy link
Owner

jhao104 commented Nov 13, 2017

@Just2co 暂时没有,, 你需要可以自己加,文档里面有添加方法。或者你在这里 #71 提出来 我空了加上 😊

@Just2co
Copy link

Just2co commented Nov 13, 2017

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

@jhao104
Copy link
Owner

jhao104 commented Nov 13, 2017

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

@Just2co
Copy link

Just2co commented Nov 13, 2017

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

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

@jhao104
Copy link
Owner

jhao104 commented Nov 13, 2017

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

@Just2co
Copy link

Just2co commented Nov 13, 2017

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

@Just2co
Copy link

Just2co commented Nov 13, 2017

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

@jhao104
Copy link
Owner

jhao104 commented Nov 13, 2017

@Just2co 就像之前说的,这是初衷是给爬虫用的,所以只判断了http,只支持一种类型,如果你要判断socks5, 可以将这里

proxies = {"http": "http://{proxy}".format(proxy=proxy)}

修改为:

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

@Just2co
Copy link

Just2co commented Nov 13, 2017

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

@jhao104
Copy link
Owner

jhao104 commented Nov 13, 2017

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

@jhao104 jhao104 closed this as completed Aug 29, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants