1. 程式人生 > 其它 >20211302陳琳福 實驗4 Python綜合實踐

20211302陳琳福 實驗4 Python綜合實踐

#20211302陳琳福 實驗4 Python綜合實踐

##1實驗內容

Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。

## 2. 實驗過程及結果

(1)實驗設計

1 功能

    獲取新聞頁面的資訊,提取其中的時間、標題、網址資訊列印輸出資訊。

 

2 目標網站的 robots協議

    在網站的根目錄下檢視網站的 robots協議,該網站對網路爬蟲沒有限制。

 

3 目標網站分析

網址:https://www.phei.com.cn/xwxx/index.shtml

檢視網頁原始碼:檢視網頁原始碼,可以看到相關資訊都儲存在html頁面中。

目標資訊均儲存的HTML頁面中

 4 結構設計

技術路線:Requests-BeautifulSoup

  1. Requests 自動網路url請求提交,迴圈獲得html頁面
  2. BeautifulSoup解析每個HTML頁面,提取目標資訊
  3. 列印輸出資訊到螢幕

 2)實現過程

1 Requests獲得html頁面

     使用Requests通用框架,提交url請求,獲取網頁內容。

  獲取網頁原始碼

def getHTMLText(url):  
    try:  
        headers = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"}  
        r = requests.get(url, timeout=30, headers=headers,allow_redirects=False)  
        print(r.status_code)  
        r.raise_for_status()  # 如果狀態不是200,引發HTTPError異常  
        r.encoding = r.apparent_encoding  
        #print(r.text[1000:2000])  
        return r.text  
     except:  
     print("網頁訪問異常!")  

2 構造所有頁面的url地址

https://www.phei.com.cn/xwxx/index.shtml    #首頁地址

https://www.phei.com.cn/xwxx/index_54.shtml  #第1頁地址

https://www.phei.com.cn/xwxx/index_53.shtml  #第2頁地址

……

https://www.phei.com.cn/xwxx/index_1.shtml   #最後1頁地址

 

定義get_urls()函式,構造所有分頁url地址:

def get_urls(pages):  
    urls = ['https://www.phei.com.cn/xwxx/index.shtml']  
    for i in range(1,pages):  
        page = 55-i  
        url = "https://www.phei.com.cn/xwxx/index_{}.shtml".format(page)  
        urls.append(url)  
    #print(urls)  
    return urls  

 3 BeautifulSoup解析html頁面提取資訊

使用bs4的".find_all()"方法可以定位到資訊位置:

def parsePage(html):  
    soup = BeautifulSoup(html, 'html.parser')  
    #for tag in soup.find_all(True):  
        #print(tag.name)  
    p = soup.find_all('li','li_b60')  
    #print(p)  
    print(len(p))  
    for i in range(len(p)):  
        print(i)  
    text = p[i]  
   #print(text.prettify())

 利用find_all()對定位到的資訊進一步準確地提取:

#bs4提取資訊

def parsePage(html):  
    soup = BeautifulSoup(html, 'html.parser')  
    #for tag in soup.find_all(True):  
        #print(tag.name)  
    p = soup.find_all('li','li_b60')  
    #print(p)  
    print(len(p))  
    for i in range(len(p)):  
        print(i)  
        text = p[i]  
        #print(text.prettify())  #美觀地列印標籤樹  
 
        #獲得新聞時間  
       time = text.find_all('span')  
       print(time)  
  
         #獲得新聞標題  
        title = text.find_all('p','li_news_title')  
        print(title)  
   
        #獲得新聞網址  
        for link in text.find_all('a'):  
             link_part = link.get('href')  
           print(link_part)  

4 構造迴圈獲取html及處理主程式

pages = 2    #輸入頁面數量  
urls = get_urls(pages)  #呼叫get_urls()函式構造url地址  
for url in urls:  #迴圈獲得頁面並進行處理  
print(url)  
html = getHTMLText(url)  #獲得網頁原始碼  
parsePage(html)  #解析提取網頁資訊   

總程式碼:

      import requests  
	from bs4 import BeautifulSoup  
	  
	#獲取網面原始碼  
	def getHTMLText(url):  
	    try:  
	        headers = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"}  
	        r = requests.get(url, timeout=30, headers=headers,allow_redirects=False)  
	        print(r.status_code)  
	        r.raise_for_status()  # 如果狀態不是200,引發HTTPError異常  
	        r.encoding = r.apparent_encoding  
	        #print(r.text[1000:2000])  
	        return r.text  
	    except:  
	        print("網頁訪問異常!")  
	  
	#bs4提取資訊  
	def parsePage(html):  
	    soup = BeautifulSoup(html, 'html.parser')  
	    #for tag in soup.find_all(True):  
	        #print(tag.name)  
	    p = soup.find_all('li','li_b60')  
	    #print(p)  
	    print(len(p))  
	    for i in range(len(p)):  
	        print(i)  
	        text = p[i]  
	        #print(text.prettify())  #美觀地列印標籤樹  
	  
	        #獲得新聞時間  
	        time = text.find_all('span')  
	        time_bs = BeautifulSoup(str(time), 'html.parser')  
	        time_text = time_bs.get_text()  
	        print(time_text)  
	  
	        #獲得新聞標題  
	        title = text.find_all('p','li_news_title')  
	        title_bs = BeautifulSoup(str(title), 'html.parser')  
	        title_text = title_bs.get_text()  
	        print(title_text)  
	  
	        #獲得新聞網址  
	        for link in text.find_all('a'):  
	            link_part = link.get('href')  
	            html_url = 'https://www.phei.com.cn'+str(link_part)  
	            print(html_url)  
	  
	def get_urls(pages):  
	    urls = ['https://www.phei.com.cn/xwxx/index.shtml']  
	    for i in range(1,pages):  
	        page = 55-i  
	        url = "https://www.phei.com.cn/xwxx/index_{}.shtml".format(page)  
	        urls.append(url)  
	    #print(urls)  
	    return urls  
	  
	pages = 3  
	urls = get_urls(pages)  
	for url in urls:  
	    print(url)  
	    html = getHTMLText(url)  #獲得網頁原始碼  
	    parsePage(html)  #解析提取網頁資訊   

 ##3課程總結及感想

(1)課程總結

第1課 初識Python

Python 是一種簡單易學並且結合瞭解釋性、編譯性、互動性和麵向物件的指令碼語言。Python提供了高階資料結構,它的語法和動態型別以及解釋性使它成為廣大開發者的首選程式語言。

  • Python 是解釋型語言: 開發過程中沒有了編譯這個環節。類似於PHP和Perl語言。

  • Python 是互動式語言: 可以在一個 Python 提示符 >>> 後直接執行程式碼。

  • Python 是面嚮物件語言: Python支援面向物件的風格或程式碼封裝在物件的程式設計技術。

Python是一種面向物件oop的指令碼語言。

面向物件是採用基於物件(實體)的概念建立模型,模擬客觀世界分析、設計、實現軟體的辦法。面向物件的方法把資料和方法組合成一個整體,然後對其進行

系統建模。python程式設計思想的核心就是理解功能邏輯

第2課 Pyhton語言基礎

運算子:

縮排:

縮排是針對邏輯行的,因此首先要區分程式碼中的物理行和邏輯行。

  • 物理行:程式碼編輯器中顯示的程式碼,每一行是一個物理行。
  •  邏輯行:Python直譯器對程式碼進行解釋,一個語句是一個邏輯行。

第3課 流程控制語句

  • 順序結構   

                                          

  • 條件和分支

單分支:

 雙分支:

 多分支:

  • 迴圈

while迴圈:

 for迴圈:

第4課 序列的應用

 列表、字典、集合。

第5課 字串與正則表示式

Python 字串是 Python 內建的一種資料型別,在 Python 中,用引號來表示字串,例如 雙引號 ",單引號 '。

字串輸出例子:

tang_hu_lu = "都說冰糖葫蘆兒酸" # 宣告字串

print(tang_hu_lu) # 列印輸出字串

print(tang_hu_lu[2:4]) # 輸出冰糖

print(tang_hu_lu[3:5]) # 輸出糖葫

第6課 函式

在程式設計中,函式的使用可以提升程式碼的複用率和可維護性。

提升複用率: 程式設計中,一些程式碼的功能是相同的,操作是一樣的,只不過針對的資料不一樣。此種情況下,可以將這種功能寫成一個函式模組,要使用此功能時只需呼叫這個函式模組就可以了。
提升可維護性: 使用函式後,實現了程式碼的複用,某個功能需要核查或修改時,只需要核查或修改此功能相對應的函式就可以了。對功能的修改可以使呼叫該函式的所有模組同時生效,極大提升了程式碼的可維護性。

一般格式如下:

def 函式名(引數列表):
    函式體
  • 形參(parameter),全稱為"形式引數",不是實際存在的變數,又稱虛擬變數。形參是在定義函式名和函式體的時候使用的引數,目的是用來接收呼叫該函式時傳入的引數。

  • 實參(argument),全稱為"實際引數",是在呼叫時傳遞給函式的引數。實參可以是常量、變數、表示式、函式等。無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的值,以便把這些值傳送給形參。

 

第7課 面向物件程式設計

面向物件:是把一組資料結構和處理他們的方法組成物件,把具有相同行為的物件歸納成類,通過封裝隱藏類的內部細節,通過繼承使類得到泛化,通過多型實現基於物件型別的動態分類。

類:表示一組(或一類)物件,每個物件都屬於特定的類,並被稱為該類的例項。在面向物件程式設計中,你編寫表示現實世界中的事物和情景的類,並基於這些類來建立物件。編寫類時,你定義一大類物件都有的通用行為。基於類建立 物件時,每個物件都自動具備這種通用行為,然後可根據需要賦予每個物件獨特的個性。根據類來建立物件被稱為 例項化,這讓你能夠使用類的例項。在面向物件程式設計中,術語物件大致意味著一系列資料(屬性)以及一套訪問和操作這些資料的方法;物件由屬性和方法組成。屬性不過是屬於物件的變數,而方法是儲存在屬性中的函式。

類的成員主要包括:欄位 方法 屬性

面向物件三要素

  • 封裝:通常認為封裝是把資料和操作資料的方法繫結起來,對資料的訪問只能通過已定義的介面。
  • 繼承:繼承是從已有類得到繼承資訊建立新類的過程。提供繼承資訊的類被稱為父類(超類、基類);得到繼承資訊的類被稱為子類(派生類)。
  • 多型:多型性是指允許不同子型別的物件對同一訊息作出不同的響應。簡單的說就是用同樣的物件引用呼叫同樣的方法但是做了不同的事情。

第8課 檔案操作及異常處理

python讀取檔案:

Python 在讀寫檔案的時候首先要做的是開啟檔案,然後可以一次性讀取檔案或者一行行的讀取,開啟檔案使用 open 函式。

讀取檔案所有內容使用 open 函式開啟檔案之後,可以通過 read 讀取檔案內容,該方法相當於將檔案的內容一次性的讀取到了程式的一個字串中,非常強大。

# 檔案地址,注意提前在當前目錄新建一個 test.txt 檔案
file = "test.txt"
# 開啟檔案
f = open(file, encoding="utf-8")
# 讀取檔案全部內容
read_str = f.read()
# 關閉檔案
f.close()
print(read_str)

寫入檔案:泛指寫入到本地硬碟上。

# 檔案地址,注意提前在當前目錄新建一個 test.txt 檔案
file = "test.txt"
# 開啟檔案
with open(file, mode="w", encoding="utf-8") as f:
    # 寫入檔案內容
    f.write("我是即將被寫入的內容")

檔案複製:使用該模組中 shutil 物件的 copy 方法可以對檔案進行復制操作。

import shutil

shutil.copy("test.txt","aaa.txt")
shutil.copy("test.txt","../aaa.txt") # 不同目錄拷貝

目錄複製:copytree 方法語法格式與 copy 一致,只不過該方法是用來複制目錄的,如果目錄下面有子目錄或檔案一起復制。

import shutil
# 第一個引數是舊目錄,第二個引數是新目錄
shutil.copytree("../1","a4") 

第9課 Python操作資料庫

目前主流的資料庫有兩種:

  • 一個是關係型資料庫,如MySql
  • 一個是非關係型資料庫 如mongodb

第10課 Python網路程式設計及爬蟲

urllib 模組是 Python 標準庫,其價值在於抓取網路上的 URL 資源。

Python3 中 urllib 模組包括如下內容。

  • urllib.request:請求模組,用於開啟和讀取 URL;
  • urllib.error:異常處理模組,捕獲 urllib.error 丟擲異常;
  • urllib.parse:URL 解析,爬蟲程式中用於處理 URL 地址;
  • urllib.robotparser:解析 robots.txt 檔案,判斷目標站點哪些內容可爬,哪些不可以爬。

Beautiful Soup 是一款 Python 解析庫,主要用於將 HTML 標籤轉換為 Python 物件樹,然後讓我們從物件樹中提取資料。

lxml 庫是一款 Python 資料解析庫。

requests 庫

    • url:請求地址;
    • params:要傳送的查詢字串,可以為字典,列表,元組,位元組;
    • data:body 物件中要傳遞的引數,可以為欄位,列表,元組,位元組或者檔案物件;
    • json:JSON 序列化物件;
    • headers:請求頭,字典格式;
    • cookies:傳遞 cookie,欄位或 CookieJar 型別;
    • files:最複雜的一個引數,一般出現在 POST 請求中,格式舉例 "name":檔案物件 或者 {'name':檔案物件},還可以在一個請求中傳送多個檔案,不過一般爬蟲場景不會用到;
    • auth:指定身份驗證機制;
    • timeout:伺服器等待響應時間,在原始碼中檢索到可以為元組型別,這個之前沒有使用過,即 (connect timeout, read timeout)
    • allow_redirects:是否允許重定向;
    • proxies:代理;
    • verify:SSL 驗證;
    • stream:流式請求,主要對接流式 API;
    • cert:證書。

(2)感想:

 python是一門非常有潛力的高階語言,歷經多年的發展,其在程式設計上發揮著越來越大的作用。

由於這學期還學習了C語言,所以我時不時會將python和C語言對比。python相對於c語言也是給程式設計師極大的便利。而python相較於C語言擁有更多的庫,正因為它強大的庫,讓程式設計變得不再艱難。python在爬蟲等方面的優勢更是體現了它的功能強大。python雖然在許多方面相對於c語言比較方便,但也有其相對於弱一點的方面,比如說for迴圈等方面。雖然一學期下來,我對python的學習也僅僅只是它的基礎方面,但python的強大對我仍然產生了強大的吸引力。

一個學期的python學習告一段落,通過選修python課,我對python的知識有了一定了解。由於練習時間有限,有的內容掌握並不牢固,但python的學習不僅僅是這一個階段,日後還有更多的內容等待著我去學習,我也堅信我對程式設計的熱愛會讓我堅持下去。

 ##4參考

https://edu.csdn.net/skill/python/python-3-147?category=8