如何高效安全的使用多线程

2015-11-15 20:22:26 +08:00
 honmaple
这么问的原因呢是今天写的爬虫遇到好几次 403,首先使用单线程,除了速度太慢,访问没有问题,后来加了多线程,速度那是杠杠的,结果悲剧了,没有几分钟就 403 了,再后来加了 sleep,结果发现多线程使用确定的 sleep 和没加一个样,最后使用 sleep+=5,每次调用 sleep 的时候自增长,发现又回到第一个问题,效率太低了,请教大家的爬虫是怎么解决的
2340 次点击
所在节点    Python
11 条回复
bdbai
2015-11-15 20:36:27 +08:00
目测服务器是按照每个 IP 限制请求的,同一个 IP 再折腾也没用。
kendetrics
2015-11-15 20:43:09 +08:00
每个线程走不同的代理
honmaple
2015-11-15 21:38:53 +08:00
@kendetrics 请教应该怎么设置代理
def __init__(self):
self.proxylist = ('120.195.199.251:80',
'110.73.7.198:8123')
self.proxies = {'':random.choice(self.proxylist)}
self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
self.headers = { 'User-Agent' : self.user_agent }


def contentlist(self,url):
proxy = urllib.request.ProxyHandler(self.proxies)
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
request = urllib.request.Request(url=url, headers=self.headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
我这样写有什么错误,不管怎么换 ip,结果还是 403
MinskyNg
2015-11-15 22:01:35 +08:00
爬虫可以用 gevent 做异步,感觉比多线程要好
haozhang
2015-11-15 22:02:44 +08:00
有一种方法:找一个别人共享出来的代理池(里面有很多的服务器,也就是有很多的 ip 可以用)然后轮番的用不同的 ip 爬东西。
yzongyue
2015-11-15 22:09:12 +08:00
我是 gevent 加上 queue , 通过控制 put 的速度来限制爬虫的速度
honmaple
2015-11-15 22:30:43 +08:00
@MinskyNg @yzongyue 第一次听说 gevent ,我去看看
HentaiMew
2015-11-15 22:32:41 +08:00
如果对应 WebService 有反爬措施的话,你要么不断的换 IP ,爬去过程中换 IP 高效的方式就是 5L 说的代理池,要么单线程甚至设置线程休息时间。
ming2281
2015-11-16 11:42:55 +08:00
世界有 3 种 bug: 你的 bug,我的 bug,多线程的 bug
:)
janxin
2015-11-16 13:33:05 +08:00
走代理,你这个跟多线程什么的根本没关系
honmaple
2015-11-16 14:15:45 +08:00
@HentaiMew @janxin 能否帮忙看下 3L,我设置代理的方法有什么不对的地方

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/236374

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX