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

while True:

    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")

 

    # 循環在讀不到新的博客時結束

    if not blog_list:

        break

 

    print("fetch: ", request_url)

 

    for blog in blog_list:

        # 獲取標題

        title = blog.select(".postTitle a")[0].string

        print('--------------------------'+title+'--------------------------');

 

        # 獲取博客鏈接

        blog_url = blog.select(".postTitle a")[0]["href"]

        print(blog_url);

 

        # 獲取博客日期

        date = blog.select(".dayTitle a")[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 when the container launches

CMD ["python", "app.py"]

  

注意,由於我們使用到了比如beautifulsoup等第三方庫,因此我們需要安裝相關模塊。requirements.txt內容如下所示(注意換行):

html5lib

beautifulsoup4

requests

 

運行並查看抓取結果

構建完成后,我們運行起來結果如下所示:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM