【问题标题】:Selenium returns unknownProtocolFound errorSelenium 返回 unknownProtocolFound 错误
【发布时间】:2017-07-04 11:13:37
【问题描述】:

我正在尝试使用 Firefox WebdriverSeleniumPython从 [此 GooglePlay 直接链接生成器][1] 下载 APK 文件>.

问题是,当 Selenium 尝试获取主页时,它会崩溃并显示以下错误消息:

/usr/bin/python2.7 /home/ghasemi/PycharmProjects/phorcys_watcher/main.py
http://apps.evozi.com/apk-downloader/?id=com.instagram.android
Traceback (most recent call last):
  File "/home/ghasemi/PycharmProjects/phorcys_watcher/main.py", line 7, in <module>
    content = google_play_download("com.instagram.android")
  File "/home/ghasemi/PycharmProjects/phorcys_watcher/collector.py", line 20, in google_play_download
    browser.get("https://apps.evozi.com/apk-downloader/?id=" + app_page_id)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 268, in get
    self.execute(Command.GET, {'url': url})
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Reached error page: about:neterror?e=unknownProtocolFound&u=httpss%3A//www.adnetworkperformance.com/script/java.php%3Foption%3Drotateur%26r%3D411313%26treqn%3D1025813717%26runauction%3D1%26crr%3D168ce9d76b1a6695b12e%2CwcwHrNzGnshFns2PnM3bbcwGW8xLz-mNycwuvZjurZja3MzJfMxG_9xMX4wYns7a2YxHvshBL9xe3shbjN2J7umN6umNm-mNuN2czNw723956800778f24b2db6%26rtid%3D595b6ecb8ac19%26cbrandom%3D0.7519066097934798%26cbtitle%3DAPK%2520Downloader%2520%255BLatest%255D%2520Download%2520Directly%2520%257C%2520Chrome%2520Extension%2520v3%2520%28Evozi%2520Official%29%26cbiframe%3D0%26cbWidth%3D1280%26cbHeight%3D717%26cbdescription%3DDownload%2520APKs%2520Directly%2520From%2520Google%2520Play%2520To%2520Your%2520Computer%2520With%2520APK%2520Downloader%2520Extension%2520For%2520Google%2520Chrome%26cbkeywords%3D%26cbref%3D&c=&f=regular&d=Firefox%20doesn%E2%80%99t%20know%20how%20to%20open%20this%20address%2C%20because%20one%20of%20the%20following%20protocols%20%28httpss%29%20isn%E2%80%99t%20associated%20with%20any%20program%20or%20is%20not%20allowed%20in%20this%20context.

在这一行抛出异常: browser.get("https://apps.evozi.com/apk-downloader/?id=com.instagram.android")

正如您在上面看到的,此错误的根源是 selenium 尝试下载它的页面中的错误链接。我找到了导致此错误的框架:

<iframe width="468" height="60" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" allowfullscreen="true" style="border: medium none; padding: 0; margin: 0;" sandbox="allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-pointer-lock allow-same-origin" id="595b6e88086f8" frameborder="0" src="httpss://www.adnetworkperformance.com/script/java.php?option=rotateur&amp;r=411313&amp;treqn=501505383&amp;runauction=1&amp;crr=fc25086f39dc3c58bbdbGJTJyVGZh9Gbud3bk1yawFmRyUSbvNmLpp3b2VmLzBHchZkMlYkMlE0MlMHc0RHa2dfe473f7c304fd8fb65&amp;rtid=595b6e88086f8&amp;cbrandom=0.6676681852413189&amp;cbtitle=APK%20Downloader%20%5BLatest%5D%20Download%20Directly%20%7C%20Chrome%20Extension%20v3%20(Evozi%20Official)&amp;cbiframe=0&amp;cbWidth=1522&amp;cbHeight=741&amp;cbdescription=Download%20APKs%20Directly%20From%20Google%20Play%20To%20Your%20Computer%20With%20APK%20Downloader%20Extension%20For%20Google%20Chrome&amp;cbkeywords=&amp;cbref=" scrolling="no"></iframe>

如您所见,网页开发者错误地输入了httpss 而不是https(两次!)。

我该如何处理这个问题?

更新:

我的刮刀:

import requests
from lxml import html
from pyvirtualdisplay import Display
from selenium import webdriver

def google_play_download(app_page_id):
    browser = webdriver.Firefox()
    browser.get("https://apps.evozi.com/apk-downloader/?id=" + app_page_id)
    browser.find_element_by_css_selector(".btn.btn-primary.btn-lg.btn-block").click()
    apk_link = browser.find_element_by_css_selector(".btn.btn-success.btn-block").get_attribute('href')
    browser.quit()
    for rnd in range(5):
        resp = requests.get(apk_link)
        if resp.headers['Content-Length'] == str(len(resp.content)):
            return resp.content


if __name__ == "__main__":
    content = google_play_download("com.instagram.android")
    f = open('./file', 'wb')
    f.write(content)
    f.close()

  [1]: https://apps.evozi.com/apk-downloader/

【问题讨论】:

    标签: python selenium iframe


    【解决方案1】:

    一种解决方案是 url-parsing funktion,在 driver.get(url) 之前调用每个 url

    def url_parser(url):
        if 'httpss' in url:
            url = url.replace('httpss','https')
        return url
    

    然后你会像这样使用它

    url = url_parser(url)
    driver.get(url)
    

    【讨论】:

    • 驱动程序本身试图获取错误的 URL,而不是我。我使用驱动程序获得了正确的 URL。在这个正确 URL 的响应中,有一些链接(例如图像)和 _iframe_s,驱动程序会尝试下载它们并繁荣!
    • 你能粘贴你的爬虫代码吗?然后我可以告诉你在哪里使用 url 解析器功能。您必须在链接循环中有某种 for 链接,将 url 发送到 webdriver...
    • 您有一个变量 - url - 您连续五次向请求提供该变量。 url的内容应该从哪里来?
    【解决方案2】:

    你快到了……

    import requests
    import time
    from selenium import webdriver
    
    def google_play_download(app_page_id):
        browser = webdriver.Chrome()
        browser.get("https://apps.evozi.com/apk-downloader/?id=" + app_page_id)
        browser.find_element_by_css_selector(".btn.btn-primary.btn-lg.btn-block").click()
        time.sleep(10)
    
        apk_link = browser.find_element_by_css_selector(".btn.btn-success.btn-block").get_attribute('href')
        browser.quit()
        for rnd in range(5):
            resp = requests.get(apk_link)
            if resp.headers['Content-Length'] == str(len(resp.content)):
                return resp.content
    
    
    if __name__ == "__main__":
        content = google_play_download("com.instagram.android")
        f = open('file.apk', 'wb')
        f.write(content)
        f.close()
    

    【讨论】:

    • 您理解问题了吗?问题是关于页面 iframe 内的错误协议。超时不会解决问题。谢谢。
    • 如果您运行此代码,它会下载您想要的 apk...您只需要正确的 css 选择器来获取 id(关于成功的那个)。
    • 然后你也需要睡觉。该网站本身表示准备 apk 链接最多可能需要 3 分钟,因此在下载 url 存在之前查找下载 url 不会返回任何下载 url。顺便说一句,您应该考虑更改问题的主题,因为它从来都不是 iframe 问题。我无法重现您最初发布的错误。尝试将不存在的变量 url 传递给请求时,代码崩溃了。
    【解决方案3】:

    解析器无法在apk_link = browser.find_element_by_css_selector(".btn.btn-success.btn-block").get_attribute('href')这一行中提取正确的url

    当您打印 url 时,它会显示 https://apps.evozi.com/apk-downloader/?id=com.instagram.android

    只需将行改为

    apk_link = browser.find_element_by_css_selector(".btn.btn-success.btn-block")
    ele=apk_link.get_attribute('href')
    
    for rnd in range(5):
          resp = requests.get(ele)
          if resp.headers['Content-Length'] == str(len(resp.content)):
                return resp.content
    

    代码可以正常运行

    【讨论】:

      猜你喜欢
      • 2021-03-31
      • 2021-11-24
      • 1970-01-01
      • 2019-04-21
      • 2020-12-17
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多