某套圖網站,套圖以封面形式展現在頁面,需要依次點擊套圖,點擊廣告盤鏈接,最后到達百度網盤展示頁面。
這一過程通過爬蟲來實現,收集百度網盤地址和提取碼,采用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.192ta.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://17d.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-*-
import requests
from lxml import etree
firstlink = "https://www.xxx.com/gc/qt/83720.html"
#第一步,獲取第一頁面所有的地址
def stepa ():
url = "https://www.xxx.com/gc/"
response = requests.get(url=url)
wb_data = response.text
# 將頁面轉換成文檔樹
html = etree.HTML(wb_data)
a = html.xpath('//ul[@class = "clearfix"]//@href')
return(a)
alllink = stepa()
#第二步,獲取的地址,循環讀取打開,從而獲取百度網盤信息
def stepb(alllink,firstlink):
for url in alllink:
if url == firstlink:
continue
response = requests.get(url=url)
wb_data = response.text
# 將頁面轉換成文檔樹
html = etree.HTML(wb_data)
b = html.xpath('//div[@class = "pictext"]//@href')
c = b[1]
#獲取到廣告頁地址
url2 = c
response = requests.get(url=url2)
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)
#獲取百度地址和提取碼
stepb(alllink,firstlink)
需要注意的地方:
1、return的用法,如果想把函數生成的值傳給后面的函數用,就需要返回這個值,如def stepa 里定義的a為爬去的套圖封面地址(通過打開這個地址進行下一步),就需要return(a)返回a的值,否則執行后無數據
2、Continue的應用,因為第一個套圖地址打開的內容沒有目標內容,這樣找不到元素會報錯,所以需要讀取套圖地址的時候要跳過第一個地址。加一個if判斷,當第一個地址等于事先定義好的非正常地址的時候,跳過這個循環
打印結果:
參考地址:https://cuiqingcai.com/5545.html