我尝试在网站上使用spynner和BeautifulSoup在python中进行网页抓取。 在某些时候,我想测试一个zip文件下载,由以下html查询触发:
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文件下载)。最后一个print语句显示我最终在一个错误页面上,带有一个java异常堆栈。
有没有办法
感谢您的帮助。
使用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中使用,因为网址编码会将%2F
映射到%252F
答案 0 :(得分:2)
我不确定这是否会处理你的情况,但试一试:
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)
答案 1 :(得分:0)
你使用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 doc
答案 2 :(得分:0)
以下代码是否有效?
import urllib, os, urlparse
url = YOUR_URL
file = urllib.URLopener()
file.retrieve(url, os.path.basename(urlparse.urlparse(url).path))
print 'downloading:', url