欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python 中xpath爬蟲(chóng)實(shí)例詳解

 更新時(shí)間:2019年08月26日 10:18:55   作者:小貝書(shū)屋  
這篇文章主要介紹了python實(shí)例:xpath爬蟲(chóng)實(shí)例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

案例一:

某套圖網(wǎng)站,套圖以封面形式展現(xiàn)在頁(yè)面,需要依次點(diǎn)擊套圖,點(diǎn)擊廣告盤(pán)鏈接,最后到達(dá)百度網(wǎng)盤(pán)展示頁(yè)面。

這一過(guò)程通過(guò)爬蟲(chóng)來(lái)實(shí)現(xiàn),收集百度網(wǎng)盤(pán)地址和提取碼,采用xpath爬蟲(chóng)技術(shù)

1、首先分析圖片列表頁(yè),該頁(yè)按照更新先后順序暫時(shí)套圖封面,查看HTML結(jié)構(gòu)。每一組“l(fā)i”對(duì)應(yīng)一組套圖。屬性href后面即為套圖的內(nèi)頁(yè)地址(即廣告盤(pán)鏈接頁(yè))。所以,我們先得獲取列表頁(yè)內(nèi)所有的內(nèi)頁(yè)地址(即廣告盤(pán)鏈接頁(yè))

代碼如下:

import requests 倒入requests庫(kù)
from lxml import etree 倒入lxml 庫(kù)(沒(méi)有這個(gè)庫(kù),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) 將頁(yè)面轉(zhuǎn)換成文檔樹(shù)
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)頁(yè)

2、打開(kāi)內(nèi)頁(yè)(即廣告盤(pán)鏈接頁(yè)),獲取廣告盤(pán)地址。下圖紅色箭頭,還不是真正的百度盤(pán)頁(yè),需要點(diǎn)擊后才可以看的到百度盤(pán)的地址。所以這一步驟,只需要抓取紅色箭頭內(nèi)容地址;

代碼如下:

url = "https://www.xxxx.com/gc/toutiao/87098.html"
response = requests.get(url= url)
wb_data = response.text # 將頁(yè)面轉(zhuǎn)換成文檔樹(shù)
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)頁(yè)

3、獲取到廣告盤(pán)地址,接下來(lái)要打開(kāi)該地址,抓百度盤(pán)真實(shí)地址。鏈接和提取碼在兩個(gè)不同的元素中,所有最后返回兩組數(shù)據(jù)。

代碼如下:

url = "http://xxx.la/xam9I6"
response = requests.get(url= url)
wb_data = response.text
# 將頁(yè)面轉(zhuǎn)換成文檔樹(shù)
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寫(xiě)法與上面有些區(qū)別,目標(biāo)元素的上級(jí)沒(méi)有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í)的百度盤(pán)地址

網(wǎng)盤(pán)地址則因?yàn)橛衕ref屬性,所以好爬去一些,注意/的數(shù)量即可

4、把以上步驟拼成一個(gè)腳本,這里就涉及到函數(shù)和函數(shù)之間的傳參,還有循環(huán)的問(wèn)題。代碼直接貼出來(lái)

# -*-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步,獲取第一頁(yè)面所有的地址
def stepa (AA):
 lit=[]
 for url in AA:
  response = requests.get(url=url)
  wb_data = response.text
  # 將頁(yè)面轉(zhuǎn)換成文檔樹(shù)
  html = etree.HTML(wb_data)
  a = html.xpath('//ul[@class = "clearfix"]//@href')
  lit.append(a)
 return(lit) 
alllink = stepa(AA)

#第2步,獲取的地址,循環(huán)讀取打開(kāi),從而獲取百度網(wǎng)盤(pán)信息
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 # 將頁(yè)面轉(zhuǎn)換成文檔樹(shù)
   html = etree.HTML(wb_data)
   b = html.xpath('//div[@class = "pictext"]//@href')
   c = b[1]
   #print(c)
   #獲取到廣告頁(yè)地址
   url3 = c
   response = requests.get(url=url3)
   wb_data = response.text
   # 將頁(yè)面轉(zhuǎn)換成文檔樹(shù)
   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為爬去的套圖封面地址(通過(guò)打開(kāi)這個(gè)地址進(jìn)行下一步),就需要return(a)返回a的值,否則執(zhí)行后無(wú)數(shù)據(jù)

2、Continue的應(yīng)用,因?yàn)榈谝粋€(gè)套圖地址打開(kāi)的內(nèi)容沒(méi)有目標(biāo)內(nèi)容,這樣找不到元素會(huì)報(bào)錯(cuò),所以需要讀取套圖地址的時(shí)候要跳過(guò)第一個(gè)地址。加一個(gè)if判斷,當(dāng)?shù)谝粋€(gè)地址等于事先定義好的非正常地址的時(shí)候,跳過(guò)這個(gè)循環(huán)

打印結(jié)果:

案例二:

爬取豆瓣的讀書(shū)的評(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í)例講過(guò)"http://" 代表從當(dāng)前節(jié)點(diǎn)選取子孫節(jié)點(diǎn),這里就可以直接跳過(guò)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)行代碼,打印出來(lái)的結(jié)果如下圖,沒(méi)有得到想要的評(píng)論內(nèi)容

后來(lá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)容來(lái)了

參考地址:https://cuiqingcai.com/5545.html

總結(jié)

以上所述是小編給大家介紹的python 中xpath爬蟲(chóng)實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • Python字符編碼與函數(shù)的基本使用方法

    Python字符編碼與函數(shù)的基本使用方法

    下面小編就為大家?guī)?lái)一篇Python字符編碼與函數(shù)的基本使用方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 在Django的通用視圖中處理Context的方法

    在Django的通用視圖中處理Context的方法

    這篇文章主要介紹了在Django的通用視圖中處理Context的方法,Django是最具人氣的Python web開(kāi)發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • 使用python實(shí)現(xiàn)哈希表、字典、集合操作

    使用python實(shí)現(xiàn)哈希表、字典、集合操作

    這篇文章主要介紹了使用python實(shí)現(xiàn)哈希表、字典、集合操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 利用Python發(fā)送 10 萬(wàn)個(gè) http 請(qǐng)求

    利用Python發(fā)送 10 萬(wàn)個(gè) http 請(qǐng)求

    這篇文章主要介紹了如何利用Python發(fā)送 10 萬(wàn)個(gè) http 請(qǐng)求,下面我們講利用Python寫(xiě)代碼實(shí)現(xiàn)10 萬(wàn)個(gè) url,對(duì)每個(gè) url 發(fā)送 http 請(qǐng)求,并打印請(qǐng)求結(jié)果的狀態(tài)碼,需要的朋友可以參考一下
    2021-12-12
  • Python中conda虛擬環(huán)境創(chuàng)建及使用小結(jié)

    Python中conda虛擬環(huán)境創(chuàng)建及使用小結(jié)

    本文主要介紹了Python中conda虛擬環(huán)境創(chuàng)建及使用小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • 使用Nginx+uWsgi實(shí)現(xiàn)Python的Django框架站點(diǎn)動(dòng)靜分離

    使用Nginx+uWsgi實(shí)現(xiàn)Python的Django框架站點(diǎn)動(dòng)靜分離

    這篇文章主要介紹了使用Nginx+uWsgi實(shí)現(xiàn)Python的Django框架站點(diǎn)動(dòng)靜分離的部署實(shí)例,即靜態(tài)由Nginx處理而Python頁(yè)面由Django自帶的HTTP服務(wù)器處理,需要的朋友可以參考下
    2016-03-03
  • python、java等哪一門(mén)編程語(yǔ)言適合人工智能?

    python、java等哪一門(mén)編程語(yǔ)言適合人工智能?

    哪一門(mén)編程語(yǔ)言適合人工智能?這篇文章主要為大家詳細(xì)介紹了python編程語(yǔ)言適合人工智能的原因、優(yōu)點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Python PyQt5整理介紹

    Python PyQt5整理介紹

    PyQt5 是Digia的一套Qt5應(yīng)用框架與python的結(jié)合,同時(shí)支持2.x和3.x。這篇文章給大家整理了關(guān)于Python PyQt5的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2020-04-04
  • 通過(guò)Pandas讀取大文件的實(shí)例

    通過(guò)Pandas讀取大文件的實(shí)例

    今天小編就為大家分享一篇通過(guò)Pandas讀取大文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python中threading.Timer()定時(shí)器實(shí)現(xiàn)定時(shí)任務(wù)

    Python中threading.Timer()定時(shí)器實(shí)現(xiàn)定時(shí)任務(wù)

    本文主要介紹了Python中threading.Timer()定時(shí)器實(shí)現(xiàn)定時(shí)任務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評(píng)論