Python編程基礎(chǔ)與應(yīng)用第14章 項目開發(fā)實戰(zhàn)-茶葉數(shù)據(jù)爬蟲開發(fā)_第1頁
Python編程基礎(chǔ)與應(yīng)用第14章 項目開發(fā)實戰(zhàn)-茶葉數(shù)據(jù)爬蟲開發(fā)_第2頁
Python編程基礎(chǔ)與應(yīng)用第14章 項目開發(fā)實戰(zhàn)-茶葉數(shù)據(jù)爬蟲開發(fā)_第3頁
Python編程基礎(chǔ)與應(yīng)用第14章 項目開發(fā)實戰(zhàn)-茶葉數(shù)據(jù)爬蟲開發(fā)_第4頁
Python編程基礎(chǔ)與應(yīng)用第14章 項目開發(fā)實戰(zhàn)-茶葉數(shù)據(jù)爬蟲開發(fā)_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)XXXX

大學(xué)XX

學(xué)院XXX

教授2學(xué)習(xí)目標(biāo):理解軟件工程思維掌握軟件工程開發(fā)流程掌握網(wǎng)絡(luò)爬蟲開發(fā)技術(shù)思政內(nèi)涵:設(shè)計網(wǎng)絡(luò)數(shù)據(jù)爬蟲,爬取黨的報告、政府工作報告,并用可視化詞云展示,從而學(xué)習(xí)黨和政府的方針政策。第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)314.1

軟件工程14.1.1

學(xué)習(xí)軟件工程的意義軟件工程是一門研究用工程化方法構(gòu)建和維護有效、實用和高質(zhì)量的軟件的學(xué)科,它涉及程序設(shè)計語言、數(shù)據(jù)庫、軟件開發(fā)工具、系統(tǒng)平臺、協(xié)議、標(biāo)準(zhǔn)等。利用軟件系統(tǒng)所設(shè)計的產(chǎn)品有電子郵件、嵌入式系統(tǒng)、人機界面、辦公套件、操作系統(tǒng)、編譯器、數(shù)據(jù)庫、游戲等。同時,各個行業(yè)幾乎都有計算機軟件的應(yīng)用,如工業(yè)、農(nóng)業(yè)、銀行、航空、政府部門等。這些應(yīng)用促進了經(jīng)濟和社會的發(fā)展,也提高了工作效率和生活效率。信息化、數(shù)字化、智能化時代軟件產(chǎn)品無處不在,以軟件工程化的思維認(rèn)識編程問題、設(shè)計軟件產(chǎn)品是很有必要的。遺憾的是,很多領(lǐng)域的專家在雖然工作中常常應(yīng)用編程,但并不是所有的4專家都具有計算機等相關(guān)專業(yè)背景,他們對軟件工程化方法并不熟悉。同時,他們也認(rèn)為自己并非軟件工程師,沒必要學(xué)習(xí)軟件工程知識。這導(dǎo)致其所開發(fā)的軟件產(chǎn)品在面對生產(chǎn)環(huán)境時存在著諸多的問題。例如,當(dāng)今增長較快的領(lǐng)域之一的數(shù)據(jù)科學(xué)領(lǐng)域,大量的數(shù)據(jù)工程師、數(shù)據(jù)科學(xué)家都只是熟悉數(shù)學(xué)、統(tǒng)計學(xué)等領(lǐng)域知識,以至于軟件工程師常常批評數(shù)據(jù)科學(xué)家對工程化編程概念知之甚少。作為一名數(shù)據(jù)科學(xué)家,所編寫的代碼很可能會進入生產(chǎn)環(huán)境。因此,為保證軟件質(zhì)量,學(xué)習(xí)軟件工程基本知識是十分必要的。類似的情況也適用于其他領(lǐng)域。如果我們的工作需要編寫代碼,那么我們至少應(yīng)該熟悉軟件工程的基本知識,理解軟件工程思維,熟悉軟件工程的設(shè)計流程,并掌握保證軟件質(zhì)量所需的基本技術(shù)。第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)514.1.2 軟件工程概述1.

軟件工程的定義軟件工程至今沒有一個統(tǒng)一的定義,很多學(xué)者、組織機構(gòu)都分別給出了自己認(rèn)可的定義。下面列出幾個軟件工程的定義。

IEEE

在軟件工程術(shù)語匯編中的定義:①將系統(tǒng)化的、嚴(yán)格約束的、可量化的方法應(yīng)用于軟件的開發(fā)、運行和維護,即將工程化應(yīng)用于軟件;②對①中所述方法的研究?!队嬎銠C科學(xué)技術(shù)百科全書》中的定義:軟件工程是應(yīng)用計算機科學(xué)、數(shù)學(xué)、邏輯學(xué)及管理科學(xué)等原理來開發(fā)軟件的工程。軟件工程借鑒傳統(tǒng)工程的原則、方法,以提高質(zhì)量、降低成本和改進算法。其中,計算機科學(xué)、數(shù)學(xué)用于構(gòu)建模型與算法,工程科學(xué)用于制定規(guī)范、設(shè)計范型、評估成本及確定權(quán)衡,管理科學(xué)用于計劃、資源、質(zhì)量、成本等的管理。6

ISO

9000

對軟件工程過程的定義:軟件工程過程是把輸入轉(zhuǎn)化為輸出的一組彼此相關(guān)的資源和活動。其他定義:①在運行時,能夠提供所要求功能和性能的指令或計算機程序集合。②程序能夠滿意地處理信息的數(shù)據(jù)結(jié)構(gòu)。③描述程序功能需求及程序如何操作和使用所要求的文檔。以開發(fā)語言作為描述語言,可以認(rèn)為:軟件=程序+數(shù)據(jù)+文檔。比較認(rèn)可的一種定義認(rèn)為:軟件工程是研究和應(yīng)用如何以系統(tǒng)性的、規(guī)范化的、可定量的過程化方法去開發(fā)和維護軟件,以及如何把經(jīng)過時間考驗而證明正確的管理技術(shù)和當(dāng)前能夠得到的最好的技術(shù)方法結(jié)合起來。2.

軟件工程的發(fā)展軟件是由計算機程序和程序設(shè)計的概念發(fā)展演化而來的,是在程序和程序設(shè)計發(fā)展到一定規(guī)模并且逐步商品化的過程中形成的。軟件的發(fā)展大致分為以第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)7下

4

個階段。(1)

無軟件概念階段(1946—1955

年)。此階段的特點:尚無軟件的概念,程序設(shè)計主要圍繞硬件進行開發(fā),規(guī)模很小,工具簡單,無明確分工(開發(fā)者和用戶),程序設(shè)計追求節(jié)省空間和編程技巧,無文檔資料(除程序清單外),主要用于科學(xué)計算。(2)

意大利面階段(1956—1970

年)。此階段的特點:硬件環(huán)境相對穩(wěn)定,出現(xiàn)了“軟件作坊”的開發(fā)組織形式,開始廣泛使用產(chǎn)品軟件(可購買),從而建立了軟件的概念。但程序員編碼隨意,整個軟件看起來像一碗意大利面一樣雜亂無章,隨著軟件系統(tǒng)規(guī)模的壯大,軟件產(chǎn)品的質(zhì)量不高,生產(chǎn)效率低下,從而導(dǎo)致了“軟件危機”的產(chǎn)生。(3)

軟件工程階段(1970

年至今)?!败浖C”的產(chǎn)生迫使人們不得不研究、改變軟件開發(fā)的技術(shù)手段和管理方法,從此軟件生產(chǎn)進入了軟件工程時代。此階段的特點:硬件已向巨型化、8微型化、網(wǎng)絡(luò)化和智能化

4

個方向發(fā)展,數(shù)據(jù)庫技術(shù)已成熟并得到了廣泛應(yīng)用,第三代、第四代語言出現(xiàn)。第一代軟件技術(shù):結(jié)構(gòu)化程序設(shè)計在數(shù)值計算領(lǐng)域取得優(yōu)異成績;第二代軟件技術(shù):軟件測試技術(shù)、方法、原理用于軟件生產(chǎn)過程;第三代軟件技術(shù):處理需求定義技術(shù)用于軟件需求分析和描述。(4)

面向?qū)ο箅A段(1990

年至今)。這一階段提出了面向?qū)ο蟮母拍詈头椒āC嫦驅(qū)ο蟮乃枷氚嫦驅(qū)ο蟮姆治?object

oriented

analysis,OOA),面向?qū)ο蟮脑O(shè)計(object

orienteddesign,OOD),以及面向?qū)ο蟮木幊虒崿F(xiàn)(object

oriented

programming,OOP)等。軟件工程領(lǐng)域的主要研究熱點是軟件復(fù)用和軟件構(gòu)件技術(shù),它們被視為解決“軟件危機”的一條現(xiàn)實可行的途徑,是軟件工業(yè)化生產(chǎn)的必由之路。第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)93.

軟件工程的原則著名軟件工程專家巴利

?

玻姆(Barry

W.

Boehm)綜合有關(guān)專家和學(xué)者的意見總結(jié)了多年來開發(fā)軟件的經(jīng)驗,并提出了軟件工程的

7

條基本原理。用分階段的生存周期計劃進行嚴(yán)格的管理。堅持進行階段評審。實行嚴(yán)格的產(chǎn)品控制。采用現(xiàn)代程序設(shè)計技術(shù)。軟件工程結(jié)果應(yīng)能清楚地審查。開發(fā)小組的人員應(yīng)該少而精。承認(rèn)不斷改進軟件工程實踐的必要性。在進行程序設(shè)計時要遵循

8

條原則:抽象;信息隱蔽;模塊化;局部化;確定性;一致性;完備性;可驗證性。104.

軟件工程的內(nèi)容軟件工程是指為獲得軟件產(chǎn)品,在軟件工具的支持下由軟件工程師完成的一系列軟件工程活動,包括以下

4

個方面。(1)

P(plan)——軟件規(guī)格說明。規(guī)定軟件的功能及其運行時的限制。(2)

D(do)——軟件開發(fā)。開發(fā)出滿足規(guī)格說明的軟件。(3)

C(check)——軟件確認(rèn)。確認(rèn)開發(fā)的軟件能夠滿足用戶的需求。(4)

A(action)——軟件演進。軟件在運行過程中不斷改進以滿足客戶新的需求??梢园衍浖こ袒顒臃譃橐韵?/p>

3

個階段。定義階段:可行性研究初步項目計劃、需求分析。開發(fā)階段:概要設(shè)計、詳細(xì)設(shè)計、實現(xiàn)、測試。運行和維護階段:運行、維護、廢棄。第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)1114.1.3 軟件項目開發(fā)流程在工程項目開發(fā)實踐中,軟件項目開發(fā)流程可分為需求分析、方案制定、設(shè)計描述、制造編程、檢驗部署

5

個階段,下面分別介紹。需求分析階段需求分析階段包括項目可行性分析和功能需求分析兩部分,明確項目可行性和項目需求,包括項目的功能、性能、安全等方面。這需要與客戶或用戶進行充分的溝通,了解他們的需求和期望,以及項目的預(yù)算和時間限制等。階段成果是可行性分析報告和需求規(guī)格說明書等。方案制定階段方案制定階段可以分為項目技術(shù)選型和架構(gòu)設(shè)計兩部分。1)

技術(shù)選型12技術(shù)選型是指考慮項目的需求、開發(fā)成本、維護成本等因素,選擇有關(guān)技術(shù)、軟件版本、框架、數(shù)據(jù)庫技術(shù)、前端技術(shù)等。2)

架構(gòu)設(shè)計架構(gòu)設(shè)計是指考慮項目的業(yè)務(wù)邏輯、數(shù)據(jù)流程等,決定項目的可擴展性、可維護性等方面。階段成果是方案文檔。3.

設(shè)計描述階段設(shè)計描述階段可以分為項目概要設(shè)計和詳細(xì)設(shè)計兩部分。本階段主要應(yīng)用第

4

章介紹的計算思維方法進行問題分析和設(shè)計。1)

概要設(shè)計概要設(shè)計不僅決定了項目的模塊劃分、模塊間的依賴關(guān)系、模塊功能等方面,還決定了項目的數(shù)據(jù)存儲方式、數(shù)據(jù)結(jié)構(gòu)、訪問方式、數(shù)據(jù)安全等方面。第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)13階段成果是概要設(shè)計文檔。2)

詳細(xì)設(shè)計詳細(xì)設(shè)計也稱為過程設(shè)計,決定了函數(shù)、類,以及接口設(shè)計等方面,主要是編碼的細(xì)節(jié)描述。在實際項目中,詳細(xì)設(shè)計這個過程可以省略,可以直接根據(jù)概要設(shè)計編程。階段成果是詳細(xì)設(shè)計文檔。制造編程階段制造編程階段包括編程和調(diào)試兩部分。此階段需要根據(jù)設(shè)計文檔進行編碼實現(xiàn)并進行模塊調(diào)試。編碼實現(xiàn)需要遵循一定的編碼規(guī)范,包括變量命名、代碼注釋、代碼風(fēng)格等。階段成果是程序代碼。檢驗部署階段檢驗部署階段包括檢驗測試和部署運行兩部分。測試包括單元測試、集成測試、系統(tǒng)測試,以發(fā)現(xiàn)代碼中的問題,保證項目的質(zhì)量和穩(wěn)定性。部署運行14需考慮項目的運行環(huán)境、服務(wù)器配置等方面,從而進行部署和維護,以保證項目的正常運行。實際開發(fā)中,遵循項目開發(fā)流程可以更好地進行項目開發(fā),提高開發(fā)效率和項目質(zhì)量。這一項目開發(fā)思維是針對所有工程項目的一種思維,在任何實踐活動中采用這一信息物理系統(tǒng)工程思維都是很有益的。

14.2 Python

網(wǎng)絡(luò)爬蟲開發(fā)Python

被稱為全能編程語言,建立了全球最大的軟件編程計算生態(tài),其用途覆蓋了從硬件開發(fā)到元宇宙軟件開發(fā),從日常生活軟件開發(fā)到經(jīng)濟金融、社會政治軟件開發(fā)的信息技術(shù)應(yīng)用的全領(lǐng)域,貫穿了信息物理系統(tǒng)的全流程。通過Python

項目實戰(zhàn),可以深入理解軟件工程思維,提高

Python

編程技能,并實踐工程化開發(fā)Python

軟件項目。第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)15網(wǎng)絡(luò)爬蟲(又稱為網(wǎng)頁蜘蛛、網(wǎng)絡(luò)機器人),是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或腳本。我們所熟悉的一系列搜索引擎都是大型的網(wǎng)絡(luò)爬蟲,如百度、搜狗、谷歌搜索等。每個搜索引擎都擁有自己的爬蟲程序,如百度的爬蟲Baiduspider、搜狗的爬蟲

Sogouspider

等。網(wǎng)絡(luò)爬蟲技術(shù)的流行基于網(wǎng)絡(luò)技術(shù)的發(fā)展和各行各業(yè)對數(shù)據(jù)價值的重視。很多重要決策的背后都以數(shù)據(jù)為支撐。網(wǎng)絡(luò)爬蟲可以實現(xiàn)數(shù)據(jù)的收集。網(wǎng)絡(luò)爬蟲按照系統(tǒng)結(jié)構(gòu)和功能分為通用爬蟲、聚焦爬蟲、增量爬蟲、深層爬蟲。本項目以開發(fā)一個收集茶葉知識的聚焦爬蟲為例,介紹Python

軟件工程項目開發(fā)技術(shù)。14.2.1

需求分析中國是茶的故鄉(xiāng),也是茶葉生產(chǎn)大國。茶作為一種天然的健康飲品,具有悠久的消費歷史和廣大的消費群體。近年來,隨著人們生活水平的不斷提高,對健康的重視程度日益上升。飲茶作為一種健康的生活習(xí)慣,符合現(xiàn)階段消費16者對健康和高品質(zhì)生活的追求。本項目主要對茶葉知識相關(guān)數(shù)據(jù)進行爬取,并對數(shù)據(jù)進行分析處理、歸類和格式化存儲,便于大眾對茶葉知識的整理學(xué)習(xí)。項目需求特點如下。本項目是針對特定茶葉知識主題的爬蟲,其目的是爬取茶葉知識。針對靜態(tài)和動態(tài)網(wǎng)頁爬取數(shù)據(jù)。對茶葉分類、知名品種、茶葉功效進行整理,分析數(shù)據(jù)。對數(shù)據(jù)進行格式化數(shù)據(jù)庫存儲,方便大眾查詢學(xué)習(xí)。14.2.2

方案規(guī)劃本項目是一個有關(guān)茶葉知識的輕量級爬蟲,根據(jù)項目需求,整體架構(gòu)分為三部分:控制器、解析器和資源庫。控制器負(fù)責(zé)抓取網(wǎng)絡(luò)頁面,解析器負(fù)責(zé)解析和提取網(wǎng)頁數(shù)據(jù),資源庫負(fù)責(zé)存儲茶葉知識。程序采用控制臺命令行字符界面方式運行。第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)17在技術(shù)方面選擇argparse

解析命令行選項和參數(shù),用

Selenium

爬取網(wǎng)頁數(shù)據(jù),運用

BeautifulSoup4

解析網(wǎng)頁數(shù)據(jù),通過輕量級數(shù)據(jù)庫

SQLite

存儲整理后的茶葉知識數(shù)據(jù)。argparse

是Python

內(nèi)置的一個用于進行命令行選項與參數(shù)解析的模塊。argparse

模塊使編寫用戶友好的命令行界面變得容易。在程序中定義好需要的參數(shù),argparse

將找出并解析這些參數(shù)。argparse

模塊還會自動生成幫助和使用消息,并在用戶為程序提供無效參數(shù)時發(fā)出錯誤。Selenium

是一個Web

的自動化測試工具,最初是為網(wǎng)站自動化測試而開發(fā)的,Selenium

可以直接運行在瀏覽器上,它支持所有主流的瀏覽器。Selenium

可以控制瀏覽器發(fā)送請求,讓瀏覽器自動加載頁面,獲取需要的數(shù)據(jù),甚至頁面截屏。因此,Selenium

常常應(yīng)用于爬蟲領(lǐng)域。BeautifulSoup4

庫也稱為bs4

庫或BeautifulSoup

庫,是Python

中用于進行網(wǎng)頁分析的第三方庫。它可以快速地將抓取到的網(wǎng)頁轉(zhuǎn)換為一棵DOM18樹,并提供類Python

語法來查找、定位、修改一棵轉(zhuǎn)換后的DOM

樹。SQLite

是一款輕型的數(shù)據(jù)庫,是遵守

ACID

的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。Python

內(nèi)置了SQLite,只要安裝了

Python,就可以直接使用

SQLite。SQLite是一個進程內(nèi)的庫,實現(xiàn)了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的

SQL數(shù)據(jù)庫引擎。它是一個零配置的數(shù)據(jù)庫,不需要在系統(tǒng)中配置,就可以按應(yīng)用程序需求進行靜態(tài)或動態(tài)連接,直接訪問其存儲文件。14.2.3

設(shè)計描述本項目程序規(guī)模不大,主要利用已有的Python

標(biāo)準(zhǔn)庫和第三方庫的功能模塊,通過網(wǎng)頁抓取、解析和存儲流程控制,完成爬蟲系統(tǒng)功能。通過面向過程的結(jié)構(gòu)化函數(shù)編程即可實現(xiàn),不需要設(shè)計描述問題域的新類型,因此,系統(tǒng)設(shè)計省略了詳細(xì)設(shè)計部分,只需要根據(jù)項目開發(fā)方案進行概要設(shè)計。本項目爬蟲程序運行邏輯如圖

14.1

所示,包括主程序、讀取

URL、抓取頁第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)19面、解析網(wǎng)頁、創(chuàng)建數(shù)據(jù)庫、寫入數(shù)據(jù)庫和下載圖片。按照耦合的緊密程度,分為主程序模塊、網(wǎng)頁操作模塊和數(shù)據(jù)庫操作模塊。圖

14.1

爬蟲程序邏輯示意圖輸入文件input.txt

中是爬取網(wǎng)頁的URL

地址列表,輸出文件teas.db

是一個SQLite

數(shù)據(jù)庫,用于存儲爬取的茶葉知識數(shù)據(jù)。同時,下載的圖片將被存儲到images

目錄中。1.

主程序模塊概要設(shè)計在工程項目

project

目錄下新建

chapter16

目錄,

新建主程序20spider_page.py

文件,完成程序主控邏輯設(shè)計,如程序段P14.1

所示。P14.1

命令行界面交互,調(diào)用主函數(shù)#

主函數(shù)def

main(database:str,input_urls:str):#

命令行界面交互輸出passif

name

==

'

main

':#

命令行界面參數(shù)解析pass#

調(diào)用主函數(shù)main(database=database_file,input_urls=

input_file)第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)212.

網(wǎng)頁操作模塊概要設(shè)計在chapter16

目錄下新建Python

包utility(包含

inity

.py

文件的文件夾),在utility

中新建用于網(wǎng)頁操作的url_handle.py

文件,完成網(wǎng)頁相關(guān)操作功能邏輯設(shè)計,如程序段P14.2

所示。P14.2

讀取url

列表,抓取和解析網(wǎng)頁

#

從輸入文本文件中讀取url

列表def

read_url(file_path:str):pass#

從Web

下載網(wǎng)頁def

get_page(url:str):passdef

extract_page(page_contents:str): #

解析網(wǎng)頁pass223.

數(shù)據(jù)庫操作模塊概要設(shè)計在utility

包下面新建用于數(shù)據(jù)庫操作的db_handle.py

文件,完成數(shù)據(jù)庫和圖片下載相關(guān)操作功能邏輯設(shè)計,如程序段P14.3

所示。P14.3

創(chuàng)建數(shù)據(jù)庫、寫入數(shù)據(jù)庫和下載圖片#

創(chuàng)建數(shù)據(jù)庫def

create_database(db_path:str):pass#

寫入數(shù)據(jù)庫def

save_to_database(db_path:str,records:list):pass#

根據(jù)數(shù)據(jù)庫中圖片url

下載圖片def

download_image(db_path:str,img_path:str):pass第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)2314.2.4 編程實現(xiàn)1.

抓取網(wǎng)頁程序在chapter16

目錄下,新建文本文件

input.txt,將茶葉分類與功效的網(wǎng)頁url

地址存放其中。修改、完善設(shè)計描述中的

read_url()函數(shù)和get_page()函數(shù)。讀取input.txt

文件的url

列表并抓取網(wǎng)頁的程序如程序段P14.4

所示。P14.4

讀取url

列表,抓取網(wǎng)頁fromseleniumimportwebdriverfrombs4importBeautifulSoupimport

time#

讀取url

列表24def

read_url(file_path:str):try:withopen(file_path)asf:url_list=

f.readlines()return

url_listexcept

FileNotFoundError:print(f'找不到文件:{file_path}')exit(2)#

抓取頁面,從Web

下載頁面def

get_page(url:str):driver

=

webdriver.Chrome() #

以谷歌瀏覽器驅(qū)動driver.get(url) #

按網(wǎng)址獲取網(wǎng)頁js=

"window.scrollTo(0,

document.body.scrollHeight)" #

JavaScript

代碼第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)25driver.execute_script(js)

#

執(zhí)行以上代碼,模仿鼠標(biāo)滾輪到達網(wǎng)頁底部time.sleep(5)html

=

driver.page_source #

提取網(wǎng)頁源碼driver.quit() #

關(guān)閉瀏覽器return

html2.

解析網(wǎng)頁程序在解析網(wǎng)頁之前,需要查看和理解網(wǎng)頁的

html

結(jié)構(gòu),明確網(wǎng)頁數(shù)據(jù)的結(jié)構(gòu)特點和需要提取的數(shù)據(jù)的標(biāo)簽安排。根據(jù)html

標(biāo)簽的組織和排列,靈活運用BeautifulSoup

庫提供的網(wǎng)頁解析函數(shù),實現(xiàn)數(shù)據(jù)的提取。茶葉的種類與功效網(wǎng)頁中包含六類茶的分類名稱、圖片、知名種類和功效作用等數(shù)據(jù),其中一個數(shù)據(jù)片段如下。26<p><br/><span

style="color:#008000;"><strong>2、黃茶</strong></span></p>,<pstyle="text-align:

center;"><img alt=" 茶葉的種類與功效,茶葉的功效與作用大全"src="/uploads/allimg/201118/1-20111R33507.jpg"/></p>,<p><strong>知名種類:</strong>君山銀針、北港毛尖、霍山黃芽、蒙頂黃芽等等,湖南岳陽為中國黃茶之鄉(xiāng)。</p>,<p><strong>功效作用:</strong>黃茶屬于微發(fā)酵茶,其加工工藝與綠茶十分相似,只多了一道悶黃的工藝,口感相對于綠茶會更加柔和,有提神醒腦、消除疲勞、消食化滯等功效,對脾胃很有好處,消化不良、食欲不振、懶動肥胖皆可飲而化之。</p>第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)27從上述片段可知,茶葉的名稱在<p><span><strong>標(biāo)簽中,圖片在<p><img>

標(biāo)簽中,

知名種類在<p><strong>

標(biāo)簽中,

功效作用在<p><strong>標(biāo)簽中,<p>節(jié)點是所有數(shù)據(jù)的父節(jié)點,是并列關(guān)系。每一種分類的茶葉知識都是需要提取的數(shù)據(jù)。修改、完成設(shè)計描述中的extract_page()函數(shù),如程序段P14.5

所示。P14.5

網(wǎng)頁解析,提取需要的數(shù)據(jù)

#

解析頁面,提取需要的內(nèi)容def

extract_page(page_contents:str):soup=BeautifulSoup(page_contents,'lxml')p_tags

=

soup.find_all('p') #

所有<p>節(jié)點i

=

1 #

數(shù)據(jù)條目records

=

[] #

存放所有的數(shù)據(jù)條目28fortag

in

p_tags: #

遍歷iftag.childrenis

not

None: #

有子節(jié)點forchild

in

tag.children: #

遍歷子節(jié)點iff'{i}'

in

str(child.string): #

知名茶葉種類名稱tea_name=str(child.string)next_tag=

tag.find_next_sibling()img_url=next_tag.img.get('src')while

True:next_tag=

next_tag.find_next_sibling()if

next_tag.strong:breakfamous_species='

'if

'知名種類'

in

next_tag.strong.string:第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)29famous_species+=

str(next_tag.text)while

True:next_tag=

next_tag.find_next_sibling()if

'功效作用:'

in

str(next_tag.strong.string):breakfunctional_effects='

'if

'功效作用:'

in

next_tag.strong.string:functional_effects+=

str(next_tag.text)while

True:next_tag=

next_tag.find_next_sibling()try:ifnext_tag.childrenisnot

None:if

next_tag.strong:30breakexcept:breakif'https:'notinimg_url:img_url='https://www.yinchar.com'+img_urlrecord=

{'name':tea_name,'famous_species':famous_species,'function':functional_effects,'img_url':img_url}records.append(record)i+=

1return

records第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)313.

創(chuàng)建數(shù)據(jù)庫程序本項目采用Python

內(nèi)置的數(shù)據(jù)庫SQLite。首先下載安裝SQLite

數(shù)據(jù)庫管理系統(tǒng)DB

Browser

for

SQLite,并運行該系統(tǒng),界面如圖

14.2

所示。圖14.2

DBBrowserforSQLite界面可以在DB

Browser

for

SQLite

圖形化界面中創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表,也可以借助數(shù)據(jù)庫的生成DDL

語句功能,生成創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表的SQL

語句。當(dāng)然,熟悉數(shù)據(jù)庫編程語言的學(xué)習(xí)者可以在程序中自己寫

SQL

命令,完成數(shù)據(jù)庫和數(shù)據(jù)表的創(chuàng)建。32修改、完善設(shè)計描述中的create_database()函數(shù),如程序段P14.6

所示。P14.6

創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表importsqlite3as

litefromseleniumimport

webdriverimport

time#

創(chuàng)建數(shù)據(jù)庫#

創(chuàng)建或打開數(shù)據(jù)庫def

create_datebase(db_path:str):conn=

lite.connect(db_path)with

conn:cur

=

conn.cursor()

#

數(shù)據(jù)庫游標(biāo)cur.execute('drop

table

if

exists

teas')#

刪除已存在的數(shù)據(jù)表#

創(chuàng)建新的數(shù)據(jù)表applesddl

=

'CREATE

TABLE

teas

(id

INTEGER

NOT

NULL

UNIQUE,

\nameTEXTNOTNULL,famous_speciesTEXT,function

TEXT,\第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)33img_urlTEXT,PRIMARYKEY(id

AUTOINCREMENT));'cur.execute(ddl)#

創(chuàng)建索引ddl

=

'create

unique

index

teas_id_uindex

on

teas(id);'cur.execute(ddl)4.

寫入數(shù)據(jù)庫程序修改、完善設(shè)計描述中的save_to_database()函數(shù),將網(wǎng)頁解析后的數(shù)據(jù)列表寫入數(shù)據(jù)庫中,如程序段P14.7

所示。P14.7

網(wǎng)頁解析數(shù)據(jù)寫入數(shù)據(jù)庫#

寫入數(shù)據(jù)庫def

save_to_database(db_path:str,records:list):conn

=

lite.connect(db_path) #

打開數(shù)據(jù)庫34#遍歷列表with

conn:cur=conn.cursor()forrecordin

records:print(record)#

查詢數(shù)據(jù)表name=

record['name']sql

=

f"select

count(name)

from

teas

where

name='{name}'"cur.execute(sql)count=

cur.fetchone()[0]if

count

<=0: #數(shù)據(jù)條目是不存在的famous_species

=

record['famous_species'] #

知名茶葉種類名稱function=

record['function']img_url=

record['img_url']#

茶葉功效作用#

圖片的url第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)35sql

=

f"insert

into

teas(name,famous_species,

#

定義SQL

語句,插入數(shù)據(jù)function,img_url)values('{name}','{famous_species}','{function}','{img_url}')"cur.execute(sql)print('數(shù)據(jù)存儲工作已經(jīng)完成!')5.

下載圖片程序數(shù)據(jù)庫teas.db

中已經(jīng)存儲了所有圖片的url,據(jù)此可以逐個下載對應(yīng)的圖片,為了讓圖片與數(shù)據(jù)庫中的數(shù)據(jù)條目一一對應(yīng),應(yīng)將圖片文件用數(shù)據(jù)id.jpg命名,如

1.jpg、2.jpg

等。下載圖片數(shù)據(jù)有多種方法,如利用

urllib

模塊和requests

模塊。由于本案例所用的網(wǎng)頁圖片加載是經(jīng)過相關(guān)處理的,所以本案例還是采用Selenium

下載圖片。36修改、完善設(shè)計描述中的

download_image()函數(shù),如程序段

P14.8

所示。P14.8

下載圖片#根據(jù)數(shù)據(jù)庫中的圖片字段的url

下載圖片#

所有記錄def

download_image(db_path:str,img_path:str):records=

[]conn=

lite.connect(db_path)with

conn:cur=

conn.cursor()sql="selectid,img_urlfrom

teas"cur.execute(sql)#

返回所有的列表數(shù)據(jù)records=

cur.fetchall()print('\n

開始下載圖片...')driver=

webdriver.Chrome()url=

'https:///yincha/gxzy/2453.html'第

14

項目開發(fā)實戰(zhàn)——茶葉數(shù)據(jù)爬蟲開發(fā)37driver.get(url) #

按網(wǎng)址獲取網(wǎng)頁js="window.scrollTo(0,

document.body.scrollHeight)"driver.execute_script(js)time.sleep(5)forrecord

in

records: #

遍歷所有的圖片#

id

命名圖片文件file

=

img_path

+"\\"

+

str(record[0])

+

".jpg"driver.maximize_window()driver.implicitly_wait(6)driver.get(record[1])time.sleep(1)driver.get_screenshot_as_file(file)driver.quit()print('\n

已經(jīng)完成所有圖片的下載!')386.

主模塊程序utility

包中兩個模塊中的

6

個函數(shù)已經(jīng)全部編程實現(xiàn)。主模塊需要調(diào)用包中的函數(shù)實現(xiàn)爬蟲功能。因此,主模塊中首先要導(dǎo)入utility

包。修改、完善設(shè)計描述中的spider_page.py

文件,如程序段P14.9

所示。P14.9

爬蟲主程序importosimportargparseimport

threadingfromutilityimport

url_handle,db_handle#

主邏輯函數(shù)def

main(database:str,input_url:str):print(f'存儲數(shù)據(jù)的數(shù)據(jù)庫是:{database}')第

14

項目開發(fā)實戰(zhàn)—

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論