Python函數語言程式設計---以函數語言程式設計的方式設計最簡單的網路爬蟲
大家也許好奇什麼是函式,與我們數學中的函式有什麼區別呢?今天我們從函式的定義、用法、實戰三個方面分享函數語言程式設計的思想。這一版又有改進,丟棄了很多圖片,以原版程式碼的形式給大家分享,方便大家複製貼上程式。如果大家有任何疑問
學習Python中有不明白推薦加入交流群
號:960410445 群裡有志同道合的小夥伴,互幫互助, 群裡有不錯的視訊學習教程和PDF!
主要內容分為三個部分:
1、函式的定義;
2、函式的用方法;
3、設計初級的網路爬蟲。
§§Python函式的定義
一、python的函式定義:
在數學中函式表示的未知量x通過一種運算f對映到f(x)的一種關係,即{x --->f--->f(x)}, 但是在計算機程式語言中函式僅是為實現某一具體功能的程式碼模組的統稱****。比如,上節我們分享的模擬網站登陸的函式,僅僅實現登陸的功能。我們從以下幾個方面開始拆分python程式語言中函式。
(1)如何用程式碼定義函式;
(2)函式裡都包含那些內容;
(3)函式怎麼用(專業的說法是:函式怎麼呼叫)。
1、如何用程式碼定義函式:
用def+ 一個空格 + 函式名+英文的括號或者引數+英文的冒號。
無引數函式的程式碼示例:
def hello():
print("hello, Cly!")</pre>
這樣就定義了一個最簡單的函式,是不是很簡單呢!。
有引數函式的程式碼示例:
def hello(name):
print("hello ",name)
</pre>2、函式裡都包含那些內容:
(1)函式裡的內容包括:迴圈、判斷或者引用第三方庫的一些功能。上圖中函式裡面只有一行程式碼,以最簡單的例子讓大家知道怎麼定義函式。如下圖中login函式裡的內容、read_data_from_txt函式裡的內容。
程式碼示例:

image.png

image.png
3、函式怎麼用:
(1)對於無引數的函式呼叫:
函式名+英文括號()
**def hello():
print("hello, Cly!")
函式呼叫 hello()**</pre>
輸出結果:
hello, Cly!
</pre>
(2)對於有引數的函式呼叫:
函式名+英文括號(引數)
<**def hello(name):
print("hello",name)
函式呼叫和傳參 name = 'Cly' hello(name)**</pre>
輸出結果:
hello, Cly!</pre>
注意的是:函式的引數不一定只有一個,有可能要傳入多個引數,這就要結合實際情況的需要來定義了。引數的型別有可能是:字串、列表、字典、檔案等。
§§Python函式的用法
二、函式的用方法:
用法說明:
(1)減少程式中程式碼的重複、增加程式的易讀性;
(2)封裝一些功能,方便工程的管理;
1、減少程式中重複的程式碼、增加程式的易讀性:
如程式碼塊1中:save_data函式中重複出現兩次 開啟檔案寫入檔案的操作。 為了使程式碼更簡潔、易於理解,完全可以把開啟檔案寫入檔案封裝到一個函式中,這樣程式碼就更簡潔了,如程式碼塊2所示。
程式碼塊1:
def**save_data(datas):
'''把處理好的資料存入檔案中'''
with open("SaveDataToFile.txt", "w+") as f:
f.write(datas)
print("******資料儲存完畢******") else: with open("SaveDataToFile.txt", "w+") as f: ** warning = u'資料為空,請檢查引數的處理工程!\n' ** f.write(warning) print(warning) </pre>程式碼塊2:
def**write_data_to_file(data, file_name):
'''把資料寫入檔案'''
file_name = file_name + ".txt"
with open(file_name, "w+") as f:****# 開啟檔案 ** f.write(data) # 資料寫入檔案 </pre>
**def**** save_data(data):
'''把處理好的資料存入檔案中'''
file_name = 'SaveDataToFile'
if len(data) != 0:
write_data_to_file(data, file_name) # 函式呼叫,把資料存入檔案中
print("******資料儲存完畢******")
else:
warning= u'資料為空,請檢查引數的處理工程!\n'
write_data_to_file(warning, file_name) # 函式呼叫,把異常情況儲存到檔案中
print(warning)**
</pre>
2、封裝一些功能,方便工程的管理:
如上述 程式碼塊2 中,把開啟與儲存檔案的過程封裝到函式
write_data_to_file(data, filename)中。傳入要儲存到檔案裡的資料:
data與檔名:filename。這樣做的好處,每次不用在函式體中修改檔名與資料,只需把這兩個變數當成引數傳遞給write_data_to_file函式即可,方便管理與以後的呼叫。
§§利用函式設計初級的網路爬蟲
三、設計初級的網路爬蟲:
下面就以純函式的形式編寫一個最簡單的定向網站爬蟲程式----爬取以比特幣為代表的數字貨幣的市值等資訊。
執行此程式前,你需要安裝python的三個第三方包:
1,requests庫:爬取網站資訊的主要庫之一。
**安裝方法: pip install requests**
2、pandas庫:python資料分析的主要庫之一。
**安裝方法: pip install pandas**
3、beautifulsoup庫:一個很好用的網頁資訊提取的庫。
**安裝方法: pip install beautifulsoup4**
程式碼示例:
< # -- coding:utf-8 -- import requests import**** pandas ****as****pd import****time from**** bs4 ****import****BeautifulSoup from**** requests.exceptions ****import****RequestException </pre>
send_request(url):
'''通過 requests.get(url=url)獲取網頁原始碼'''
# 捕獲異常try:****# 以get的方式獲取網頁原始碼 ****
response = requests.get(url=url, timeout=10)
# 判斷網站是否有相應,有的話就會返回200的狀態碼。
if response.status_code == 200:
text = response.text
return BeautifulSoup(text, 'lxml')
except RequestException as e:
print("開啟頁面錯誤:" % e)
return None
</pre>def**get_detial_url(total_page_number):
"""本函式功能:構造最終要爬取的所有URL連線"""****# 構造爬蟲要爬取的目標連結地址** **start_urls = ['https://www.feixiaohao.com/list_{}.html'.format(i) for i in range(1, total_page_number + 1)] detail_url_str = '****https://www.feixiaohao.com/currencies/{}/'**
**coin_ids = []
通過上面的send_request(url)函式獲取原始碼後解析要構造的連結。
for url in start_urls:
coin_ids += [row.attrs['id'] for row in send_request(url).select('#table tr')[1:]]
detail_urls = (detail_url_str.format(c_id) for c_id in coin_ids)
返回最終的連線地址
return detail_urls**</pre>
def**download_webpage_info(page_num, file_name='排名前5百的幣.csv'):
"""獲取最終資訊,儲存至csv檔案中""" # 初始化數字貨幣的市值,為存值做準備 pv = [] # 初始化數字貨幣的其他資訊,為村製做準備。 detail_info = [] print("********************* 正在非小號爬取資料......************************") i = 1 for url in get_detial_url(page_num): print("[%s]" % i, url) # 獲得流通市值 pv.append([str(row.string[2:]).strip()** **for** **row in send_request(url).select('.firstPart .cell .sub')[1]]) # 獲得類為scondPark的li標籤的資訊value類 detail_info.append([str(row.text).strip() for row in send_request(url).select('.secondPark li .value')[:4]]) i += 1 # 報資料儲存到CSV檔案中。 df1 = pd.DataFrame(data=pv, columns=[u'流通市值($)'])# pandas的DataFrame資料型別宣告。 df2 = pd.DataFrame(data=detail_info, columns=[u'英文名', u'中文名', u'上架交易所', u'發行時間']) df = pd.concat([df2, df1], axis=1)writer = pd.ExcelWriter(filename) df.to_excel(writer, index=False) writer.save() print("資料爬取完畢")**</pre>
**if**** name == ' main ':
# 程式執行的入口 n = int(input("請輸入你要爬取的頁面數量(備註:非小號共有23頁、每頁100個幣)::")) download_webpage_info(n, filename=u'流通市值.xlsx')** </pre>