PythonPython3自学 爬虫实战

关于分布式爬虫思考

2017-08-15  本文已影响418人  LEONYao

这一篇,没有项目,没有教程。只不过是想记录下最近对于分布式爬虫的思考。半年前我去一家公司面试的时候,面试官问我什么是分布式爬虫,我只能回呵呵哒。在后来工作中渐渐地对这东西有了初步认识。爬虫无非两样东西

1937608650-1.png
代码来源:http://p0sec.net/index.php/archives/58/
# !/usr/bin/python
# -*- coding: utf-8 -*-
from spider import getPageUrl
from spider import getUrl
from spider import getImg
import requests
import threading
x = 0
#run函数
def Run():
    pageurls = getPageUrl.delay().get()#这个是celerytask
    for i in range(1,len(pageurls)):
        html = requests.get(pageurls[i]).text
        urllist = getUrl.delay(html).get()#这个也是celerytask
        for url in urllist:
            url = 'http://umei.cc'+url
            print url
            ImgHtml = requests.get(url).text
            imglist = getImg.delay(ImgHtml).get()#这个也是celerytask
            for imgurl in imglist: 
                print imgurl
                urllib.urlretrieve(imgurl,'/test/%s.jpg' % x)  
                global x
                x += 1
if __name__ == '__main__':
    Run()

我在上面标注的三个celery task。一般的操作都是 task.delay(),直接异步完成任务,不返回结果。可是这个爬虫有个返回结果的操作get()。这我就看不懂了,这等待结果返回才开始下一步,不成了堵塞么?
继续拿我的Youtube爬虫来探讨,按我的理解,celery的任务都是异步完成的。也就是说,我的视频爬取,下载上传全部异步完成。我只要写个爬虫爬取任务队列,然后建立写异步task(下载视频,上传视频,下载图片,上传图片),画个图吧

图片.png

通过task.delay()这个操作让任务自己在后台执行并完成,完美!原来celery分布式爬虫是这样使用!
现在思路清晰了,也知道怎么做了。但素!我不想写代码去验证思路和效率!

因为我懒

上一篇下一篇

猜你喜欢

热点阅读