1. 程式人生 > 程式設計 >python 中xpath爬蟲例項詳解

python 中xpath爬蟲例項詳解

案例一:

某套圖網站,套圖以封面形式展現在頁面,需要依次點選套圖,點選廣告盤連結,最後到達百度網盤展示頁面。

這一過程通過爬蟲來實現,收集百度網盤地址和提取碼,採用xpath爬蟲技術

1、首先分析圖片列表頁,該頁按照更新先後順序暫時套圖封面,檢視HTML結構。每一組“li”對應一組套圖。屬性href後面即為套圖的內頁地址(即廣告盤連結頁)。所以,我們先得獲取列表頁內所有的內頁地址(即廣告盤連結頁)

程式碼如下:

import requests 倒入requests庫
from lxml import etree 倒入lxml 庫(沒有這個庫,pip install lxml安裝)
url = "https://www.xxxx.com/gc/" 請求地址
response = requests.get(url= url) 返回結果
wb_data = response.text 文字展示返回結果
html = etree.HTML(wb_data) 將頁面轉換成文件樹
b = html.xpath('//ul[@class = "clearfix"]//@href') 這一步的意思是class“clearfix”下所有屬性為“href”賦值給“b”,因為我們的目標內容都展示在class“clearfix”下,且在href屬性後面
print(b) 列印b,這裡的b是一個數組
print(b[0]) 列印b的第一項資料

執行結果:成功返回所有內頁

2、開啟內頁(即廣告盤連結頁),獲取廣告盤地址。下圖紅色箭頭,還不是真正的百度盤頁,需要點選後才可以看的到百度盤的地址。所以這一步驟,只需要抓取紅色箭頭內容地址;

程式碼如下:

url = "https://www.xxxx.com/gc/toutiao/87098.html"
response = requests.get(url= url)
wb_data = response.text # 將頁面轉換成文件樹
html = etree.HTML(wb_data)
b = html.xpath('//div[@class = "pictext"]//@href')
c=b[1]  #需要注意的地方,class = "pictext"下有兩個href,我們只需要第一個href的值,所以返回值再賦值給c且取第二項資料
print(c)

執行結果:成功返回所有內頁

3、獲取到廣告盤地址,接下來要開啟該地址,抓百度盤真實地址。連結和提取碼在兩個不同的元素中,所有最後返回兩組資料。

程式碼如下:

url = "http://xxx.la/xam9I6"
response = requests.get(url= url)
wb_data = response.text
# 將頁面轉換成文件樹
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寫法與上面有些區別,目標元素的上級沒有class,只能模糊取值

比如提取碼的HTML結構如下圖,結構為//tr/td/,單/代表父節點下的子節點,雙/代表父節點後的子孫節點。提取碼為tr的子節點。但是這個結構下有很多組資料,最後輸出一個數組b(看上面程式碼b)。如此,我們找到提取碼位於陣列序列,賦值給c(看上面程式碼c),這樣獲得了真實的百度盤地址

網盤地址則因為有href屬性,所以好爬去一些,注意/的數量即可

4、把以上步驟拼成一個指令碼,這裡就涉及到函式和函式之間的傳參,還有迴圈的問題。程式碼直接貼出來

# -*-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
  # 將頁面轉換成文件樹
  html = etree.HTML(wb_data)
  a = html.xpath('//ul[@class = "clearfix"]//@href')
  lit.append(a)
 return(lit) 
alllink = stepa(AA)

#第2步,獲取的地址,迴圈讀取開啟,從而獲取百度網盤資訊
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 # 將頁面轉換成文件樹
   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
   # 將頁面轉換成文件樹
   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]#連結只保留連結內容,去掉前後['']
   test3=test2+test#把連結和提取碼拼接成一條資料
   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的用法,如果想把函式生成的值傳給後面的函式用,就需要返回這個值,如def stepa 裡定義的a為爬去的套圖封面地址(通過開啟這個地址進行下一步),就需要return(a)返回a的值,否則執行後無資料

2、Continue的應用,因為第一個套圖地址開啟的內容沒有目標內容,這樣找不到元素會報錯,所以需要讀取套圖地址的時候要跳過第一個地址。加一個if判斷,當第一個地址等於事先定義好的非正常地址的時候,跳過這個迴圈

列印結果:

案例二:

爬取豆瓣的讀書的評論

分析html,評論儲存放在標紅色元素位置,且觀察結構,其他評論都儲存在li節點的相同位置

所以,xpath的解析物件為//*[@id="comments"]//div[2]/p/span

前面的例項講過"//" 代表從當前節點選取子孫節點,這裡就可以直接跳過li節點,直接選擇li後的div[2]/p/span內容

程式碼如下:

# -*-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)

執行程式碼,打印出來的結果如下圖,沒有得到想要的評論內容

後來發現,想要獲取內容,必須以文字的形式輸出,即xpath的解析物件為//*[@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)

執行一下,內容來了

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

總結

以上所述是小編給大家介紹的python 中xpath爬蟲例項詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!