【问题标题】:How to check MIME type of a file while using Selenium?使用 Selenium 时如何检查文件的 MIME 类型?
【发布时间】:2018-11-24 22:49:31
【问题描述】:

我正在使用 Python 3.5 中的 Selenium 制作网络爬虫,我遇到的问题是,在爬虫时,它会单击某种文件的链接,例如“.pdf”或“.zip”或“.exe” .它打开它们,然后出现“打开方式”对话框,我的程序就卡在那里了。

我已经尝试在链接中查找这些字符串,并且大部分时间它都有效,但我想要 100% 的结果。我该怎么办?

编辑:这是检查良好链接的代码:

def check(link):
    li = [".pdf", ".jpg", ".doc", ".docx", ".DOCX", ".xlsx", "xls", ".csv", ".ppt", ".png", ".gif", ".zip", ".tar", ".rar", ".dll", ".ics", ".crl", ".iso", ".txt", ".msi", ".vcs", ".asc", ".exe", ".bmp", ".wmv", ".jpeg"]
    for i in li:
        if i in link:
            return False
    if "linkedin.com" in link or "facebook.com" in link or "twitter.com" in link or "instagram.com" in link or "amazon.com" in link:
        return False
    if "google.com" in link or "?share" in link or "reddit.com" in link:
        return False
    return True

【问题讨论】:

  • 请详细说明您遇到的问题。如果您无法从链接中检测到类型,或许可以尝试读取响应中的 mimetype。
  • 你有任何代码试验吗?
  • 发布您的代码并更新您的语法

标签: python-3.x selenium selenium-webdriver python-requests web-crawler


【解决方案1】:

Selenium 无法检测下载文件的 MIME 类型。但是您可以使用 Python 的 urllib.request 库来访问 srchref 属性,然后使用 python-magic python 包装器用于 libmagic 来检查 MIME 类型。

例如以下示例程序,打开demo url,找到所需元素,提取src 属性,请求headers 并检测MIME 类型:

  • 代码块:

    import urllib
    from urllib.request import urlopen
    import magic
    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
    
    mime = magic.Magic(mime=True)
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.webscorer.com/resources/templatestart")
    elemHref = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "tr.rowBg-mod1 td.tmplicon>a.downloadlink>img[alt='TXT file']"))).get_attribute("src")
    request = urllib.request.Request(elemHref)
    response = urlopen(request)
    mime_type = magic.from_buffer(response.readline())
    print(mime_type)
    
  • 控制台输出:

    GIF image data, version 89a, 19 x 18
    

琐事

基于 MIME 类型,您可以编写一个开关块以允许自动下载。

【讨论】:

  • 怎么样?有什么例子吗?\
【解决方案2】:

没有办法(很可能)检查给定链接是否属于哪种格式。 但更好的方法(通常是最好的)是通过对特定链接进行请求调用来检查链接的 MIME 类型,然后检查任何链接的“类型/子类型”。

所以基本上在发出 request.get(link) 之后只需检查 MIME 类型是否等于 text/html。这也许就足够了。

但是 request.get 是一个仅获取内容类型的昂贵过程,因此使用 SESSION HEAD 请求会更好。

您可以使用 Session.head 方法创建 HEAD 请求:

response = session.head(url, timeout=self.pageOpenTimeout)
contentType = response.headers['content-type']
if (contentType == "text/html") | (contentType == "multipart/form-data"):
    print("Required Link : %s" %url)
    #DO ANYTHING HERE <<  >>

类似于 GET 请求的 HEAD 请求,只是不会发送消息体。

流行的类型/子类型

type/subtype
text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4

来源:https://web.archive.org/web/20210816145541/https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type

【讨论】:

  • 正如我在问题中提到的,我已经尝试过了,但有些链接没有这个属性。
  • 大部分网页的 URL 末尾没有“.html”。
猜你喜欢
  • 2021-08-09
  • 2011-02-13
  • 2020-05-16
  • 1970-01-01
  • 2016-12-23
  • 2020-07-11
相关资源
最近更新 更多