您好,登錄后才能下訂單哦!
這篇文章主要介紹python爬蟲怎么分布式獲取數據,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
假設我有三臺爬蟲服務器A、B和C。我想讓我所有的賬號登錄任務分散到三臺服務器、讓用戶抓取在A和B上執行,讓粉絲和關注抓取在C上執行,那么啟動A、B、C三個服務器的celery worker的命令就分別是
celery -A tasks.workers -Q login_queue,user_crawler worker -l info -c 1 # A服務器和B服務器啟動worker的命令,它們只會執行登錄和用戶信息抓取任務。
celery -A tasks.workers -Q login_queue,fans_followers worker -l info -c 1 # C服務器啟動worker的命令,它只會執行登錄、粉絲和關注抓取任務。
然后我們通過命令行或者代碼(如下)就能發送所有任務給各個節點執行了
# coding:utf-8 from tasks.workers import app from page_get import user as user_get from db.seed_ids import get_seed_ids, get_seed_by_id, insert_seeds, set_seed_other_crawled @app.task(ignore_result=True) def crawl_follower_fans(uid): seed = get_seed_by_id(uid) if seed.other_crawled == 0: rs = user_get.get_fans_or_followers_ids(uid, 1) rs.extend(user_get.get_fans_or_followers_ids(uid, 2)) datas = set(rs) # 重復數據跳過插入 if datas: insert_seeds(datas) set_seed_other_crawled(uid) @app.task(ignore_result=True) def crawl_person_infos(uid): """ 根據用戶id來爬取用戶相關資料和用戶的關注數和粉絲數(由于微博服務端限制,默認爬取前五頁,企業號的關注和粉絲也不能查看) :param uid: 用戶id :return: """ if not uid: return # 由于與別的任務共享數據表,所以需要先判斷數據庫是否有該用戶信息,再進行抓取 user = user_get.get_profile(uid) # 不抓取企業號 if user.verify_type == 2: set_seed_other_crawled(uid) return app.send_task('tasks.user.crawl_follower_fans', args=(uid,), queue='fans_followers', routing_key='for_fans_followers') @app.task(ignore_result=True) def excute_user_task(): seeds = get_seed_ids() if seeds: for seed in seeds: # 在send_task的時候指定任務隊列 app.send_task('tasks.user.crawl_person_infos', args=(seed.uid,), queue='user_crawler', routing_key='for_user_info')
以上是“python爬蟲怎么分布式獲取數據”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。