Python 模块By导入失败?

Python爬虫爬取m3u8流媒体加密视频并定位iframe

无法导入By以致无法定位ifame

1、先解析网页并定位iframe

from selenium.webdriver.chrome.options import Options #(这个需要前提引入的,就想时间等待一样)
import requests
import threading
from bs4 import BeautifulSoup
import re
from selenium import webdriver
import selenium.webdriver.common.by import By
import os
import warnings
warnings.simplefilter('ignore',ResourceWarning)
url = 'http://www.zhirongedu.com/vodplay/46967-1-1.html'
# 开启无头模式提取视频m3u8路径地址
ch_options = Options()
ch_options.add_argument('--headless')
driver =  webdriver.Chrome(chrome_options=ch_options)
videoAnalysis = driver.get(url)
videoName = driver.title   # 获取当前页面title值
print(videoName)

def find_all_iframes(driver, name='WorkAreaFrame1'):
    iframes = driver.find_elements(by=By.XPATH, value = "//iframe")
    for index, iframe in enumerate(iframes):
        if iframe.get_attribute('name') == name:
            driver.switch_to.frame(iframe)
            # 需要执行的操作写在这里
            driver.switch_to.parent_frame()
            return
        else:
            driver.switch_to.frame(index)
            find_all_iframes(driver, name)
            driver.switch_to.parent_frame()
videoSrcAll = find_all_iframes(driver, name='WorkAreaFrame1')
print(videoSrcAll)
driver.close()


2、找到流媒体m3u8真实链接

# 链接分割取出真正的m3u8
videoSrc = str(url).split('=')[1]   # 取出“=”分割的右半部分
print(videoSrc)   # 输出我们所需的url
html = requests.get(videoSrc).text
print(html)   # 输出我们所需的url的内容
#html=r.text#储存到的信息以text呈现
soup=BeautifulSoup(html,'html.parser')#解析数据
getShortSrc = html.split('\n')[2]   # 获取文件第三行内容
print(getShortSrc)
noindexurl = url.replace('index.m3u8', '\s')   # 删除url的index.m3u8
trueUrl = noindexurl + getShortSrc   # 得到m3u8二次链接(真正的m3u8链接)
print(trueUrl)

3、以text文本呈现

res1 = requests.get(trueUrl).text
print(res1)

4、列出js列表

tslist = re.findall('EXTINF:(.*),\n(.*)\n#', res1)  # 得到每一个ts视频名称
newlist = []
for i in tslist:
    newlist.append(i[int])   # 将ts视频名称添加到列表中
print(newlist)   # 输出列表
noindextrueurl = trueUrl.replace('index.m3u8', '\s')  # 删除trueurl的index.m3u8
tslisturl = []   # 构造链接空列表
for i in newlist:
    tsurl = noindextrueurl + i
    tslisturl.append(tsurl)
print(tslisturl)  # 输出列表


5、解密下载并储存

def downloadvideo(tslisturl, videoName):
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
    }
    path = './' + videoName.strip() + ".mp4"
    videolen = len(tslisturl)

    for i in tslisturl:
        print("视频下载中...剩余" + str(videolen) + "个ts视频未下载!")
        videolen = videolen - 1
        r = requests.get(i, header).content
        videoName = i[-9:-3] + '.ts'
        if os.path.exists(folder ):
         continue
        with open(folder, 'ab+') as f:
            f.write(r.content)
            
        tslisturl = f.readlines()
        f.close()
    count=0
    for i in tslisturl:
     if "#" not in i:
        i = i.replace("\n","\s")
        n = i[-7:]
        threading.Thread(target=downloadvideo, args=(noindextrueurl+""+i,"cdzj2/"+str(n),)).start()
        downloadvideo(noindextrueurl+""+i,"cdzj2/"+str(count)+".ts")
    print("视频下载完毕!")
    download_file = "G:\Desktop"
    folder = os.path.exists(download_file + '/' + path)
    if not folder:
     os.makedirs(download_file + '/' + path)
    folder = download_file + '/' + path


定位iframe运行结果

 File "d:\mypycode\TEST\.vscode\film1.py", line 7
    import selenium.webdriver.common.by import By
                                        ^^^^^^   
SyntaxError: invalid syntax


```

引用chatgpt内容作答:
根据您提供的代码和错误信息,问题出在以下这行代码上:

import selenium.webdriver.common.by import By

正确的导入语句应该是:

from selenium.webdriver.common.by import By

请将导入语句修改为上述形式,然后再次尝试运行您的代码。这样应该就能够成功导入 By 模块,并定位 iframe。

加在代码开头 ,如有帮助给个采纳谢谢 :

from selenium.webdriver.common.by import By
import selenium.webdriver


from selenium.webdriver.common.by import By

更改
import selenium.webdriver.common.by import By
from selenium.webdriver.common.by import By
爬虫问题还未解决

  • 这篇博客: python爬虫从基础到实战一站式服务中的 4,iframe处理+动作链 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 像上面直接通过id或者class获取标签的话,如果这些标签在iframe里就会报错!

    这里使用selenium来实现拖动滑块

    from selenium import webdriver
    #导入动作链对应的类
    from selenium.webdriver import ActionChains
    
    # 实例化一个浏览器对象(传入浏览器的驱动程序chromedriver.exe)
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    # 让浏览器发起一个指定url对应请求
    bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    # 如果定位的标签是存在与iframe中则必须通过如下操作再进行标签定位
    bro.switch_to.frame('iframeResult')# 切换浏览器标签定位的作用域
    # 获取拖动小滑块的div元素
    div = bro.find_element_by_id('draggable')
    # 动作链
    action = ActionChains(bro)
    # 点击长按指定的标签(滑块)
    action.click_and_hold(div)
    for i in range(5):
        # perform立即执行动作链操作
        # move_by_offset(x,y):x:水平方向 y:竖直方向
        action.move_by_offset(17,0).perform()
    # 释放动作链
    action.release()
    bro.quit()