Scrapy+Selenium 获取iframe下的document

需求:获取iframe h3下的标题,img的源,及a标签的落地页

需要先熟悉Selenium的同学:点击学习

使用xpath获取iframe下的内容为空,如图

1
<iframe data-v-5a33f2b6="" id="preview-iframe-18769" class="idea-preview-iframe" style="height: 259.817px;" frameborder="0"></iframe>

可采用execute_script运行js获取,获取iframe下的document使用[iframe标签].contentWindow.document

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 当前iframe有多个,而且id是动态的。首先找到id
temp_iframe_id = box.xpath('.//td[3]/div/div/div/iframe/@id').extract()[0]
# 广告落地页 重试三次 因为是动态渲染,可能存在未渲染结束问题
for i in range(0, 3):
try:
item['landing_page'] = self.browser.execute_script(
'return document.getElementById("' + temp_iframe_id + '").contentWindow.document.getElementsByTagName("a")[0].href')
break
except JavascriptException as e:
logging.info("没找到落地页")
time.sleep(1)
# 创意名称
for i in range(0, 3):
try:
item['creative_title'] = self.browser.execute_script(
'return document.getElementById("' + temp_iframe_id + '").contentWindow.document.getElementsByTagName("h3")[0].innerText')
break
except JavascriptException as e:
logging.info("没找到标题")
time.sleep(1)
# 创意图片链接 思路:先找到所有的img标签,再遍历拿到src数组返回
for i in range(0, 3):
try:
item['images'] = self.browser.execute_script(
'var images = document.getElementById("' + temp_iframe_id
+ '").contentWindow.document.getElementsByTagName("img");'
'var imgURLs=new Array(images.length);'
'for(var i = 0;i<images.length;i++){ imgURLs[i] = images[i].src;}'
'return imgURLs;')
break
except JavascriptException as e:
logging.info("没找到创意链接")
time.sleep(1)

即可获得结果。

1
2
3
4
5
{
"creative_title": "手机产生大量缓存垃圾,影响手机速度,请立即清理",
"images": ["http://static.wkanx.com/w002/M00/04/2C/CgIXGF3vetuAFFfMAABUij8AZa024.jpeg?t=8d5bfab5c8eac5c980c360add3384f37&w=648&h=360"],
"landing_page": "http://static.wkanx.com/w002/M00/04/6F/CgIXgV4DLW6AMV2cARFMEYnYn9A511.apk?t=7e12bede36f56c60e2b00329f6faea68"
}

对js不熟悉的同学提前在console(控制台)试了能用再拉过来哦~

-------------本文结束啦 感谢您的阅读-------------
所谓向日葵族 wechat
💡 更多好文欢迎关注我的公众号~
觉得不错的话,点个赞🌟吧~
0%