【问题标题】:Adding cookie data into a requests.urlretrieve将 cookie 数据添加到 requests.urlretrieve
【发布时间】:2018-06-12 05:36:57
【问题描述】:

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

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 = {'uid': '232323', 'pass': '31321231jh12j3hj213hj213hk',
               '__cfduid': 'kj123kj21kj31k23jkl21j321j3kl213kl21j3'}

# construct download URL
torrent_url = ('https://www.somesite.com/' + torrent_url)
# for testing purposes DELETE!
print('torrent link:', torrent_url)

# download torrent file into a folder
filename = torrent_url.split('/')[-1]
save_as = 'torrents/' + filename + '.torrent'

try:
    r = request.urlretrieve(torrent_url, save_as, data=cookies)
    print("Download successful for: " + filename)
except request.URLError as e:
        raise print("Error :%s" % e)

此代码可以在没有 cookie 的情况下在普通站点上运行,但我试图获取的这个 .torrent 文件位于密码/验证码站点的后面,所以我需要使用 cookie 来抓取它。

所以问题是,我在这里做错了什么?没有data=cookies 我得到http 404 errordata=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>

ps。在有人问之前,是的,我 100% 确定 torrent_url 是正确的,我已经打印并手动将其复制/粘贴到我自己的浏览器中,提示有问题的 .torrent 文件的下载窗口

编辑:

try:
   read = requests.session().get(torrent_url)
   with open(save_as, 'wb') as w:
       for chunk in read.iter_content(chunk_size=1024):
           if chunk:
               w.write(chunk)
           w.close()
           print("Download successful for: " + filename)
 except request.URLError as e:
     print("Error :%s" % e)

根据 furas 的建议做了这个,现在可以了,但是当我尝试打开 .torrent 时,torrent 客户端说“无效编码,无法打开”。

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

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

我是否仍然做错了什么,或者这与网站所有者阻止程序从他的网站下载 .torrent 或类似的事情有关?

【问题讨论】:

  • 您可以使用requestsstream=True 下载,如果您使用requests.Session(),则无需复制cookie。
  • 顺便说一句; cookie 以header 发送,但data 可以在正文中发送。
  • 顺便说一句:print() 可以使用许多参数,因此您可以使用 print("Error:", e) 。而print() 在屏幕上发送文本,但它返回None,所以最后你有raise None。也许你需要raise "Error :%s" % e
  • 我在使用主帖中编辑的代码时仍然出现 404 错误,我猜我的 session() 有问题
  • 好的,我让它工作了,我无法让它与 session() 一起工作,我只是在下载种子时重新发送 cookie,添加了新代码来回答

标签: python cookies python-requests urlretrieve


【解决方案1】:

这可行,但我认为并不理想。

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)

【讨论】:

  • 你有错误的缩进 - w.close() 不应该在 for 循环内 - 它会在第一块数据后关闭文件。此外,当您使用with 时,您不需要w.close(),因为with 会自动关闭它(即使您遇到异常)
  • 当然,我从不使用 close,总是使用,从互联网上复制那个位,我的错误 :)
  • 这在没有close() 的情况下工作吗?您可以尝试在get() 中使用stream=True。在read 中,你应该有标题"Content-Length" 和文件大小,这样你就可以检查你是否下载了所有数据。
  • 它按原样工作,虽然有点慢,明天稍微处理一下代码并尝试让它更快地工作。
猜你喜欢
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2012-12-24
  • 2014-04-23
  • 2019-02-02
相关资源
最近更新 更多