结合cd&&;python中的卷曲
这是我用来从网站下载pdf的。 当我不组合cd时…&&第二部分,curl启动并下载文件。 但是,每当我使用cd命令更改目录并下载文件时,它只传递curl命令。 我不想为curl提供-o参数,因为我不愿意为文件提供自定义名称。 请说明此问题的原因和解决方案 这个问题的独特之处在于它要求用bash命令实现curl。建议的线程仅与bash命令有关结合cd&&;python中的卷曲,python,curl,cd,Python,Curl,Cd,这是我用来从网站下载pdf的。 当我不组合cd时…&&第二部分,curl启动并下载文件。 但是,每当我使用cd命令更改目录并下载文件时,它只传递curl命令。 我不想为curl提供-o参数,因为我不愿意为文件提供自定义名称。 请说明此问题的原因和解决方案 这个问题的独特之处在于它要求用bash命令实现curl。建议的线程仅与bash命令有关 import subprocess import shlex url = 'https://www.w3.org/WAI/ER/tests/xhtml/t
import subprocess
import shlex
url = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'
sessionID = input('Please, enter jsessionid...\n')
sessionID = str(sessionID) # Cookies
cookies_from_function = " -H 'Cookie: rppValue=20; B_View=1; JSESSIONID=" + sessionID + "'"
tempstring = '-L -O -C - ' + url + " -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0' -H 'Accept: */*' --compressed -H 'Connection: keep-alive'" + cookies_from_function# Login To Browser, inspect element, go to network tab, reload, copy curl url for a pdf link. Extract headers with cookies and paste here.
# print(tempstring)
curl_cmd = "cd /Volumes/path/to/destination/ && curl " + tempstring# Original
subprocess.call(shlex.split(curl_cmd))
&&
是一个shell逻辑运算符,用于在前一个命令成功时运行命令。所以,您需要在shell中运行它;使用shell=True
并将其作为字符串而不是列表传递:
subprocess.call(curl_cmd, shell=True)
除非经过消毒,否则直接在shell中运行命令可能会产生灾难性的影响
作为旁注,您应该考虑使用os
和一些web客户端(例如请求
)直接在Python中进行操作
另外,如果不想使用
curl
的-o
选项,可以使用shell重定向操作符(
)将curl
的标准输出保存到某个文件:
curl -s ... >/out/file
-s
使curl
静音,这样我们就不会在STDERR上获得进度状态。正如注释中所建议的,您可以使用cwd
关键字参数将子流程
函数运行在不同的目录中。另一个简单的选项是打开一个合适的文件,并将其作为stdout
传递给子进程
调用
另外,您可能希望使用check\u call
或现代替代run
而不是非常基本的call
import subprocess
import os
url = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'
sessionID = input('Please, enter jsessionid...\n')
# No need, input aways returns a string in Python 3
# sessionID = str(sessionID) # Cookies
with open(os.path.join('/Volumes/path/to/destination', 'dummy.pdf')) as pdf:
subprocess.check_call([
'curl', '-L', '-C', '-', url,
'-H', 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:64.0) Gecko/20100101 Firefox/64.0',
'-H', 'Accept: */*', '--compressed',
'-H', 'Connection: keep-alive',
'-H', 'Cookie: rppValue=20; B_View=1; JSESSIONID={0}'.format(sessionID)],
stdout=pdf)
这也消除了shlex
,部分是因为你在评论中说你必须去掉它,部分是因为它实际上没有提供任何比手动将简单的静态命令行拆分为令牌一次更重要的价值(当然,你必须理解如何做)
如果要保留-O
选项
subprocess.check_call([
'curl', '-O', ...],
cwd='/Volumes/path/to/destination')
再看看。一般来说传递参数,对于您的问题,请特别查看cwd
关键字参数。更好的是,不必费心在中执行任何其他内容。可能是@MarcinOrlowski的副本,该链接只讨论bash。这是python+bash。谢谢,它解决了这个问题。我必须在更复杂的任务中使用它。我希望它能起作用。对于图书馆来说,我的知识是有限的。我不想有恢复功能,所以首先考虑的是卷曲。对于请求,我可能需要获取标题,然后与特定目录中同名的文件进行比较等。如果我要求不多,请分享您对过程的见解,包括请求库和一些指南链接。再次感谢。在我复杂的项目中,我不得不删除shlex部分。即使在添加shell参数之后,这也会导致问题。@lalitalaalitah请参阅。请求
就可用性而言相当简单。请快速入门,如果您在理解某些内容时有任何问题,请告诉我。祝你好运!我试图使用请求,但重定向超过了限制,甚至超过了限制。我也试过安排一次会议。@lalitalaalitah好的。您应该在问题中添加详细信息,并选择另一个作为更完整的问题。我将删除我的答案,因为现在问题似乎不同了。我将尝试检查它。但是,它不是假设我必须提供文件名吗?如果是的话,有什么办法可以不使用服务器提供的文件名呢?那么可能是前面提到的cwd
技巧。我将使用另一个版本进行更新。有关子流程和常见反模式的更多信息,请参见。(之前尝试过链接,但放置了错误的链接,抱歉。)由于某些原因,子流程。check_调用(['curl','-O',…],cwd='/Volumes/path/to/destination')会下载一些html而不是pdf,但是在check下提供cd命令不会有任何问题。