做爲一名比較懶的程序媛, 爬一點圖片仍是比一頁一頁翻是要省事些的, 啊哈哈...html
這一次嘗試的是Xpath而不是用正則函數
Xpath解析原理:url
--標籤訂位 對標籤的屬性或者文本數據進行捕獲spa
--xpath路徑表達式進行標籤訂位code
--xpath表達式必須做用在xpath函數中xml
--xpath函數被封裝在etree對象中 (需頁面源碼數據加載到etree中)htm
通用性強對象
from lxml import etree # 實例化一個etree對象 tree = etree.parse('./test.html') # 本地的一個HTML文件 # 解析操做 # 從最外層根節點一層層向下找 //表示多個層級 tree.xpath('//div[@class="xxx"]/p[4]/text()') # //div是定位到全部div, 返回的是一個列表 [@class="xxx"]-->是屬性定位 # /p[4] -->定位到第四個p標籤 # text() -->把定位到的標籤中 文本取出來 # /text()取出直系文本內容 一個元素 //text() 至少有多個元素的列表 # tree.xpath('//div[@class=""]/ul/li[2]/a/@href') # etree.HTML(response.text) # 用的多
1 import requests 2 from lxml import etree 3 import os 4 5 if not os.path.exists("chanelshow"): 6 os.mkdir("chanelshow") 7 8 # 構造請求頭 url, headers 9 url = "http://shows.vogue.com.cn/Chanel/" 10 headers = { 11 "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", 12 "Connection": "close" 13 } 14 # 先拿到響應 15 response = requests.get(url=url, headers=headers) 16 # 拿到響應的文本, html --> 傳入etree.HTML(page_text), etree.HTML()就是選取html文件中的節點或者節點集 17 page_text = response.text 18 19 tree = etree.HTML(page_text) 20 year_url_list = tree.xpath('//div[@class="tt"]/p/a/@href') # '//div[@class="tt"]/p/a/@href'路徑表達式 21 22 for year_url in year_url_list: 23 response2 = requests.get(url=year_url, headers=headers) 24 response2_text = requests.get(url=year_url, headers=headers).text 25 26 tree = etree.HTML(response2_text) 27 src_url_list = tree.xpath("//li[@class='item']/img/@crs") 28 name_list = tree.xpath("//li[@class='item']/img/@alt") 29 30 for index, src_url in enumerate(src_url_list): 31 img_data = requests.get(url=src_url, headers=headers).content 32 33 img_path = "chanelshow/" + name_list[index] + '.jpg' 34 with open(img_path, "wb") as fp: 35 fp.write(img_data) 36 # print("寫入成功") 37