记录一下最近写的爬虫项目遇到的坑。
项目需要获取网页tag元素的全部内容,但是selenium没有提供这个功能,遂想到js里dom的元素innerHTML。但是问题来了,怎么把js变量保存到python变量中呢?
步骤如下:
1.使用selenium的execute("console.log("相关信息");")将信息输出至浏览器日志系统。
2.使用selenium的driver.get_log("browser")获取浏览器日志。
代码如下:
driver.get("https://www.baidu.com")
driver.execute("console.log(document.getElementById(\"s_kw_wrap\"));")
content = driver.get_log("browser")[0]
print(content)
经过测试,上面的方法是错误的!!!!!并不能够获取到浏览器日志中的内容,原因是浏览器为了安全并不允许读取日志内容!!!所以上面的方法并不能得到浏览器控制台console.log()函数输出的信息。想获得标签只能另寻他法。如下:
1.通过运行selenium中的execute_script()函数,使用js将标签内容写入本地,以txt文件的形式存储。
2.读取txt文件,获得标签内容。
第一步代码如下:
driver.execute_script(
"""
//js使用dom技术获取标签
let elements = document.getElementsByClassName("content-wrapper")[0].children;
let e_length = elements.length;
let content = ""
for(let i = 0; i < e_length; i++){
//获取标签内容,保存在content变量中
content += elements[i].innerHTML;
console.log(content)
}
//将标签内容存入本地,此时如果没有指定chrome浏览器下载路径,将下载到默认路径
//更改浏览器默认下载路径见其他博文,很容易改
(function download(filename,content) {
var a = document.createElement('a');
var blob = new Blob([content], { 'type': 'application/octet-stream' });
a.href = window.URL.createObjectURL(blob);
a.download = filename;
a.click();
})("data.txt", content);
"""
)
第二步代码如下:
with open("./src/data/temp/data.txt", "r", "utf-8-sig") as file:
for content in file.readlines():
print(content)
至此,从页面读取完整html标签的工作做完。