-
實(shí)例爬蟲(chóng)-分析目標(biāo)
查看全部 -
開(kāi)發(fā)爬蟲(chóng)的步驟
確定目標(biāo):要抓取哪部分?jǐn)?shù)據(jù)
查看全部 -
實(shí)例測(cè)試代碼
import?re from?bs4?import?BeautifulSoup html_doc?=?""" <html><head><title>The?Dormouse's?story</title></head> <body> <p?class="title"><b>The?Dormouse's?story</b></p> <p?class="story">Once?upon?a?time?there?were?three?little?sisters;?and?their?names?were <a?>Elsie</a>, <a?>Lacie</a>?and <a?>Tillie</a>; and?they?lived?at?the?bottom?of?a?well.</p> <p?class="story">...</p> """ soup=BeautifulSoup(html_doc,'html.parser') print('獲取所有鏈接:') links=soup.find_all('a') for?link?in?links: ????print(link.name,link['href'],link.get_text()) print('獲取指定鏈接(獲取Lacie鏈接):') #?link_node=soup.find('a',id="link2") link_node=soup.find('a',) print(link_node.name,link_node['href'],link_node.get_text()) print('輸入正則模糊匹配出需要的內(nèi)容:') link_node=soup.find('a',href=re.compile(r"ill"))??#'r'表示正則中出現(xiàn)反斜線(xiàn)時(shí),我們只需寫(xiě)一個(gè)反斜線(xiàn),否則我們要寫(xiě)兩個(gè) print(link_node.name,link_node['href'],link_node.get_text()) print('輸入p這個(gè)段落文字(指定class獲取內(nèi)容):') p_node=soup.find('p',class_="title") print(p_node.name,p_node.get_text())
查看全部 -
訪(fǎng)問(wèn)節(jié)點(diǎn)信息
查看全部 -
name:名稱(chēng)
attrs:屬性
string:文字
bs模塊非常強(qiáng)大的地方是:對(duì)于它的名稱(chēng),屬性和文字,都可傳入一個(gè)正則表達(dá)式來(lái)匹配對(duì)應(yīng)的內(nèi)容
'class'后加了'_'的原因:python的關(guān)鍵字有class,bs為了避免沖突,加了一個(gè)'_'
查看全部 -
對(duì)應(yīng)代碼
創(chuàng)建了BeautifulSoup對(duì)象并加載好了DOM
查看全部 -
搜索 栗子
查看全部 -
Beautiful Soup語(yǔ)法
根據(jù)下載好的HTML網(wǎng)頁(yè)字符串可創(chuàng)建一個(gè)BeautifulSoup對(duì)象,創(chuàng)建這個(gè)DOM對(duì)象的同時(shí)就會(huì)將整個(gè)文檔字符串下載成一個(gè)DOM數(shù)
根據(jù)這個(gè)DOM數(shù)我們就可進(jìn)行各種節(jié)點(diǎn)的搜索;搜索節(jié)點(diǎn)時(shí),可按照節(jié)點(diǎn)名稱(chēng)或節(jié)點(diǎn)屬性或節(jié)點(diǎn)文字進(jìn)行搜索
(find_add()方法:會(huì)搜索出所有滿(mǎn)足要求的節(jié)點(diǎn);find()方法:只會(huì)搜索出第1個(gè)滿(mǎn)足要求的節(jié)點(diǎn);這兩個(gè)參數(shù)是一模一樣的)
得到一個(gè)節(jié)點(diǎn)以后,我們就可以訪(fǎng)問(wèn)節(jié)點(diǎn)的名稱(chēng),屬性,文字
查看全部 -
結(jié)構(gòu)化解析
查看全部 -
4種解析器
正則表達(dá)式
html.parser模塊:py自帶
Beautiful Soup:第三方插件 它可使用html.parser作為它的解析器,也可使用lxml作為它的解析器,相對(duì)來(lái)說(shuō)比較強(qiáng)大
lxml:第三方插件 解析html網(wǎng)頁(yè)或者xml
查看全部 -
網(wǎng)頁(yè)解析器
查看全部 -
urllib2下載網(wǎng)頁(yè)方法3的對(duì)應(yīng)代碼
導(dǎo)入urllib2模塊,cookielib模塊
創(chuàng)建cookie容器來(lái)存儲(chǔ)cookie數(shù)據(jù)
然后使用urllib2的HTTPCookieProcessor,以生成的cookie容器作為參數(shù),生成一個(gè)header,將header傳給urllib2的build_opener()方法來(lái)生成一個(gè)opener對(duì)象
然后給urllib2安裝opener
最后使用urllib2的urlopen()方法傳入一個(gè)url生成response對(duì)象實(shí)現(xiàn)網(wǎng)頁(yè)的下載
查看全部 -
urllib2下載網(wǎng)頁(yè)方法3
有些網(wǎng)頁(yè)需要用戶(hù)登錄才能訪(fǎng)問(wèn),需要添加cookie處理,這里我們使用HTTPCookieProcessor
有些網(wǎng)頁(yè)需要代理才能訪(fǎng)問(wèn),我們使用ProxyHandler
有些網(wǎng)頁(yè)是使用HTTPS加密訪(fǎng)問(wèn)的,這里我們使用HTTPSHandler
有些網(wǎng)頁(yè)有相互自動(dòng)的跳轉(zhuǎn)關(guān)系,我們使用HTTPRedirectHandler
這些Handler我們傳送給urllib2的build_opener()方法來(lái)創(chuàng)建一個(gè)opener對(duì)象
然后傳給urllib2的install_opener()方法
然后調(diào)使用urllib2的urlopen()方法,整出一個(gè)request,來(lái)實(shí)現(xiàn)網(wǎng)頁(yè)的下載
查看全部 -
urllib2下載網(wǎng)頁(yè)方法2的對(duì)應(yīng)代碼
導(dǎo)入urllib2模塊
創(chuàng)建Request對(duì)象:調(diào)用urllib2的Request(),以u(píng)rl作為參數(shù),生成Request對(duì)象request
1.添加數(shù)據(jù):使用request的add_data()方法向服務(wù)器提交用戶(hù)數(shù)據(jù)(如提交 a 這個(gè)數(shù)據(jù)項(xiàng),它的值為1)
2.添加header:使用request的add_header()方法向服務(wù)器提交頭信息(如把爬蟲(chóng)偽裝成瀏覽器)
發(fā)送請(qǐng)求:調(diào)用urllib2的urlopen()方法,以request作為參數(shù),來(lái)提交網(wǎng)頁(yè)下載請(qǐng)求
查看全部 -
urllib2下載網(wǎng)頁(yè)方法2(增強(qiáng)處理)
添加一個(gè)header:可以向服務(wù)器提交最精辟的頭信息
添加一個(gè)data:可以向服務(wù)器提交用戶(hù)輸入的數(shù)據(jù)
將url,data,header這3個(gè)參數(shù)傳給urllib2的request類(lèi),生成一個(gè)request對(duì)象,仍然使用urllib2的urlopen()方法,以request作為參數(shù)發(fā)送網(wǎng)頁(yè)請(qǐng)求
查看全部
舉報(bào)