Python 3.x 如何在使用Selenium时检查文件的MIME类型?

Python 3.x 如何在使用Selenium时检查文件的MIME类型?,python-3.x,selenium,selenium-webdriver,python-requests,web-crawler,Python 3.x,Selenium,Selenium Webdriver,Python Requests,Web Crawler,我正在使用Python 3.5中的Selenium制作一个web爬虫程序,我遇到的问题是,在对它进行爬虫时,会单击一些类似于“.pdf”或“.zip”或“.exe”的文件的链接。它打开它们,然后“打开方式”对话框出现,我的程序就停在那里了 我已经尝试过在链接中查找这些字符串,大多数时候都可以,但是我想要100%的结果。我该怎么办 编辑:这是检查良好链接的代码: def check(link): li = [".pdf", ".jpg", ".doc", ".docx", ".DOCX",

我正在使用Python 3.5中的Selenium制作一个web爬虫程序,我遇到的问题是,在对它进行爬虫时,会单击一些类似于“.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
没有办法(很可能)检查给定链接是否为哪种格式。 但是更好的方法(大多数是最好的)是通过对特定链接进行请求调用来检查链接的MIME类型,然后检查任何链接的“类型/子类型”

因此,基本上在发出请求后,只需检查MIME类型是否等于text/html。那也许就足够了

但是request.get只获取内容类型是一个代价高昂的过程,因此使用会话头请求会更好

您可以使用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 <<  >>
response=session.head(url,timeout=self.pageOpenTimeout)
contentType=response.headers['content-type']
如果(contentType==“text/html”)|(contentType==“多部分/表单数据”):
打印(“所需链接:%s”%url)
#在这里做任何事>
与GET请求类似的HEAD请求,只是消息体不会被发送

大多数流行类型的“类型/子类型”为:

文本/纯文本

文本/html

图像/jpeg

图像/png

音频/mpeg

音频/ogg

音频/*

视频/mp4

来源:

仅Selenium无法检测下载文件的MIME类型。但是,您可以使用Python的库访问
src
href
属性,然后使用libmagic的Python包装来检查MIME类型

例如,以下示例程序打开,查找所需的元素,提取
src
属性,请求
标题并检测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类型,您可以编写一个开关块以允许自动下载。

正如我在问题中提到的,我已经尝试过了,但一些链接没有此属性。大多数页面的URL末尾没有“.html”。请更具体地说明您遇到的问题。如果您无法从链接中检测到类型,也许可以尝试读取响应中的mimetype。是否有任何代码试用?发布代码并更新语法?有什么例子吗\