描述:问世间bug为何物,直教人欲罢不能。来了来了,今天所描述的是Python爬取网站源码Xpath解析数据时候遇到的一个奇奇怪怪的bug。简单来说就是在浏览器中的Xpath路径显示需要抓取的数据了 但是拿到代码中 tree.xpath(解析)的时候 输出数据一直是空就很 大无语。。。。。。
- 在写爬虫的时候解析网页,使用xpath解析,在代码获取到源码数据 且经过测试代码非常肯定正确的情况下获取解析数据扔是空显示
- 可以理解为另一种反爬措施,在编写网页的时候通常省略一层标签,但是被省略的标签浏览器会自动补充,修改成正确的结构。。
- 我们通过浏览器进行检查的时候,看到的代码结构是已经被浏览器修改后的,而爬虫获取到的是源代码
- 所以根据修改后的xpath解析源代码会找不到相应的元素,返回值自然为空所以当使用xpath获取不到向相应的元素的时候,观察一下源码结构,根据源码进行解析 ——来源参考博客
💠一、场景&问题
在浏览器中编辑Xpath路径定位需要解析的数据
列表获取到的数据是空
💠二、思路解决
1、定位自己获取的content响应数据是否获取到
2、获取的源码结构数据是否和网页中保持一致
浏览器类名
源码类名
在这里我尝试了 将浏览器响应数据保存到本地 然后通过快捷键Ctrl + R 将不一样的类名进行全局替换 然后解析保存到本地的数据 在进行解析的时候 是报错了 那么后面尝试了直接解析响应数据
但是Xpath中的解析路径 写的是源码中的Class类名即
name_list = tree.xpath('//*[@class = "item"]/img/@alt')
OK 现在好了 然后我就对这个动态的Class类 有点好奇心
💠三、深入思考
- 作用:Class用于在纯静态的网页中来控制字体颜色,常用的静态页面有HTML,在这些页面中添加Class可以起到控制全局文字颜色统一的作用。
- 那么动态Class就需要用到一些JS知识 用到的思想是开关思想 其代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>电灯开关</title>
</head>
<body>
<img id="light2" src="img/off.gif" alt="">
<script>
/*
分析:
1.获取图片对象
2.绑定单击事件
3.每次点击切换图片
* 规则:
* 如果灯是开的 on,切换图片为 off
* 如果灯是关的 off,切换图片为 on
* 使用标记flag来完成
*/
//1.获取图片对象
var light2 = document.getElementById("light2");
var flag = false;//代表灯是灭的。 off图片
//2.绑定单击事件
light2.onclick = function () {
if (flag) {//判断如果灯是开的,则灭掉
light2.src = "img/on.gif"
flag = false;
} else {
light2.src = "img/off.gif"//如果灯是灭的,则打开
flag = true;
}
}
</script>
</body>
</html>
那么之所以在有些网页中会出现这种动态Class的情况 猜想 要么是一种简单的反爬手段 要么就是二次开发时候 为保持风格的统一 那么之前写好的Class样式 直接拿来引用 害 无心瞎想
那么之前说的动态Class也是有迹可循的 如果以后自己要写类似的HTML页面 就可以借鉴引用其代码思想啦
还有一种情况就是 图片懒加载
一般涉及到图片的网站都会涉及到懒加载
- 怎么理解这个懒加载 比如当我滑动页面 还没有将图片显示出来的时候 网页中存储图片的路径是src2 那么当我鼠标滑动到页面的该图片上的那一刻 图片的路径src2立刻就变成了src 其原理和上面所述相同 都是源码数据和网页数据有出入
💠四、完整代码
# _*_ codding : utf-8 _*_
# @Time : 2022/10/3 14:56
# @Auther : 王小哥
# @Project : Project
import urllib.request
from lxml import etree
def create_request(page):
if (page == 1):
url = 'https://sc.chinaz.com/tupian/meinvtupian.html'
else:
url = 'https://sc.chinaz.com/tupian/meinvtupian_' + str(page) + '.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
}
request = urllib.request.Request(url=url, headers=headers)
return request
def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
with open('sister.html', 'w', encoding='utf-8') as fp:
fp.write(content)
return content
def down_load(content):
# 下载图片
tree = etree.HTML(content)
# 获取图片名称
name_list = tree.xpath('//*[@class = "item"]/img/@alt')
# 一般涉及到图片的网站都会涉及到懒加载
# 获取图片
src_list = tree.xpath('//div[@class = "item"]/img/@data-original')
for i in range(len(name_list)):
name = name_list[i]
src = src_list[i]
url = 'https:' + src
urllib.request.urlretrieve(url=url, filename='./Demo/Love_Sister/' + name + '.jpg')
if __name__ == '__main__':
star_page = int(input("请输入开始页码"))
end_page = int(input("请输入结束页码"))
for page in range(star_page, end_page + 1):
# 1、请求对象定制
request = create_request(page);
# 2、模拟浏览器发送请求
content = get_content(request);
# 3、下载数据(图片)
down_load(content)
💠五、参考文章
爬虫使用xpath解析时返回为空,获取不到相应的元素的原因和解决办法_小鱼干儿♛的博客-CSDN博客_为什么爬虫爬出来是空的