知乎網
使用 API
爬取用戶信息在使用此項目時請先了解 Scrapy 項目源碼如何實現的:python
$ git clone -b docker-elasticsearch https://github.com/slzcc/Scrapy-Zhihu.git
這裏的爬蟲已經結合 Docker , 因爲沒有使用多線程工做因此這裏使用 Docker 啓動特定數量的服務進行爬數據, 鏡像拉去地址:git
$ docker pull registry.aliyuncs.com/slzcc/scrapy_zhihu:elasticsearch
項目內有 Dockerfile
提供參考。github
用到的服務列表:redis
Redis 使用 Lists 隊列保存須要爬取的 URL,這裏是爬蟲本身添加 URL 隊列, 隊列名稱爲 zhihu:start_urls
。
Elasticsearch 會保存 Cookie 信息,和最終爬取的用戶信息, 使用的 index
名爲 scrapy-zhihu
, type 爲 item
。docker
原理是須要使用用戶的 Cookie 進行爬蟲的登入受權,其中須要使用一臺擁有圖形化系統的服務器進行激活碼手動填寫,執行:api
$ docker run -e ELASTICSEARCH_DB_SERVER=http://localhost:9200 --rm -it -v ${PWD}/code:/Scrapy-Zhihu/code --net host registry.aliyuncs.com/slzcc/scrapy_zhihu:elasticsearch python rediszhihu/login.py
注意: 請結合下列的環境變量說明修改本身所需的環境。服務器
執行上述命令後會讓你填寫用戶,密碼,驗證碼,驗證碼須要手動查看 ~/code/code.gif
圖片內容進行填寫。
若是成功登入會把 Cookie 保存到本地的 Elasticsearch 的 scrapy-cookie
的 item
type 裏面, 若是本地沒有 Elasticsearch 服務請修改下面的環境變量進行修改, 這裏默認會讓你輸入兩次帳號密碼同一個帳號也是沒問題的。cookie
建議: 登入的 Cookie 能夠設置多個,若是想避免被屏蔽,這裏建議使用不一樣的帳號獲取 Cookie,這裏沒有試驗 Cookie 數量的上限值, 不作概述。多線程
拿到 Cookie 後須要設置 Elasticsearch 與 Redis 的服務器地址與端口, 默認localhost
, 可自定義環境變量:
Redis 服務的服務地址與端口:app
REDIS_DB_HOST=127.0.0.1 REDIS_DB_PORT=6379
Elasticsearch 服務地址, 還能夠設置變動上傳的 index
,以及 Cookie 保存的 index
, 並支持變動 type
。
ELASTICSEARCH_DB_SERVER=http://localhost:9200 ELASTICSEARCH_COOKIE_INDEX=scrapy-cookie ELASTICSEARCH_COOKIE_TYPE=item ELASTICSEARCH_DATA_INDEX=scrapy-zhihu ELASTICSEARCH_DATA_TYPE=item
後續查詢所需的環境變量, 其中 QUERY_ACCOUNT_NUMBER
是執行 rediszhihu/number_queries.py
查詢 Cookie 的最大查詢數量,QUERY_DATA_NUMBER
是執行 rediszhihu/number_queries.py
查詢數據最大顯示數量,TimeCounter
是執行 rediszhihu/remove_abandoned_cookie.py
後檢測每次 Cookie 驗證的時間,單位是秒
。
QUERY_ACCOUNT_NUMBER=100 QUERY_DATA_NUMBER=5 TimeCounter=60
爬蟲啓動:
$ docker run -d --net host registry.aliyuncs.com/slzcc/scrapy_zhihu:elasticsearch
請自行修改環境變量適合本身的環境執行爬蟲的啓動, 測試開啓數十個容器進行爬取數據無任何問題, 只要容器的機器內存足夠大能夠嘗試上百數量容器進行爬取進行測試。
我的測試
7
個容器 1 小時內能夠爬到 Elasticsearch 的數據在 1.4W 條左右。
可使用 Swarm
集羣模式啓動 10 數量的服務:
$ docker service create --name scrapy_zhihu -e ELASTICSEARCH_DB_SERVER=http://localhost:9200 -e REDIS_DB_HOST=127.0.0.1 --replicas 10 registry.aliyuncs.com/slzcc/scrapy_zhihu:elasticsearch
由於默認爬蟲是會在 Redis 隊列獲取 URL 進行爬取的,因此須要手動填入 URL 進行爬蟲的激活,進入 Redis 後執行:
lrange zhihu:start_urls 0 -1 lpush zhihu:start_urls https://www.zhihu.com/api/v4/members/stone-cok/followees?include=data%5B*%5D.url_token&offset=0&per_page=30&limit=30
第一條命令是建立 zhihu:start_urls
隊列,第二條是 URL 地址。
友情提示: 每一個容器會佔用 40MB+ 內存大小,請根據本身需求開啓容器的數量。
驗證 Cookie 也是使用簡單的多少時間內進行一次驗證,使用 Mongo 裏面的 Cookie 列表進行逐一請求進行排查,能夠設置 TimeCounter
變量設置時間,默認時間爲 60秒
,單位是 秒
,執行命令:
$ docker run -e ELASTICSEARCH_DB_SERVER=http://localhost:9200 -d --net host registry.aliyuncs.com/slzcc/scrapy_zhihu:elasticsearch python rediszhihu/remove_abandoned_cookie.py
若是 Cookie 沒問題會打印,若是有問題會先打印出有問題的 Cookie 並刪除,容器執行完會自動退出,這裏須要配合集羣進行啓動從而保證 Cookie 驗證容器持續進行檢測。
爬蟲使用了 Middleware
中間件進行用戶的 Cookie 、User-Agent 的動態變動,而且已對 Proxy 進行了配置,若是須要請打開 settings.py
的 rediszhihu.middlewares.ProxyMiddleware
註釋。並
定義 settings.py
裏面的 IP_LIST
列表這是使用代理的 IP 池,默認填寫了一個。
查看已經爬取用戶信息的數量,信息內容,Cookie 列表,可使用內置已經寫好的方法進行查詢:
$ docker run -e ELASTICSEARCH_DB_SERVER=http://localhost:9200 --rm -it --net host registry.aliyuncs.com/slzcc/scrapy_zhihu:elasticsearch python rediszhihu/number_queries.py
執行後會進入交互模式,請更換對應的環境編輯進行檢測,輸入的命令說明:
列出隊列等待被消費的 URL
元數據信息
人數數量柱狀圖
員工數量柱狀圖