知乎Elasticsearch Crawler

Scrapy 爬蟲登入 知乎網 使用 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

  • Elasticsearch
  • Redis

Redis 使用 Lists 隊列保存須要爬取的 URL,這裏是爬蟲本身添加 URL 隊列, 隊列名稱爲 zhihu:start_urls
Elasticsearch 會保存 Cookie 信息,和最終爬取的用戶信息, 使用的 index 名爲 scrapy-zhihu, type 爲 itemdocker

註冊 Cookie

原理是須要使用用戶的 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 是否失效

驗證 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

執行後會進入交互模式,請更換對應的環境編輯進行檢測,輸入的命令說明:

  • data 爲直接查看數據。
  • num 爲查看爬取數據總數。
  • cookie 查看 cookie 列表。

展現圖

隊列展現圖

列出隊列等待被消費的 URL

數據展現圖

元數據信息

索引信息

性別餅圖

粉絲名次柱狀圖

行業分佈柱狀圖

職業分佈柱狀圖

校友數量柱狀圖

人數數量柱狀圖

員工數量柱狀圖

相關文章
相關標籤/搜索