您好,登錄后才能下訂單哦!
案例一:
某套圖網(wǎng)站,套圖以封面形式展現(xiàn)在頁面,需要依次點(diǎn)擊套圖,點(diǎn)擊廣告盤鏈接,最后到達(dá)百度網(wǎng)盤展示頁面。
這一過程通過爬蟲來實(shí)現(xiàn),收集百度網(wǎng)盤地址和提取碼,采用xpath爬蟲技術(shù)
1、首先分析圖片列表頁,該頁按照更新先后順序暫時(shí)套圖封面,查看HTML結(jié)構(gòu)。每一組“l(fā)i”對(duì)應(yīng)一組套圖。屬性href后面即為套圖的內(nèi)頁地址(即廣告盤鏈接頁)。所以,我們先得獲取列表頁內(nèi)所有的內(nèi)頁地址(即廣告盤鏈接頁)
代碼如下:
import requests 倒入requests庫 from lxml import etree 倒入lxml 庫(沒有這個(gè)庫,pip install lxml安裝) url = "https://www.xxxx.com/gc/" 請(qǐng)求地址 response = requests.get(url= url) 返回結(jié)果 wb_data = response.text 文本展示返回結(jié)果 html = etree.HTML(wb_data) 將頁面轉(zhuǎn)換成文檔樹 b = html.xpath('//ul[@class = "clearfix"]//@href') 這一步的意思是class“clearfix”下所有屬性為“href”賦值給“b”,因?yàn)槲覀兊哪繕?biāo)內(nèi)容都展示在class“clearfix”下,且在href屬性后面 print(b) 打印b,這里的b是一個(gè)數(shù)組 print(b[0]) 打印b的第一項(xiàng)數(shù)據(jù)
執(zhí)行結(jié)果:成功返回所有內(nèi)頁
2、打開內(nèi)頁(即廣告盤鏈接頁),獲取廣告盤地址。下圖紅色箭頭,還不是真正的百度盤頁,需要點(diǎn)擊后才可以看的到百度盤的地址。所以這一步驟,只需要抓取紅色箭頭內(nèi)容地址;
代碼如下:
url = "https://www.xxxx.com/gc/toutiao/87098.html" response = requests.get(url= url) wb_data = response.text # 將頁面轉(zhuǎn)換成文檔樹 html = etree.HTML(wb_data) b = html.xpath('//div[@class = "pictext"]//@href') c=b[1] #需要注意的地方,class = "pictext"下有兩個(gè)href,我們只需要第一個(gè)href的值,所以返回值再賦值給c且取第二項(xiàng)數(shù)據(jù) print(c)
執(zhí)行結(jié)果:成功返回所有內(nèi)頁
3、獲取到廣告盤地址,接下來要打開該地址,抓百度盤真實(shí)地址。鏈接和提取碼在兩個(gè)不同的元素中,所有最后返回兩組數(shù)據(jù)。
代碼如下:
url = "http://xxx.la/xam9I6" response = requests.get(url= url) wb_data = response.text # 將頁面轉(zhuǎn)換成文檔樹 html = etree.HTML(wb_data) b = html.xpath('//tr/td/text()') c=b[6]#提取碼 d = html.xpath('//tr//@href')#百度地址 print(c) print(d)
注意,這里html.xpath寫法與上面有些區(qū)別,目標(biāo)元素的上級(jí)沒有class,只能模糊取值
比如提取碼的HTML結(jié)構(gòu)如下圖,結(jié)構(gòu)為//tr/td/,單/代表父節(jié)點(diǎn)下的子節(jié)點(diǎn),雙/代表父節(jié)點(diǎn)后的子孫節(jié)點(diǎn)。提取碼為tr的子節(jié)點(diǎn)。但是這個(gè)結(jié)構(gòu)下有很多組數(shù)據(jù),最后輸出一個(gè)數(shù)組b(看上面代碼b)。如此,我們找到提取碼位于數(shù)組序列,賦值給c(看上面代碼c),這樣獲得了真實(shí)的百度盤地址
網(wǎng)盤地址則因?yàn)橛衕ref屬性,所以好爬去一些,注意/的數(shù)量即可
4、把以上步驟拼成一個(gè)腳本,這里就涉及到函數(shù)和函數(shù)之間的傳參,還有循環(huán)的問題。代碼直接貼出來
# -*-coding:utf8-*- # encoding:utf-8 import requests from lxml import etree firstlink = "https://www.xxx.com/gc/qt/83720.html" AA=["https://www.xxx.com/gc/", "https://www.xxx.com/gc/index_2.html", "https://www.xxx.com/gc/index_3.html", "https://www.xxx.com/gq/", "https://www.xxx.com/gq/index_2.html", "https://www.xxx.com/gq/index_3.html", "https://www.xxx.com/gq/index_4.html"] #第1步,獲取第一頁面所有的地址 def stepa (AA): lit=[] for url in AA: response = requests.get(url=url) wb_data = response.text # 將頁面轉(zhuǎn)換成文檔樹 html = etree.HTML(wb_data) a = html.xpath('//ul[@class = "clearfix"]//@href') lit.append(a) return(lit) alllink = stepa(AA) #第2步,獲取的地址,循環(huán)讀取打開,從而獲取百度網(wǎng)盤信息 def stepb(alllink,firstlink): for list in alllink: for url in list: if url in firstlink: continue elif "www" in url: url2 = url else: url2 ="https://www.xxx.com" +url response = requests.get(url=url2) wb_data = response.text # 將頁面轉(zhuǎn)換成文檔樹 html = etree.HTML(wb_data) b = html.xpath('//div[@class = "pictext"]//@href') c = b[1] #print(c) #獲取到廣告頁地址 url3 = c response = requests.get(url=url3) wb_data = response.text # 將頁面轉(zhuǎn)換成文檔樹 html = etree.HTML(wb_data) d = html.xpath('//tr/td/text()') #print(d) e=d[6]#獲取提取碼 f = html.xpath('//tr//@href')#獲取地址 test = e[-5:]#提取碼值只保留提取碼(4位) test2 = f[-1]#鏈接只保留鏈接內(nèi)容,去掉前后[''] test3=test2+test#把鏈接和提取碼拼接成一條數(shù)據(jù) print(test3) with open('C:/Users/Beckham/Desktop/python/1.txt', 'a',encoding='utf-8') as w: w.write('\n'+test3) w.close() stepb(alllink,firstlink) #第3步:提示爬取完成 def over(): print("ok") over()
需要注意的地方:
1、return的用法,如果想把函數(shù)生成的值傳給后面的函數(shù)用,就需要返回這個(gè)值,如def stepa 里定義的a為爬去的套圖封面地址(通過打開這個(gè)地址進(jìn)行下一步),就需要return(a)返回a的值,否則執(zhí)行后無數(shù)據(jù)
2、Continue的應(yīng)用,因?yàn)榈谝粋€(gè)套圖地址打開的內(nèi)容沒有目標(biāo)內(nèi)容,這樣找不到元素會(huì)報(bào)錯(cuò),所以需要讀取套圖地址的時(shí)候要跳過第一個(gè)地址。加一個(gè)if判斷,當(dāng)?shù)谝粋€(gè)地址等于事先定義好的非正常地址的時(shí)候,跳過這個(gè)循環(huán)
打印結(jié)果:
案例二:
爬取豆瓣的讀書的評(píng)論
分析html,評(píng)論存儲(chǔ)放在標(biāo)紅色元素位置,且觀察結(jié)構(gòu),其他評(píng)論都存儲(chǔ)在li節(jié)點(diǎn)的相同位置
所以,xpath的解析對(duì)象為//*[@id="comments"]//div[2]/p/span
前面的實(shí)例講過"http://" 代表從當(dāng)前節(jié)點(diǎn)選取子孫節(jié)點(diǎn),這里就可以直接跳過li節(jié)點(diǎn),直接選擇li后的div[2]/p/span內(nèi)容
代碼如下:
# -*-coding:utf8-*- # encoding:utf-8 import requests from lxml import etree firstlink = "https://book.douban.com/subject/30172069/comments/hot?p=6" def stepa (firstlink): response = requests.get(url=firstlink) wb_data = response.text html = etree.HTML(wb_data) a = html.xpath('//*[@id="comments"]//div[2]/p/span') print(a) stepa (firstlink)
運(yùn)行代碼,打印出來的結(jié)果如下圖,沒有得到想要的評(píng)論內(nèi)容
后來發(fā)現(xiàn),想要獲取內(nèi)容,必須以文本的形式輸出,即xpath的解析對(duì)象為//*[@id="comments"]//div[2]/p/span/text()
修改后的代碼
# -*-coding:utf8-*- # encoding:utf-8 import requests from lxml import etree firstlink = "https://book.douban.com/subject/30172069/comments/hot?p=6" def stepa (firstlink): response = requests.get(url=firstlink) wb_data = response.text html = etree.HTML(wb_data) a = html.xpath('//*[@id="comments"]//div[2]/p/span/text()') print(a) stepa (firstlink)
執(zhí)行一下,內(nèi)容來了
參考地址:https://cuiqingcai.com/5545.html
總結(jié)
以上所述是小編給大家介紹的python 中xpath爬蟲實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。