我正在尝试从受密码保护的网站下载 .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 error
我得到以下错误:
data=cookies
ps。在有人问之前,是的,我 100% 确定 torrent_url 是正确的,我将其打印出来并手动将其复制/粘贴到我自己的浏览器中,提示相关 .torrent 文件的下载窗口
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客户端说“无效编码,无法打开”。
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)
当我打开.torrent文件时,里面是这样的:
我还在吗做错了什么或者这与网站所有者阻止程序从他的网站下载 .torrents 或类似性质的东西有关?
<h1>Not Found</h1>
<p>Sorry pal :(</p>
<script src="/cdn-cgi/apps/head/o1wasdM-xsd3-9gm7FQY.js"></script>
am i still doing something wrong or has this something to do with the site owner preventing programs from downloading .torrents from his site or something of that nature?
requests.urlretrieve
没有 cookie 参数。
requests.urlretrieve
用于更简单的用例。 相反,你应该使用
requests.Session
来维护 cookie,例如:
import requests
cookies = {'uid': '232323', 'pass': '31321231jh12j3hj213hj213hk',
'__cfduid': 'kj123kj21kj31k23jkl21j321j3kl213kl21j3'}
torrent_url = ('https://www.somesite.com/' + torrent_url)
filename = torrent_url.split('/')[-1]
save_as = 'torrents/' + filename + '.torrent'
try:
with requests.Session() as s:
s.cookies.update(cookies)
r = s.get(torrent_url)
r.raise_for_status() # 检查 HTTP 错误
with open(save_as, 'wb') as f:
f.write(r.content)
print("下载成功:" + filename)
except requests.exceptions.RequestException as e:
print("错误:%s" % e)
此代码执行以下操作:
-
创建一个
requests.Session
对象。 -
使用
cookies
字典更新会话的 cookie。 -
使用会话的
get()
方法获取 torrent 文件。 - 检查响应是否包含错误。
- 将 torrent 文件的内容写入文件。
注意: 从网站下载受版权保护的材料在某些司法管辖区可能是非法的。 请确保你的行为符合你所在地区的法律法规。
标签:python,cookies,python-requests,urlretrieve From: 48062237