我正在使用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
答案 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库来访问src
或href
属性,然后使用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 类型,您可以编写一个开关块以允许自动下载。