JD價格監控【docker版】
阿新 • • 發佈:2021-02-04
> 快過年了,準備買些年貨,於是頻繁刷購物網站對比價格,搞得還是挺頭大的。我想能不能做個應用抓取實時價格並在低於預期價格後進行提醒,於是就有了本篇文章。本文主要分享怎麼將本地專案打包成映象並推送到dockerhub上
**最初用的是node+cheerio,請求商品頁面通過選擇器解析商品名稱和價格。但是多次除錯後頁面會在頁面內重定向,這樣就抓取不到了,應該是觸發了jd的反爬蟲機制。在換了幾種方式無果後將眼光投向了github,最終fork了一份由python實現的方案進行改善。**
### 效果
![](https://img2020.cnblogs.com/blog/650193/202102/650193-20210203150434665-1702057228.png)
![](https://img2020.cnblogs.com/blog/650193/202102/650193-20210203150455661-1469610699.png)
![](https://img2020.cnblogs.com/blog/650193/202102/650193-20210203150522267-962363014.png)
### 技術棧
1. 前端:Boostrap+Jquery
2. 後端:Python+Flask
3. 爬蟲:requests+beautifulsoup4+PyExecJS
4. 代理池:https://github.com/0xHJK/Proxies 簡易實現
### fork後新增自定義商品欄位,增加釘釘通知,增加docker啟動。
### 注意
1. 需要呼叫nodejs來獲取token,所以不僅需要python,還需要node環境。
2. 因為配置檔案需要自己設定,所以新增config資料夾方便檔案掛載
``` dockerfile
# 基於python建立映象
FROM python:3.7.0
# 設定工作目錄
WORKDIR /usr/src/app
# 設定pip映象
RUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simple
RUN pip config set install.trusted-host mirrors.aliyun.com
# 把本地檔案複製到映象工作目錄下
COPY . .
# 安裝node環境
RUN wget https://npm.taobao.org/mirrors/node/latest-v12.x/node-v12.16.1-linux-x64.tar.xz && tar -xf node-v12.16.1-linux-x64.tar.xz -C /opt
# 設定環境變數
ENV EXECJS_RUNTIME=$PATH:/opt/node-v12.16.1-linux-x64/bin
RUN ln -s /opt/node-v12.16.1-linux-x64/bin/node /usr/local/bin/
RUN ln -s /opt/node-v12.16.1-linux-x64/bin/npm /usr/local/bin/
# 列印版本
RUN echo 'node 版本:' && node -v
RUN echo 'python 版本:' && python -V
# 安裝依賴
RUN pip install --no-cache-dir -r requirements.txt
# 啟動
CMD cd web && python server.py
```
## 生成並推送本地映象到dockerhub
1. 生成本地映象
`docker build -t jdspider .`
2. 修改本地映象和dockerhub上一樣
`docker tag jdspider yimijianfang/jd-spider:0.6`
3. 登入dockerhub
`docker login`
4. 推送
`docker push yimijianfang/jd-spider:0.6`
不想上傳到dockerhub還可以在本地打映象壓縮包
```shell
# 打包映象到本地
docker save -o jdspider.tar jdspider
# 解壓載入映象
docker load -i jdspider.tar
```
### 使用方法
在宿主機上新增配置檔案
```shell
cd /data/jd-spider/config
touch config.cfg
```
```
# config.cfg
[mail]
host = smtp.qq.com
port = 25
user = [email protected]
pass = xxx
sender = [email protected]
[dingding]
webhook = https://oapi.dingtalk.com/robot/send?access_token=xxx
[select]
option = mail
```
```shell
# 啟動docker
docker run --name jdspider -p 5858:5858 -v /data/jd-spider/config:/usr/src/app/web/config -d yimijianfang/jd-spider:0.6
```
開啟http://ip:5858檢視效果,另外如果使用郵箱需要申請開放25埠
#### github地址:https://github.com/yimijianfang/mall-monitor
#### 其他專案,歡迎star
vue滑塊驗證元件 https://github.com/yimijianfang/vue-drag-verify
jquery音樂播放外掛 https://github.com/yimijianfang/music
vue元件props自動生成器 https://github.com/yimijianfang/auto-props