使用xpath爬取4K高清动漫图片名称和图片数据
爬取当前页:
# 创建文件夹 存储图片dirName = 'GirlsLib'if not os.path.exists(dirName):os.mkdir(dirName)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'}url = '/4kdongman/'response = requests.get(url=url, headers=headers)response.encoding = 'gbk' # 页面的编码是gbkpage_text = response.text# 解析图片名称+图片数据tree = etree.HTML(page_text)
然后我们来分析下:
打开浏览器抓包工具,我们可以定位到图片 存储的到的指定的<li>
标签
这段代码前我们需要用到 局部数据解析,什么是局部数据分析呢?
先看下代码:
li_list = tree.xpath('//div[@class="slist"]/ul/li')for li in li_list:type(li) # li的数据类型和tree的数据类型一样(<class 'lxml.etree._Element'>),那么li也可以调用xpath方法title = li.xpath('./a/img/@alt')[0] + '.jpg' # 进行局部数据解析.返回的是列表,所以这里这[0] img_src = '' + li.xpath('./a/img/@src')[0] img_data = requests.get(img_src, headers=headers).contentimgPath = dirName + '/' + titlewith open(imgPath, 'wb') as f:f.write(img_data)print(title + '保存成功!!!')
步骤说明:
存储的是定位到的指定的<li>
标签
局部数据解析:
我们要将定位到的页面中的标签作为待解析的数据。再次使用xpath表达式解析的数据在局部数据解析的时候,xpath
表达式中药使用./的操作,./表示的就是当前的局部数据(xpath
的调用者)
这样,我们就完整提取出图片名称和图片地址了。
爬取多页(5页):
我们看到第二页的url:
ulr=/4kdongman/index_2.html
很容易知道分页都是index_d 的
这样,定义一个通用的url模板,
可以利用format
函数来实现。
但我们发现 第一页和第二页的url不同,所以还是要加个判断。
for page in range(1, 6):if page == 1:new_url = '/4kdongman/'else:new_url = format(url % page)
后续的操作就可以复制之前的代码加进循环里,就可以实现多页下载了!
分享小技巧:xpath表达式也可以在浏览器抓包工具里复制的
完整代码如下:
import osimport requestsfrom lxml import etree# 创建保存路径dirName = 'GirlsLib'if not os.path.exists(dirName):os.mkdir(dirName)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'}url = '/4kdongman/index_%d.html'for page in range(1, 6):if page == 1:new_url = '/4kdongman/'else:new_url = format(url % page)# 复制之前的代码加进循环里response = requests.get(url=new_url, headers=headers)response.encoding = 'gbk'page_text = response.texttree = etree.HTML(page_text)li_list = tree.xpath('//div[@class="slist"]/ul/li')for li in li_list:title = li.xpath('./a/img/@alt')[0] + '.jpg' img_src = '' + li.xpath('./a/img/@src')[0]img_data = requests.get(img_src, headers=headers).contentimgPath = dirName + '/' + titlewith open(imgPath, 'wb') as f:f.write(img_data)print(title + '保存成功!!!')
运行后,唯美又可爱的动漫小姐姐就下载到电脑了!