日韩精品欧美激情国产一区_中文无码精品一区二区三区在线_岛国毛片AV在线无码不卡_亞洲歐美日韓精品在線_使劲操好爽好粗视频在线播放_日韩一区欧美二区_八戒八戒网影院在线观看神马_亚洲怡红院在线色网_av无码不卡亚洲电影_国产麻豆媒体MDX

Python爬蟲抓取網(wǎng)頁函數(shù)式編程

時間:2022-02-13 11:52:11 類型:python
字號:    

Python 函數(shù)式編程可以讓程序的思路更加清晰、易懂

定義相應(yīng)的函數(shù),通過調(diào)用函數(shù)來執(zhí)行爬蟲程序

from urllib import request
from urllib import parse

# 拼接URL地址
def get_url(word):
url = 'http://www.baidu.com/s?{}'
#此處使用urlencode()進行編碼
params = parse.urlencode({'wd':word})
url = url.format(params)
return url

# 發(fā)請求,保存本地文件
def request_url(url,filename):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}
# 請求對象 + 響應(yīng)對象 + 提取內(nèi)容
req = request.Request(url=url,headers=headers)
res = request.urlopen(req)
html = res.read().decode('utf-8')
# 保存文件至本地
  with open(filename,'w',encoding='utf-8') as f:
    f.write(html)

# 主程序入口
if __name__ == '__main__':
word = input('請輸入搜索內(nèi)容:')
url = get_url(word)
filename = word + '.html'
request_url(url,filename)

下面以類的形式編寫爬蟲程序,并在類下編寫不同的功能函數(shù),代碼如下所示:

from urllib import request,parse
import time
import random
from ua_info import ua_list #使用自定義的ua池

#定義一個爬蟲類
class TiebaSpider(object):
#初始化url屬性
def __init__(self):
self.url='http://tieba.baidu.com/f?{}'

# 1.請求函數(shù),得到頁面,傳統(tǒng)三步
def get_html(self,url):
req=request.Request(url=url,headers={'User-Agent':random.choice(ua_list)})
res=request.urlopen(req)
#windows會存在亂碼問題,需要使用 gbk解碼,并使用ignore忽略不能處理的字節(jié)
#linux不會存在上述問題,可以直接使用decode('utf-8')解碼
html=res.read().decode("gbk","ignore")
return html
# 2.解析函數(shù),此處代碼暫時省略,還沒介紹解析模塊
def parse_html(self):
pass
# 3.保存文件函數(shù)
def save_html(self,filename,html):
with open(filename,'w') as f:
f.write(html)
# 4.入口函數(shù)
def run(self):
name=input('輸入貼吧名:')
begin=int(input('輸入起始頁:'))
stop=int(input('輸入終止頁:'))
# +1 操作保證能夠取到整數(shù)
for page in range(begin,stop+1):
pn=(page-1)*50
params={
'kw':name,
'pn':str(pn)
}
#拼接URL地址   
params=parse.urlencode(params)
url=self.url.format(params)
#發(fā)請求
html=self.get_html(url)
#定義路徑
filename='{}-{}頁.html'.format(name,page)
self.save_html(filename,html)
#提示
print('第%d頁抓取成功'%page)
#每爬取一個頁面隨機休眠1-2秒鐘的時間
time.sleep(random.randint(1,2))
#以腳本的形式啟動爬蟲
if __name__=='__main__':
start=time.time()
spider=TiebaSpider() #實例化一個對象spider
spider.run() #調(diào)用入口函數(shù)
end=time.time()
#查看程序執(zhí)行時間
print('執(zhí)行時間:%.2f'%(end-start))  #爬蟲執(zhí)行時間

以面向?qū)ο蠓椒ň帉懪老x程序時,思路簡單、邏輯清楚,非常容易理解,上述代碼主要包含了四個功能函數(shù),它們分別負責(zé)了不同的功能,總結(jié)如下:

1) 請求函數(shù)

請求函數(shù)最終的結(jié)果是返回一個 HTML 對象,以方便后續(xù)的函數(shù)調(diào)用它。 

2) 解析函數(shù)

解析函數(shù)用來解析 HTML 頁面,常用的解析模塊有正則解析模塊、bs4 解析模塊。通過分析頁面,提取出所需的數(shù)據(jù),在后續(xù)內(nèi)容會做詳細介紹。

3) 保存數(shù)據(jù)函數(shù)

該函數(shù)負責(zé)將抓取下來的數(shù)據(jù)保至數(shù)據(jù)庫中,比如 MySQL、MongoDB 等,或者將其保存為文件格式,比如 csv、txt、excel 等。

4) 入口函數(shù)

入口函數(shù)充當整個爬蟲程序的橋梁,通過調(diào)用不同的功能函數(shù),實現(xiàn)數(shù)據(jù)的最終抓取。入口函數(shù)的主要任務(wù)是組織數(shù)據(jù),比如要搜索的貼吧名、編碼 url 參數(shù)、拼接 url 地址、定義文件保存路徑。

爬蟲程序結(jié)構(gòu)

用面向?qū)ο蟮姆椒ň帉懪老x程序時,邏輯結(jié)構(gòu)較為固定,總結(jié)如下:

# 程序結(jié)構(gòu)
class xxxSpider(object):
def __init__(self):
# 定義常用變量,比如url或計數(shù)變量等

def get_html(self):
# 獲取響應(yīng)內(nèi)容函數(shù),使用隨機User-Agent

def parse_html(self):
# 使用正則表達式來解析頁面,提取數(shù)據(jù)

def write_html(self):
# 將提取的數(shù)據(jù)按要求保存,csv、MySQL數(shù)據(jù)庫等

def run(self):
# 主函數(shù),用來控制整體邏輯

if __name__ == '__main__':
# 程序開始運行時間
spider = xxxSpider()
spider.run()

爬蟲程序隨機休眠

在入口函數(shù)代碼中,包含了以下代碼:

#每爬取一個頁面隨機休眠1-2秒鐘的時間
time.sleep(random.randint(1,2))

爬蟲程序訪問網(wǎng)站會非常快,這與正常人類的點擊行為非常不符。因此,通過隨機休眠可以使爬蟲程序模仿成人類的樣子點擊網(wǎng)站,從而讓網(wǎng)站不易察覺是爬蟲訪問網(wǎng)站,但這樣做的代價就是影響程序的執(zhí)行效率

<