Python爬虫关于多层嵌套iframe的解决

近期由于公司资源需要,我爬取了一个视频网站,结果以为一个很容易的小爬虫,却步步是坑啊,费了一天终于都解决了(太菜了!!!)。

前面导航页的爬虫就不多说了,无非就是webdriver和PhantomJS,然后设置referer和ua,就可以一层一层访问了。其实大多数的网站的防爬都会这么做。

然后到了详情页面,就是我遇到的最困难的一步了。网站为了防止爬虫,嵌套了3层iframe,并且每个iframe都有很多限制,单独打开无法得到想要的数据。

但是PhantomJS获取到的网站源码即使是js加载完成以后的源码也是无法得到iframe里面的源码的,在网上找了很多方法,然后终于找到了方法。

driver.get(url)
iframe = driver.find_elements_by_tag_name('iframe')[1]
driver.switch_to.frame(iframe)                          # 最重要的一步
soup = BeautifulSoup(driver.page_source, "html.parser")

最主要的就是driver.switch_to.frame(iframe) 这个方法,它会尽到iframe里面去执行,这样的话就不需要你在去设置referer之类的了,很方便的就访问了。到这一步大多数的iframe里面的东西就可以取到了。

但是!!!这个网站防爬还是做的比较不错了,iframe里面的数据还是获取不到视频的源,js代码都执行了。没办法了,最后使用webdriver.Chrome方法才获取到了数据。看来PhantomJS还是有一些功能限制啊。

每次访问不能一直打开浏览器呀,这样在服务器也无法实现,幸好webdriver.Chrome还提供方法实现无窗口访问,代码就是这样的:

chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome('/usr/local/Sunanang/chromedriver/chromedriver',
                          chrome_options=chrome_options)

到此,基本的功能也实现了。
具体实现代码如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.options import Options
import sys
from pyvirtualdisplay import Display

chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome('/usr/local/Sunanang/chromedriver/chromedriver',
                          chrome_options=chrome_options)


def getDriverHttp(url):
    driver.get(url)
    iframe = driver.find_elements_by_tag_name('iframe')[1]
    driver.switch_to.frame(iframe)                          # 最重要的一步
    soup = BeautifulSoup(driver.page_source, "html.parser")
    return soup


def getVideoUrl(url):
    soup = getHttp(url)
    miPlayer = soup.find('div',id='J_miPlayer')
    url = miPlayer.find('video').get('src')
    driver.quit()
    return url


if __name__ == '__main__':
    path = getVideoUrl(u'http://aaxxy.com/vod-play-id-10788-src-1-num-2.html')
# path = getVideoUrl(url==sys.argv[1])
    print path

最后才发现代码真的非常非常少,结果费了一天的功夫才解决。记录一下,提醒一下自己有多菜。

  • 12
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果遇到 iframe 多层嵌套的情况,可以使用 Selenium 模拟浏览器操作来解决。 Selenium 可以模拟用户在浏览器中的操作,比如点击、输入、滚动等。通过 Selenium,我们可以打开一个网页,并模拟用户操作来获取页面上的数据。 具体来说,可以按照以下步骤进行: 1. 安装 Selenium 库 ``` pip install selenium ``` 2. 下载对应的浏览器驱动,并将其添加到 PATH 环境变量中。如果使用的是 Chrome 浏览器,则需要下载 ChromeDriver,下载地址为:http://chromedriver.chromium.org/downloads。 3. 在 Python 中使用 Selenium 进行爬虫操作。具体可参考以下示例代码: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 创建 Chrome 浏览器实例 driver = webdriver.Chrome() # 打开网页 driver.get("http://example.com") # 等待 iframe 加载完成 wait = WebDriverWait(driver, 10) iframe = wait.until(EC.presence_of_element_located((By.XPATH, "//iframe"))) # 切换到 iframe 中 driver.switch_to.frame(iframe) # 获取 iframe 中的元素 element = driver.find_element_by_xpath("//div") # 切换回主页面 driver.switch_to.default_content() # 关闭浏览器 driver.quit() ``` 在上述代码中,首先创建了一个 Chrome 浏览器实例,并打开了一个网页。然后,使用 WebDriverWait 类等待 iframe 元素加载完成,然后切换到 iframe 中,并获取其中的元素。最后,切换回主页面,关闭浏览器。 需要注意的是,Selenium 模拟浏览器操作的速度比较慢,如果需要爬取大量数据,建议使用其他方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值