您好,登錄后才能下訂單哦!
小編給大家分享一下Python爬蟲(chóng)中流程框架和常用模塊是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一、簡(jiǎn)單爬蟲(chóng)架構(gòu)
首先學(xué)習(xí)爬蟲(chóng)之前呢,要知道爬蟲(chóng)的一個(gè)基本架構(gòu),也就是寫(xiě)代碼得有層次結(jié)構(gòu)吧?不然擠牙膏么?
爬蟲(chóng)調(diào)度器 -> URL管理器 -> 網(wǎng)頁(yè)下載器() -> 網(wǎng)頁(yè)解析器() -> 價(jià)值數(shù)據(jù)
其中最重要地方,莫過(guò)于三君子-管理,下載,解析器。
這就是個(gè)初代版本的簡(jiǎn)單爬蟲(chóng)架構(gòu),一個(gè)基本的架構(gòu)。
二、運(yùn)行流程
實(shí)際上對(duì)于一些有開(kāi)發(fā)基礎(chǔ)的人來(lái)看,這個(gè)東西已經(jīng)一目了然了,具體內(nèi)容我不說(shuō)了。
具體過(guò)程:(細(xì)品,你細(xì)品~)
1、調(diào)度器詢問(wèn)URL管理器,是否有待爬URL?URL管理器返回是/否?
2、如果是,調(diào)度器會(huì)從URL管理器中取出一個(gè)待爬URL;
3、調(diào)度器將URL傳給下載器,下載網(wǎng)頁(yè)內(nèi)容后返回給調(diào)度器;
4、調(diào)度器再將返回的網(wǎng)頁(yè)內(nèi)容發(fā)送到解析器,解析URL內(nèi)容,解析完成后返回有價(jià)值的數(shù)據(jù)和新的URL;
5、一方面,調(diào)度器將數(shù)據(jù)傳遞給應(yīng)用進(jìn)行數(shù)據(jù)的收集;另一方面,會(huì)將新的URL補(bǔ)充進(jìn)URL管理器,若有URL管理器中含有新的URL,則重復(fù)上述步驟,直到爬取完所有的URL
6、最后,調(diào)度器會(huì)調(diào)動(dòng)應(yīng)用的方法,將價(jià)值數(shù)據(jù)輸出到需要的格式。
三、URL管理器和實(shí)現(xiàn)方法
定義:管理帶抓取URL集合和已抓取URL集合,
作用:防止重復(fù)抓取、防止循環(huán)抓取
URL管理器功能:
支持的功能
添加新URL到待爬取集合中
判斷待添加的URL是否在容器中
判斷是否還有帶待爬取URL
獲取待爬取URL
將URL從待爬取移動(dòng)到已爬取
實(shí)現(xiàn)方式
1、適合個(gè)人的:內(nèi)存(計(jì)算機(jī)或服務(wù)器內(nèi)存)
2、小型企業(yè)或個(gè)人:關(guān)系數(shù)據(jù)庫(kù)(永久存儲(chǔ)或內(nèi)存不夠用,如 MySQL)
3、大型互聯(lián)網(wǎng)公司:緩存數(shù)據(jù)庫(kù)(高性能,如支持 set() 的 redis)
四、網(wǎng)頁(yè)下載器和urllib2模塊
將互聯(lián)網(wǎng)上URL對(duì)應(yīng)的網(wǎng)頁(yè)下載到本地的工具。
作用:網(wǎng)頁(yè)下載器類似于瀏覽器,會(huì)將互聯(lián)網(wǎng)對(duì)應(yīng)的網(wǎng)頁(yè)以HTML的形式下載到本地,存儲(chǔ)成本地文件或內(nèi)存字符串,然后進(jìn)行后續(xù)的分析。
Python的網(wǎng)頁(yè)下載器種類
urllib / urllib2 (Python官方提供的基礎(chǔ)模塊)
requests(第三方插件,提供更為強(qiáng)大的功能)
(注意:python 3.x 以上版本把urllib2 和 urllib 整合到一起。所以引入模塊變成一個(gè),只有 import urllib,以后你在python2中看到的urllib2在python3中用urllib.request替換~ )
舉例:
#py2 import urllib2 response = urllib2.urlopen(url) # 報(bào)錯(cuò)NameError: name 'urllib2' is not defined,要改為 # py3 import urllib.request response = urllib.request.urlopen(url)
個(gè)人覺(jué)得Urllib庫(kù)不好用,requests庫(kù)更好用。
urllib2抓取網(wǎng)頁(yè)的三種方法(以后用requests)
當(dāng)然,雖然urllib2用的要少一些了,但是還是要了解一下的
方法1:給定url,使用urllib 模塊的urlopen方法獲取網(wǎng)頁(yè)內(nèi)容
舉例:
這里我用的python3.x版本的urllib庫(kù)。
get請(qǐng)求:發(fā)送一個(gè)GET請(qǐng)求到指定的頁(yè)面,然后返回HTTP的響應(yīng)。
from urllib import request print('第一種方法get請(qǐng)求') url = 'http://www.baidu.com' # 直接請(qǐng)求 response = request.urlopen(url) # 獲取狀態(tài)碼,如果是200表示成功 print(response.status) # 讀取網(wǎng)頁(yè)內(nèi)容 print(response.read().decode('utf-8')
因?yàn)閞ead獲取到的byte編碼,改為decode(‘utf-8’)。
方法2:添加data,http header
模擬瀏覽器發(fā)送GET請(qǐng)求,就需要使用Request對(duì)象,通過(guò)往Request對(duì)象添加HTTP頭,我們就可以把請(qǐng)求偽裝成瀏覽器進(jìn)行訪問(wèn):
User-Agent 有些 Server 或 Proxy 會(huì)檢查該值,用來(lái)判斷是否是瀏覽器發(fā)起的 Request .Content-Type
在使用 REST 接口時(shí),Server 會(huì)檢查該值,用來(lái)確定 HTTP Body 中的內(nèi)容該怎樣解析。
添加頭信息舉例:
import urllib2 print "第二種方法" from urllib import request req = request.Request('http://www.baidu.com') req.add_header('User-Agent', 'Mozilla/6.0') response = request.urlopen(req) # 獲取狀態(tài)碼,如果是200表示成功 print(response.status) # 讀取網(wǎng)頁(yè)內(nèi)容 print(response.read().decode('utf-8'))
方法3:添加特殊情景的處理器
模擬瀏覽器發(fā)送POST請(qǐng)求。
需要登錄才能訪問(wèn)的網(wǎng)頁(yè),要添加cookie的處理。使用HTTPCookieProcessor;
需要代理才能訪問(wèn)的網(wǎng)頁(yè)使用ProxyHandler;
需要HTTPS加密訪問(wèn)的網(wǎng)站使用HTTPSHandler;
有些URL存在相互自動(dòng)跳轉(zhuǎn)的關(guān)系使用HTTPRedirectHandler進(jìn)行處理。
圖示:
HTTPCookieProcessor的使用:
cookie中保存中我們常見(jiàn)的登錄信息,有時(shí)候爬取網(wǎng)站需要攜帶cookie信息訪問(wèn),這里用到了http.cookijar,用于獲取cookie以及存儲(chǔ)cookie,同時(shí)cookie可以寫(xiě)入到文件中保存,一般有兩種方式http.cookiejar.MozillaCookieJar和http.cookiejar.LWPCookieJar()。
舉例:
import urllib2, cookielib print "第三種方法" # 創(chuàng)建cookie容器 cj = cookielib.CookieJar() # 創(chuàng)建1個(gè)opener opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) # 給urllib2安裝opener urllib2.install_opener(opener) # 使用帶有cookie的urllib2訪問(wèn)網(wǎng)頁(yè) response = urllib2.urlopen('http://www.baidu.com/')
上面都是對(duì)urllib2模塊來(lái)寫(xiě)的,但是實(shí)戰(zhàn)中往往用requests,這個(gè)放到后面文章來(lái)說(shuō)。
注意: python3用cookielib 模塊改名為 http.cookiejar,帶cookie的打印出來(lái)必須用opener.open(req).read().decode(‘utf-8’)來(lái)發(fā)送的請(qǐng)求才會(huì)帶上cookie,如果用urllib.request.urlopen()是不帶cookie的。
ProxyHandler代理的使用:
網(wǎng)站它會(huì)檢測(cè)某一段時(shí)間某個(gè)IP 的訪問(wèn)次數(shù),如果訪問(wèn)次數(shù)過(guò)多,它會(huì)禁止你的訪問(wèn),所以這個(gè)時(shí)候需要通過(guò)設(shè)置代理來(lái)爬取數(shù)據(jù)
import urllib.request url = 'http://www.baidu.com' proxy_handler = urllib.request.ProxyHandler({ #代理服務(wù)器IP地址 'http': 'http://111.13.100.91:80', 'https': 'https://111.13.100.91:443' }) opener = urllib.request.build_opener(proxy_handler) response = opener.open(url) # 獲取狀態(tài)碼,如果是200表示成功 print(response.status) # 讀取網(wǎng)頁(yè)內(nèi)容 print(response.read().decode('utf-8'))
四、網(wǎng)頁(yè)解析器和使用
網(wǎng)頁(yè)解析器從HTML網(wǎng)頁(yè)字符串中提取出價(jià)值數(shù)據(jù)和新URL對(duì)象
Python網(wǎng)頁(yè)解析器種類
正則表達(dá)式(re模糊匹配)
html.parser (Python自帶)
BeautifulSoup (第三方插件)
lxml (第三方解析器)
后面三種是以結(jié)構(gòu)化解析的方式進(jìn)行解析DOM(Document Object Model)樹(shù),
【也就是按照html的節(jié)點(diǎn)路徑一級(jí)一級(jí)來(lái)解析的。】
下面挨個(gè)介紹一下最常用的兩個(gè)。
常用的BeautifulSoup介紹?。?!
bs4主要使用find()方法和find_all()方法來(lái)搜索文檔。
find()用來(lái)搜索單一數(shù)據(jù),find_all()用來(lái)搜索多個(gè)數(shù)據(jù)。
它是Python第三方庫(kù),用于從HTML或XML中提取數(shù)據(jù)
官網(wǎng):https://www.crummy.com/software/BeautifulSoup/
中文文檔:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
需要安裝和測(cè)試:
方法一,在cmd窗口中:
安裝:pip install beautifulsoup4 測(cè)試:import bs4
方法2:在pycharm中:File–settings–Project Interpreter–添加beautifulsoup4(簡(jiǎn)寫(xiě)bs4)
語(yǔ)法:
舉個(gè)例子:
from bs4 import BeautifulSoup # 根據(jù)HTML網(wǎng)頁(yè)字符串創(chuàng)建BeautifulSoup對(duì)象 soup = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8') # 搜索節(jié)點(diǎn) 查找所有標(biāo)簽為a的節(jié)點(diǎn) soup.find_all('a') # 查找所有標(biāo)簽為a,連接符合/view/123.html形式的節(jié)點(diǎn) soup.find_all('a', href='/view/123.html') soup.find_all('a', href=re.compile(r'/view/\d+\.html')) # 查找所有標(biāo)簽為div,class為abc,文字為Python的節(jié)點(diǎn) soup.find_all('div', class_='abc', string='Python')
訪問(wèn)節(jié)點(diǎn)信息
# 舉例節(jié)點(diǎn):<a href='1.html'>Python</a> # 獲取查找到的節(jié)點(diǎn)的標(biāo)簽名稱 node.name # 獲取查找到的a節(jié)點(diǎn)的href屬性 node['href'] # 獲取查找到的a節(jié)點(diǎn)的鏈接文字 node.get_text()
上面就是bs4在解析模塊的相關(guān)使用,更多方式查看官方文檔即可。
常用的lxml介紹
Xpath是一門(mén)在XML文檔中查找信息的語(yǔ)言。Xpath可用來(lái)在XML文檔中對(duì)元素和屬性進(jìn)行遍歷。Xpath是W3C XSLT標(biāo)準(zhǔn)的主要元素,并且XQuery和XPointer都構(gòu)建于XPath表達(dá)之上。
安裝:
pip install lxml
語(yǔ)法:
選取節(jié)點(diǎn)
XPath 使用路徑表達(dá)式在 XML 文檔中選取節(jié)點(diǎn)。節(jié)點(diǎn)是通過(guò)沿著路徑或者 step 來(lái)選取的。
在使用 xpath之前,先導(dǎo)入 etree類,對(duì)原始的 html頁(yè)面進(jìn)行處理獲得一個(gè)_Element對(duì)象。
舉個(gè)例子:
#導(dǎo)入 etree類 from lxml import etree # html文本 html = '''<div class="container"> <div class="row"> <div class="col"> <div class="card"> <div class="card-content"> <a href="#123333" class="box"> 好麻煩喲!!!~~~ </a> </div> </div> </div> </div> </div>''' #對(duì) html文本進(jìn)行處理 獲得一個(gè)_Element對(duì)象 dom = etree.HTML(html) #獲取 a標(biāo)簽下的文本 a_text = dom.xpath('//div/div/div/div/div/a/text()') print(a_text)
我們通過(guò) etree.HTML( )來(lái)生成一個(gè)_Element對(duì)象,etree.HTML() 會(huì)將傳入的文本處理成一個(gè) html文檔節(jié)點(diǎn)。這樣就能保證我們總是能獲得一個(gè)包含文檔節(jié)點(diǎn)的_Element對(duì)象。
以上是Python爬蟲(chóng)中流程框架和常用模塊是什么的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。