Try   HackMD

建立scrapy爬蟲專案的詳細過程

前言

在VirtualBox的Linux虛擬機中安裝scrapy,並且爬取ptt,把爬取下來的文字儲存在mongodb的資料庫中。使用的Linux版本為Ubuntu 22.04。下面要進行的工作

  • 設定虛擬機,將mongodb的網頁介面mongo-express的通訊埠開放到宿主機能存取到,才能建立documents
  • 設定dockernetworkvolume兩部分,並且做成docker-compose可以執行的yaml
  • 在Web介面上建立ptt需要的資料庫。
  • 建立scrapy的專案並且寫程式

前題是已經將所有需要的函式庫和套件都安裝好了,參考這邊:https://hackmd.io/uvrlutTrT92ohSPl8jk9zw

virtualbox的設定

讓宿主機能存取虛擬機中docker執行mongo-express的介面

在目前虛擬機的「設定」/「網路」/「介面卡1」/「進階」/「連接埠轉送」中加一個如下:

建立docker環境

docker的網路

docker network create mongodb
(JoshDev)joshhu:~/ $ docker network ls [0:21:24] NETWORK ID NAME DRIVER SCOPE 2b0d221bda1c bridge bridge local 96246058507a dalai_default bridge local deff2c3e1e0d host host local a71fbef86ae5 mongodb bridge local 09a70acae6f0 none null local (JoshDev)joshhu:~/ $

建立docker的儲存(好像沒用)

docker volume create mongodb_storage
(JoshDev)joshhu:~/ $ docker volume ls [0:21:43] DRIVER VOLUME NAME local pttbatch_mongodb_storage

建立base.yaml

先進入工作目錄,在工作目錄下建立

cd ~workspace/scrapy

接下來建立下面的檔案,如果是在明新的虛擬機中,這個檔案已經建立完畢了。

# for docker compose version: '3.1' services: mongo: image: mongo container_name: mongo volumes: - mongodb_storage:/data/db restart: always ports: - 127.0.0.1:12346:27017 environment: MONGO_INITDB_ROOT_USERNAME: must MONGO_INITDB_ROOT_PASSWORD: must networks: - inside mongo-express: image: mongo-express container_name: mongo-express restart: always ports: - 8081:8081 environment: ME_CONFIG_MONGODB_ADMINUSERNAME: must ME_CONFIG_MONGODB_ADMINPASSWORD: must ME_CONFIG_MONGODB_URL: mongodb://must:must@mongo:27017/ networks: - inside volumes: mongodb_storage: {} networks: inside: name: mongodb

可以觀看這個檔案存不存在:

(base) must@must:~/workspace/scrapy$ ls -al total 12 drwxrwxr-x 2 must must 4096 五 30 13:42 . drwxrwxr-x 4 must must 4096 五 30 13:42 .. -rw-rw-r-- 1 must must 727 五 25 00:36 base.yaml (base) must@must:~/workspace/scrapy$

啟動mongodbmongo-express

進入虛擬機之後,切換到對應的目錄,並且啟動docker compose

cd ~workspace/scrapy docker compose -f base.yaml up -d

啟動成功後,使用docker ps查看是否啟動成功

(base) must@must:~/workspace/scrapy$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e945225271df mongo-express "tini -- /docker-ent…" 3 minutes ago Up 2 minutes 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp mongo-express 2beeb19c362c mongo "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 127.0.0.1:12346->27017/tcp mongo (base) must@must:~/workspace/scrapy$

可以進入虛擬機的桌面,然後用瀏覽器開啟下列網址:https://0.0.0.0:8081

如果要把服務停止,就輸入下面:

docker compose -f base.yaml down

安裝爬ptt的環境

安裝scrapy及ptt相關的套俏

這邊就延用安裝selenium時的同一個虛擬環境,不創建新的虛擬環境了,因為要共用很多套件。
這邊新安裝幾個。

  • scrapy
  • mongodb
  • ptt
  • ptt相關套件
cd ~workspace/selenium pipenv shell pip install scrapy pip install pymongo pip install pyptt==0.9.50 pip install nest_asyncio

建立爬蟲需要的資料庫

建立一個MongoDB的資料庫ptt

  1. 進入虛擬機桌面,在確定Docker服務都啟動的情況下,從瀏覽器進入https://0.0.0.0:8081

  2. 輸入ptt並且按下「Create Database」

  3. 此時首頁應該會出現一個「ptt」的資料庫

建立放看板的Collection

  1. 建立collection

  2. 此collection放ptt的所有看板

  3. 預設不檢查,執行程式前先清掉