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

时间:2018-06-15 05:41:10

标签: 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", ".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

2 个答案:

答案 0 :(得分:1)

无法(最有可能)检查给定链接是否是哪种格式。 但更好的方法(主要是最好的方法)是通过对特定链接进行请求调用来检查链接的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请求,但不会发送消息正文。

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

文本/纯

text / html的

图像/ JPEG

图像/ PNG

音频/ MPEG

音频/ OGG

音频/ *

视频/ MP4

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

答案 1 :(得分:1)

Selenium 无法检测下载文件的 MIME 类型。但您可以使用 Python的 urllib.request库来访问srchref属性,然后使用python-magic python包装器来获取libmagic < / strong>检查 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 类型,您可以编写一个开关块以允许自动下载。