Python 3.x 如何在使用Selenium时检查文件的MIME类型?
我正在使用Python 3.5中的Selenium制作一个web爬虫程序,我遇到的问题是,在对它进行爬虫时,会单击一些类似于“.pdf”或“.zip”或“.exe”的文件的链接。它打开它们,然后“打开方式”对话框出现,我的程序就停在那里了 我已经尝试过在链接中查找这些字符串,大多数时候都可以,但是我想要100%的结果。我该怎么办 编辑:这是检查良好链接的代码: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",
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。是否有任何代码试用?发布代码并更新语法?有什么例子吗\