繁体   English   中英

使用python无头浏览器通过https查询下载文件

[英]download file over https query with python headless browser

我尝试在网站上使用 python 进行网络抓取(使用 spynner 和 BeautifulSoup)。 在某些时候,我想测试由以下 html 查询触发的 zip 文件下载:

https://mywebsite.com/download?from=2011&to=2012

如果在浏览器 (chrome) 中明确使用,这将触发具有给定名称的 zip 文件的下载。 我无法使用无头浏览器重现此行为。 我知道这不是正确的方法,而是使用类似 spynner 的方法:

from spynner import Browser
b = Browser()
b.load(webpage,wait_callback=wait_page_load, tries=3)
b.load_jquery(True)
...
output = b.load("https://website.com/download?from=2011&to=2012")
print b.html
>> ...

当然不起作用(没有zip文件下载)。 最后一个打印语句显示我最终出现在一个错误页面上,带有一个 java 异常堆栈。

有没有办法

  1. 在不使用 spynner 加载机制的情况下正确调用 html 查询?
  2. 捕获生成的 zip 文件?
  3. 用选定的名称下载它?

谢谢你的帮助。

在使用 Java 调试器对 chrome 进行一些测试后,最后一件事是在浏览器中执行此操作时出现以下警告:

Resource interpreted as Document but transferred with MIME type application/zip "https://mywebsite.com/download?from=2011&to=2012"

编辑:

发现拨打的电话是:

https://mywebsite.com/download?from=10%2F18%2F2011&to=10%2F18%2F2012

可以在浏览器中使用,应该替换为

https://mywebsite.com/download?from=10/18/2011&to=10/18/2012

不能在 python 中使用,因为 URL 编码会将%2F映射到%252F

我不确定这是否会处理您的情况,但请尝试一下:

def download_finished(reply):
    try:
        with open('filename.ext', 'wb') as downloaded_file:
            downloaded_file.write(reply.readAll())
    except Exception:
        pass

    b.manager.finished.disconnect(download_finished)

download_url = spynner.QUrl(url)
request = spynner.QNetworkRequest(download_url)

# requires: from PyQt4.QtCore import QByteArray
request.setRawHeader('Accept', QByteArray(
    'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'))

b.manager.finished.connect(download_finished)
reply = b.manager.get(request)
b.wait_requests(1)

您在使用spynner犯了一个错误。

该脚本应如下所示:

from spynner import Browser
b = Browser()
b.load(webpage,wait_callback=wait_page_load, tries=3)
b.load_jquery(True)
...
b.load("https://website.com/download?from=2011&to=2012")
# print b.html
f = open("/tmp/foo.zip", "w")
f.write(b.html)
f.close()

参见spynner 文档

下面的代码有效吗?

import urllib, os, urlparse

url = YOUR_URL

file = urllib.URLopener()
file.retrieve(url, os.path.basename(urlparse.urlparse(url).path))
print 'downloading:', url

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM