Python 将cookie数据添加到requests.urlretrieve中

Python 将cookie数据添加到requests.urlretrieve中,python,cookies,python-requests,urlretrieve,Python,Cookies,Python Requests,Urlretrieve,我正在尝试从受密码保护的站点下载.torrent文件。 我已成功使用cookies访问该站点,如下所示: cookies = {'uid': '232323', 'pass': '31321231jh12j3hj213hj213hk', '__cfduid': 'kj123kj21kj31k23jkl21j321j3kl213kl21j3'} try: # read site content read = requests.get(s

我正在尝试从受密码保护的站点下载.torrent文件。 我已成功使用cookies访问该站点,如下所示:

cookies = {'uid': '232323', 'pass': '31321231jh12j3hj213hj213hk',
           '__cfduid': 'kj123kj21kj31k23jkl21j321j3kl213kl21j3'}
    try:
        # read site content
        read = requests.get(s_string, cookies=cookies).content
    except RequestException as e:
        raise print('Could not connect to somesite: %s' % e)

    soup = BeautifulSoup(read, 'html.parser')
通过上面的代码,我可以访问该站点并获取所需的数据。我用刮取的数据建立了一个指向.torrent文件的链接,然后我想下载该文件,但这正是我被卡住的地方

下面是我现在正在尝试的:(cookie数据显然不是真实的,就像上面的代码中也没有一样)

这段代码在没有cookies的情况下可以在普通站点上运行,但是我试图获取的这个.torrent文件位于一个密码/captchead站点的后面,所以我需要使用cookies来清除它

所以问题是,我做错了什么?如果没有
data=cookies
我会得到
HTTP404错误
,如果没有
data=cookies
我会得到以下错误:

File "/usr/lib/python3.6/http/client.py", line 1064, in _send_output
+ b'\r\n'
TypeError: can't concat str to bytes </error>
这是根据furas的建议做的,它现在可以工作了,但是当我尝试打开.torrent时,torrent客户端说“编码无效,无法打开”

当我打开.torrent文件时,里面是:

<h1>Not Found</h1>
<p>Sorry pal :(</p>
<script src="/cdn-cgi/apps/head/o1wasdM-xsd3-9gm7FQY.js"></script>
未找到

对不起,朋友:(


我是否仍在做错事,或者这与网站所有者阻止下载程序有关。从他的网站下载种子或类似的内容?

这很有效,但我认为并不理想

cookies = {'uid': '232323', 'pass': '31321231jh12j3hj213hj213hk',
           '__cfduid': 'kj123kj21kj31k23jkl21j321j3kl213kl21j3'}

try:
    read = requests.get(torrent_url, cookies=cookies)
    with open(save_as, 'wb') as w:
        for chunk in read.iter_content(chunk_size=512):
            if chunk:
                w.write(chunk)
            print(filename + ' downloaded successfully!!!')
except request.URLError as e:
    print("Error :%s" % e)

您可以使用
requests
stream=True
下载,如果您使用
requests.Session()
则不必复制cookies.btw;cookies作为
标题发送,但是
数据可以在正文中发送。btw:
print()
可以使用许多参数,因此您可以执行
打印(“错误:”,e)
。和
print()
在屏幕上发送文本,但它返回
None
,所以最后您得到了
raisenone
。可能您需要
raise”错误:%s“%e
我仍然收到404个错误,使用主帖子中编辑的代码,我想我对会话()做了一些错误好的,我让它工作了,我不能让它与session()一起工作,我只是在下载torrents时重新发送cookies,添加了新的代码来回答你有错误的缩进-
w.close()
不应该在
for
循环中-它在第一个数据块之后关闭文件。此外,当你与
一起使用
时,你不需要
w.close()
因为
with
会自动关闭它(即使你遇到异常),当然,我从不使用close,总是with,从互联网站复制那个位,我的错误:)没有
close()
,这能工作吗?您可以尝试在
get()
中使用
stream=True
。在
read
中,你应该有标题
和文件大小的“Content Length”
,这样你就可以检查你是否下载了所有数据。它的工作原理是,虽然有点慢,但我明天会对代码进行一点修改,并尝试让它更快地工作。
<h1>Not Found</h1>
<p>Sorry pal :(</p>
<script src="/cdn-cgi/apps/head/o1wasdM-xsd3-9gm7FQY.js"></script>
cookies = {'uid': '232323', 'pass': '31321231jh12j3hj213hj213hk',
           '__cfduid': 'kj123kj21kj31k23jkl21j321j3kl213kl21j3'}

try:
    read = requests.get(torrent_url, cookies=cookies)
    with open(save_as, 'wb') as w:
        for chunk in read.iter_content(chunk_size=512):
            if chunk:
                w.write(chunk)
            print(filename + ' downloaded successfully!!!')
except request.URLError as e:
    print("Error :%s" % e)