Docker最全教程之Python爬网实战(二十二)
Python目前是流行度增長最快的主流編程語言,也是第二大最受開發者喜愛的語言(參考Stack?Overflow?2019開發者調查報告發布)。筆者建議.NET、Java開發人員可以將Python發展為第二語言,一方面Python在某些領域確實非常犀利(爬蟲、算法、人工智能等等),另一方面,相信我,Python上手完全沒有門檻,你甚至無需購買任何書籍!
由于近期在籌備4.21的長沙開發者大會,耽誤了不少時間。不過這次邀請到了騰訊資深技術專家、.NET中國社區領袖,微軟MVP張善友;52ABP開源框架的作者,微軟MVP梁桐銘;知名技術類作家汪鵬,騰訊高級工程師卓偉,騰訊云高級產品經理胡李偉等等,有興趣參加的朋友可以點擊公眾號菜單【聯系我們】==>【報名】進行報名,技術不分語言,亦沒有界限,期待和你分享、交流!
目錄
關于Python
官方鏡像
使用Python抓取博客列表
需求說明
了解Beautiful Soup
分析并獲取抓取規則
編寫代碼實現抓取邏輯
編寫Dockerfile
運行并查看抓取結果
?
關于Python
Python是一種計算機程序設計語言。是一種動態的、面向對象的腳本語言,最初被設計用于編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越多被用于獨立的、大型項目的開發。Python目前是流行度增長最快的主流編程語言,也是第二大最受開發者喜愛的語言(參考Stack?Overflow?2019開發者調查報告發布)。
Python是一種解釋型腳本語言,可以應用于以下領域:
Web 和 Internet開發
科學計算和統計
教育
桌面界面開發
軟件開發
后端開發
Python學習起來沒有門檻,但是通過它,你可以用更短的時間,更高的效率學習和掌握機器學習,甚至是深度學習的技能。不過單單只會Python對大多數人來說是不行的,你最好還掌握一門靜態語言(.NET/Java)。同時,筆者也建議.NET、Java開發人員可以將Python發展為第二語言,一方面Python在某些領域確實非常犀利(爬蟲、算法、人工智能等等),另一方面,相信我,Python上手完全沒有門檻,你甚至無需購買任何書籍!
官方鏡像
官方鏡像地址:https://hub.docker.com/_/python
注意,請認準官方鏡像:
使用Python抓取博客列表
需求說明
本篇使用Python來抓取我的博客園的博客列表,打印出標題、鏈接、日期和摘要。
博客地址:http://www.cnblogs.com/codelove/
內容如下所示:
了解Beautiful Soup
Beautiful?Soup?是一個可以從HTML或XML文件中提取數據的Python庫,支持多種解析器。Beautiful?Soup簡單的說,就是一個靈活又方便的網頁解析庫,是一個爬網利器。本篇教程我們就基于Beautiful?Soup來抓取博客數據。
Beautiful?Soup官方網站:https://beautifulsoup.readthedocs.io
主要解析器說明:
?
分析并獲取抓取規則
首先我們使用Chrome瀏覽器打開以下地址:http://www.cnblogs.com/codelove/
然后按下F12打開開發人員工具,通過工具我們梳理了以下規則:
博客塊(div.day)
博客標題(div. postTitle a)
其他內容獲取,如日期、博客鏈接、簡介,這里我們就不截圖了。
然后我們通過觀察博客路徑,獲取到url分頁規律:
根據以上分析,我們胸有成竹,開始編碼。
編寫代碼實現抓取邏輯
在編碼前,請閱讀BeautifulSoup官方文檔。然后根據需求,我們編寫Python的代碼如下所示:
# 關于BeautifulSoup,請閱讀官方文檔:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#id52
from bs4 import BeautifulSoup
import os
import sys
import requests
import time
import re
url = "https://www.cnblogs.com/codelove/default.html?page={page}"
?
#已完成的頁數序號,初時為0
page = 0
whileTrue:
??? page += 1
??? request_url = url.format(page=page)
??? response = requests.get(request_url)
??? #使用BeautifulSoup的html5lib解析器解析HTML(兼容性最好)
??? html = BeautifulSoup(response.text,'html5lib')
?
??? #獲取當前HTML的所有的博客元素
??? blog_list = html.select(".forFlow.day")
?
??? # 循環在讀不到新的博客時結束
??? ifnot?blog_list:
??????? break
?
??? print("fetch:", request_url)
?
??? for blog in?blog_list:
??????? # 獲取標題
??????? title = blog.select(".postTitlea")[0].string
??????? print('--------------------------'+title+'--------------------------');
?
??????? # 獲取博客鏈接
??????? blog_url = blog.select(".postTitlea")[0]["href"]
??????? print(blog_url);
?
??????? # 獲取博客日期
??????? date = blog.select(".dayTitlea")[0].get_text()
??????? print(date)
?
??????? # 獲取博客簡介
??????? des = blog.select(".postCon> div")[0].get_text()
??????? print(des)
?
??????? print('-------------------------------------------------------------------------------------');
?
如上述代碼所示,我們根據分析的規則循環翻頁并且從每一頁的HTML中抽取出了我們需要的博客信息,并打印出來,相關代碼已提供注釋,這里我們就不多說了。
編寫Dockerfile
代碼寫完,按照慣例,我們仍然是使用Docker實現本地無SDK開發,因此編寫Dockerfile如下所示:
# 使用官方鏡像
FROM?python:3.7-slim
?
# 設置工作目錄
WORKDIR /app
?
# 復制當前目錄
COPY . /app
?
# 安裝模塊
RUN pip install--trusted-host pypi.python.org -r requirements.txt
?
# Run app.py whenthe container launches
CMD ["python", "app.py"]
?
?
注意,由于我們使用到了比如beautifulsoup等第三方庫,因此我們需要安裝相關模塊。requirements.txt內容如下所示(注意換行):
html5lib
beautifulsoup4
requests
運行并查看抓取結果
構建完成后,我們運行起來結果如下所示:
?
| 往期內容 |
Docker最全教程——從理論到實戰(一)
Docker最全教程——從理論到實戰(二)
Docker最全教程——從理論到實戰(三)
Docker最全教程——從理論到實戰(四)
Docker最全教程——從理論到實戰(五)
Docker最全教程——從理論到實戰(六)
Docker最全教程——從理論到實戰(七)
Docker最全教程——從理論到實戰(八)? ??
Docker最全教程——從理論到實戰(九)
Docker最全教程之使用Tencent Hub來完成CI(十)Docker最全教程——數據庫容器化(十一)
Docker最全教程——數據庫容器化之持久保存數據(十二)
Docker最全教程——MongoDB容器化(十三)
Docker最全教程——Redis容器化以及排行榜實戰(十四)
Docker最全教程之Ubuntu下安裝Docker(十五)
Docker最全教程之樹莓派和Docker(十六)
Docker最全教程之使用TeamCity來完成內部CI、CD流程(十七)
Docker最全教程之使用Docker搭建Java開發環境(十八)
Docker最全教程之Go實戰,墻裂推薦(十九)
Docker最全教程之使用.NET Core推送釘釘消息(二十)
Docker最全教程之使用 Visual Studio Code玩轉Docker(二十一)
如果喜歡作者的文章,請關注“magiccodes”訂閱號以便第一時間獲得最新內容。本文版權歸作者和湖南心萊信息科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
QQ群:
編程交流群<85318032>?
產品交流群<897857351>
總結
以上是生活随笔為你收集整理的Docker最全教程之Python爬网实战(二十二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 跨设备前后端开发探索
- 下一篇: Python、Java、TypeScri