作为一名比较懒的程序媛, 爬一点图片还是比一页一页翻是要省事些的, 啊哈哈...
这一次尝试的是Xpath而不是用正则
Xpath解析原理:
--标签定位 对标签的属性或者文本数据进行捕获
--xpath路径表达式进行标签定位
--xpath表达式必须作用在xpath函数中
--xpath函数被封装在etree对象中 (需页面源码数据加载到etree中)
通用性强
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