我正在使用 python 创建一个应用程序,它将显示从 DuckDuckGo 的图像搜索结果中抓取的图像。所以我需要根据搜索获取图像的链接列表。问题在于,构成 DuckDuckGo 图像搜索结果的 HTML 不包含任何图像标签,而是图像似乎存储在分区标签中。我如何在 python 的帮助下抓取那些该死的图像链接并将它们存储在我的程序的变量中?
我希望我的变量看起来像:
image_links = ["https://duckduckgo.com/?q=duckduckgo&atb=v166-4_p&iax=images&ia=images&iai=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fen%2Fthumb%2F8%2F88%2FDuckDuckGo_logo.svg%2F1200px-DuckDuckGo_logo.svg.png","https://duckduckgo.com/?q=duckduckgo&atb=v166-4_p&iax=images&ia=images&iai=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fen%2Fthumb%2F8%2F88%2FDuckDuckGo_logo.svg%2F1200px-DuckDuckGo_logo.svg.png"]
Run Code Online (Sandbox Code Playgroud)
DuckDuckGo 图像搜索结果中 HTML 结构的可视化
编辑:
当我通过执行以下操作从 URL 中抓取 HTML 时:
source = urllib.request.urlopen("https://duckduckgo.com/?q=duckduckgo&atb=v166-4_p&iax=images&ia=images").read()
Run Code Online (Sandbox Code Playgroud)
它根本不返回任何图像标签。
我正在通过这样做来检查:
source_tree = BeautifulSoup(source, 'html.parser')
links = [img.get('src') for img in source_tree.find_all('img', _class='tile--img__img')]
print(f"links: {links}")
print(f"img in source_tree: {'img' in str(source_tree)}")
print(f"source_tree: {source_tree}")
Run Code Online (Sandbox Code Playgroud)
输出:
links: []
img in source_tree: False
source_tree: <!DOCTYPE html>
<html class="no-js has-zcm" lang="en_US"><head><meta content="text/html; charset=utf-8" http-equiv="content-type"/><title>duckduckgo at DuckDuckGo</title><link href="/s1775.css" rel="stylesheet" type="text/css"/><link href="/r1775.css" rel="stylesheet" type="text/css"/><meta content="noindex,nofollow" name="robots"/><meta content="origin" …Run Code Online (Sandbox Code Playgroud) 我正在使用带有 urllib 的 Python 3.7。一切工作正常,但当它收到 http 重定向请求(307)时,它似乎没有自动重定向。
这是我得到的错误:
ERROR 2020-06-15 10:25:06,968 HTTP Error 307: Temporary Redirect
Run Code Online (Sandbox Code Playgroud)
我必须用 try- except 来处理它,并手动向新位置发送另一个请求:它工作正常,但我不喜欢它。
这些是我用来执行请求的代码片段:
req = urllib.request.Request(url)
req.add_header('Authorization', auth)
req.add_header('Content-Type','application/json; charset=utf-8')
req.data=jdati
self.logger.debug(req.headers)
self.logger.info(req.data)
resp = urllib.request.urlopen(req)
Run Code Online (Sandbox Code Playgroud)
url 是一个 https 资源,我设置了一个带有一些授权信息和内容类型的标头。req.data 是一个 JSON
从 urllib 文档中我了解到重定向是由库本身自动执行的,但它对我不起作用。它总是引发 http 307 错误并且不遵循重定向 URL。我还尝试使用指定默认重定向处理程序的开启器,但结果相同
opener = urllib.request.build_opener(urllib.request.HTTPRedirectHandler)
req = urllib.request.Request(url)
req.add_header('Authorization', auth)
req.add_header('Content-Type','application/json; charset=utf-8')
req.data=jdati
resp = opener.open(req)
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?