Python 3.6 抓取微博m站數據

Python 3.6 抓取微博m站數據

2019.05.01 更新內容

  1. containerid 能夠經過 "107603" + user_id 組裝獲得,無需請求我的信息獲取;
  2. 優化多線程抓取,修復以前因urllib.request全局定義,致使代理沒法正常切回本地IP;
  3. 優化分佈式抓取策略,由每臺機器順序獲取用戶ID 再拼裝URL抓取策略,修改成每臺機器順序獲取URL進行抓取。防止因爲某個微博帳號微博動態過多致使負責本ID的機器長時間運行,而其餘機器就要等待,浪費時間和資源。
  4. 加入IP代理池維護腳本,能夠定時維護代理池中的有效代理IP,及時剔除無效IP。
  5. 加入Redis定時消費腳本,解決因抓取結果過大致使redis性能降低。
  6. 增長Redis鏈接池ConnectionPool ,解決因Redis連接端口數過多致使Redis拒絕服務錯誤。
  7. 調整Redis數據存儲結構,採用list+set結合,存儲UID+URL
  8. 單機https代理消費約100元/天,單機5個進程+代理天天能達到1000萬條數據

本腳本截止20190501

類型 效果 代理花費
單機版(多線程+多進程) 150萬/天 0
單機版(多線程+多進程)+IP代理池 1000萬/天 100元/天
分佈式(多線程+多進程)+IP代理池 千萬~億級 100*機器數量/天

抓取流程

  1. 啓動save_uid.py腳本將準備好的微博用戶ID,存入Redis中,保存兩份;
    • r.lpush(WEIBO_UID_LIST_KEY, uid) 用於第一次遍歷UID請求每一個UID的總頁數,而後生成每一個UID的全部URL。
    • r.sadd(WEIBO_UID_SET_KEY, uid) 用於第二次請求,隨機獲取一個未抓取完的UID,去Redis中取當前UID剩餘的URL進行抓取,所有抓取完畢則移除此UID。
  2. 啓動proxy_pool.py腳本,初始化IP代理池(若是不使用代理,此步驟可略過)
    • target_money 用來獲取你所購買的IP代理剩餘金額的URL鏈接
    • target_ip 請求代理IP獲取有效的代理IP
    • targetUrl 用來校驗當前IP是否有效
    • WEIBO_PROXY_SET_KEY 存儲有效的代理IP
    • WEIBO_PROXY_418_SET_KEY 存儲已經出現418錯誤的IP,會循環利用,直到代理失效
    • WEIBO_ERROR_PROXY_SET_KEY 存儲已經使用過的IP(失效IP),用於後期校驗
  3. 啓動start_crawler.py腳本,開啓抓取任務
    • 首先會第一次請求遍歷UID,生成全部的URL,而後全部的線程獲取URL進行抓取
    • 先會嘗試使用本地IP進行抓取,本地IP出現418以後,嘗試去IP代理池獲取可以使用的IP,繼續抓取
    • 使用代理IP抓取超過60s,中止代理抓取改成使用本地IP,循環進行
    • 代理IP出現418,則先去嘗試使用本地IP,若是本地418再繼續更換代理
    • 若是代理池沒有可用IP,則休息30s,繼續使用本地IP
  4. 添加Linux定時腳本,定時處理Redis隊列中的抓取結果。

關於代理IP

  • 抓取微博的https鏈接,只能使用https代理,可選擇市面上其餘類型的代理商;
  • 免費的代理ip也有嘗試,不過效果不是很好

部署問題

  • 須要一臺主服務器(或者本機Windows電腦)來初始化運行 save_uid.pyproxy_pool.py腳本
  • 在Redis所在的服務器進行redis_consumer.py腳本的運行部署
  • start_crawler.py 能夠集羣部署到多臺服務器,但要保證都能網絡連通到Redis服務器
  • 添加定時腳本crontab -e 內容 以下
    0 */1 * * * nohup python /data/hw/redis_consume.py > /dev/null 2>&1 &
  • service cron restart 重啓cron定時服務
  • 建立start.sh 開啓多進程抓取
    ```bash
    #!/bin/bash
    # 開始爬蟲程序;python

    for((i=1;i<=5;i++));
    do
    nohup python /data/hw/start_crawler.py 1>/dev/null 2>&1 &
    echo "開啓爬蟲程序進程"+$i
    donegit

    sleep 5s
    echo "已開啓如下進程"
    ps -ef|grep pythongithub

    ```redis

20190501目錄

  • proxy_pool.py #維護IP代理池
  • redis_consume.py #redis定時消費
  • save_uid.py #初始化uid
  • start.sh #一鍵啓動腳本
  • start_crawler.py #開啓抓取程序,能夠集羣部署

舊版本README

README_20190307.mdsql

項目地址

https://github.com/JiaoHongwei/Crawler_weiboapi

相關文章
相關標籤/搜索