- 简介
- XPath定位方法
- 爬取图片
XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。在使用XPath前我们需要大致了解HTML / XHTML;XML / XML 命名空间,的相关知识。
什么是 XPath?
XPath 使用路径表达式在 XML 文档中进行导航
XPath 包含一个标准函数库
XPath 是 XSLT 中的主要元素
XPath 是一个 W3C 标准
XPath定位方法XPath 路径表达式:
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
首先我们需要导入lxml库
from lxml import html
实例化etree对象
etree = html.etree
将本地页面原码加载到etree对象中
tree = etree.parse('baidu.html')
定位的几种格式:
使用 .xpath()
# 1获取title对象 --> /:表示的是从根节点开始定位。表示的是一个层级。
xp = tree.xpath('/html/head/title/text()')
print(xp)
# 2获取body中所以div标签 --> /:表示的是从根节点开始定位。表示的是一个层级。
xp = tree.xpath('//p/text()')
print(xp)
# 3.3获取指定标签的div标签 --> /:表示的是从根节点开始定位。表示的是一个层级。
xp = tree.xpath('/html/body/div[@]')
# 4获取指定数据"杜牧"索引定位 --> /:表示的是从根节点开始定位。表示的是一个层级。
# 取文本:
# /text()获取的标签中直系文本里内容
# //text()标签非直系的文本内容(所有的文本内容)
xp = tree.xpath('/html/body/div[@]/ul/li[5]//text()')[0]
# 5获取img标签中的src --> /:表示的是从根节点开始定位。表示的是一个层级。
xp = tree.xpath('//div[@]/img/@src')[0]
爬取图片
这里爬取的是糗事百科热图前三页的内容
爬取前三页的内容我们使用循环,并使用 ==.format()==来切换页面url。
获取前三页url
url = 'https://www.qiushibaike.com/imgrank/page/{}/'
for i in range(1,4):
page_url = url.format(i)
总代码:
import requests
from lxml import html
import os
if __name__ == '__main__':
# UA伪装
header = {
'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 = 'https://www.qiushibaike.com/imgrank/page/{}/'
# 创建文件
if not os.path.exists('QiutuLib'):
os.mkdir('./QiutuLib')
# 主体部分
for i in range(1,4):
page_url = url.format(i)
# 建立网页链接
response = requests.get(url=page_url,headers=header)
ht = response.text
# 实例化etree
etree = html.etree
# 加入html内容
tree = etree.HTML(ht)
page_list = tree.xpath('//div[@]')
print(len(page_list))
for page in page_list:
text = page.xpath('.//div[@]//img/@src')[0]
pic_url = 'https:'+text
# 再次链接图片url下载图片
resp = requests.get(url=pic_url,headers=header)
pic = resp.content #转换为二进制流下载图片
fileName = text.split('/')[-1]
file_path = './QiutuLib/' + fileName
# 保存文件
# a表示追加,b换行但不隔行
with open(file_path,'ab') as f:
f.write(pic)
运行截图:



