脑袋有点晕了,问题是这样的:
```
def run(self):
global out_queue
while True:
page = self.out_queue.get(True, 2)
try:
html = requests.get('http://xxx.com', proxies={q_proxy.get().split('=')[0]: q_proxy.get().split('=')[1]}, timeout=3)
except requests.exceptions.ReadTimeout:
html = requests.get('http://xxx.com', proxies={q_proxy.get().split('=')[0]: q_proxy.get().split('=')[1]}, timeout=3)
self.fun()
self.out_queue.task_done()
在获取目标 url 的时候使用的是代理,但是会 raise ReadTimeout ,我现在的打算是在抛出这个异常之后继续切换代理,使用下一个代理,代理在队列里面。
现在如何在抛出异常之后切换代理,在切换代理之后如果还抛出异常就继续切换代理?
1
Kisesy 2016-01-17 22:35:58 +08:00
死循环啊,没异常之后就跳出
|
2
just1 2016-01-17 22:38:37 +08:00 via Android
看代码你的代理在数组。用整数变量啊,,错误就 n+=1,
|
4
DuckJK OP @Kisesy
while True: try: html = requests.get('http://xxx.com', proxies={q_proxy.get().split('=')[0]: q_proxy.get().split('=')[1]}, timeout=3) break except except requests.exceptions.ReadTimeout: html = requests.get('http://xxx.com', proxies={q_proxy.get().split('=')[0]: q_proxy.get().split('=')[1]}, timeout=3) 是这样子吧?整个代码套了好多层 while 和 try 。。。。谢谢。 |
6
Kisesy 2016-01-17 22:55:49 +08:00
你这代码,出现异常之后写 continue 就行,就不要再写 requests.get 了
|
7
Kisesy 2016-01-17 22:56:34 +08:00 1
写 pass 也行
|
9
master13 2016-01-18 09:22:00 +08:00
啊!我有个问题!
LZ 的 q_proxy 看起来像是个 iterator ,你这样调用不会有逻辑错误? `proxies={q_proxy.get().split('=')[0]: q_proxy.get().split('=')[1]}` 看起来像是取了第 N 个元素等号前的东西和第 N+1 个元素等号后的东西……天啦噜! 他们拼起来竟然可以用的呢! |
10
DuckJK OP @master13 谢谢你啊,刚刚开会的时候突然想起来这个, q_proxy 是一个队列,所以每次调用 get 之后的话,都会取出来一个值。刚刚想出来试试的。。,实在是偷懒偷大发了。。
|
12
DuckJK OP @master13 而且我觉得上面的 exception 还少了,首先爬虫采集的目标网站会有反爬虫策略,这个我简单的切换了代理,在切换代理的情况下,没有考虑通过代理不可用的情况,感觉会抛出 timeout ,这个异常没有捕捉到。因为采集目标是肯定可以连接上的,所以窝决定不管抛出神码异常,都切换代理,然后设定一个次数,超过这个次数之后就退出程序。下一步就是继续看对方神码反爬虫策略了。
|
13
1KEco 2016-01-20 06:05:13 +08:00
把设置代理单独拿出来作为一个函数, except 之后再调用一遍设置代理的函数就好了
|