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

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

  •  
  •   honmaple · 2015-11-15 20:22:26 +08:00 via Android · 2335 次点击
    这是一个创建于 3287 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这么问的原因呢是今天写的爬虫遇到好几次 403,首先使用单线程,除了速度太慢,访问没有问题,后来加了多线程,速度那是杠杠的,结果悲剧了,没有几分钟就 403 了,再后来加了 sleep,结果发现多线程使用确定的 sleep 和没加一个样,最后使用 sleep+=5,每次调用 sleep 的时候自增长,发现又回到第一个问题,效率太低了,请教大家的爬虫是怎么解决的
    11 条回复    2015-11-16 14:15:45 +08:00
    bdbai
        1
    bdbai  
       2015-11-15 20:36:27 +08:00 via iPhone
    目测服务器是按照每个 IP 限制请求的,同一个 IP 再折腾也没用。
    kendetrics
        2
    kendetrics  
       2015-11-15 20:43:09 +08:00
    每个线程走不同的代理
    honmaple
        3
    honmaple  
    OP
       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
        4
    MinskyNg  
       2015-11-15 22:01:35 +08:00
    爬虫可以用 gevent 做异步,感觉比多线程要好
    haozhang
        5
    haozhang  
       2015-11-15 22:02:44 +08:00
    有一种方法:找一个别人共享出来的代理池(里面有很多的服务器,也就是有很多的 ip 可以用)然后轮番的用不同的 ip 爬东西。
    yzongyue
        6
    yzongyue  
       2015-11-15 22:09:12 +08:00
    我是 gevent 加上 queue , 通过控制 put 的速度来限制爬虫的速度
    honmaple
        7
    honmaple  
    OP
       2015-11-15 22:30:43 +08:00
    @MinskyNg @yzongyue 第一次听说 gevent ,我去看看
    HentaiMew
        8
    HentaiMew  
       2015-11-15 22:32:41 +08:00
    如果对应 WebService 有反爬措施的话,你要么不断的换 IP ,爬去过程中换 IP 高效的方式就是 5L 说的代理池,要么单线程甚至设置线程休息时间。
    ming2281
        9
    ming2281  
       2015-11-16 11:42:55 +08:00
    世界有 3 种 bug: 你的 bug,我的 bug,多线程的 bug
    :)
    janxin
        10
    janxin  
       2015-11-16 13:33:05 +08:00
    走代理,你这个跟多线程什么的根本没关系
    honmaple
        11
    honmaple  
    OP
       2015-11-16 14:15:45 +08:00
    @HentaiMew @janxin 能否帮忙看下 3L,我设置代理的方法有什么不对的地方
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1502 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:20 · PVG 01:20 · LAX 09:20 · JFK 12:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.