http - 用Python的requests模块下载文件出现413
大家讲道理
大家讲道理 2017-04-17 11:59:13
[Python讨论组]

Python新手,想写个脚本去批量下载链接这个站点的文件。其中一个文件的下载页面是这样的:链接。

分析这个下载页面,发现点下载按钮的时候会向http://cdn.share-byte.net/d.php 这个URL去post,传递s和k两个值,这两个值可以通过正则匹配到,已经获得。

现在是把post返回的结果写文件,发现返回结果是个错误的HTML文件提示,不像浏览器点下载直接下载二进制文件,错误文件内容如下:
https://gist.github.com/zxmLoveLife/8680558

我代码里用到了Python的第三方模块requests和pyquery.代码如下,高手帮分析下,感激不尽。

代码截图如下:

线上浏览如下:
https://gist.github.com/zxmLoveLife/8680596

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
天蓬老师
  1. data=json.dumps(params)是以json格式POST上去的,表单提交直接使用params即可。
    使用json.dumps(params)提交的数据是:
    {"s": "bfcaeee4d1dce32f0e5945b3705bd870", "k": "jfKpK8"}
    而直接提交params,提交的数据是:
    s=bfcaeee4d1dce32f0e5945b3705bd870&k=jfKpK8
  2. 如 @依云 所说,把返回的头部当作请求头部也是错的。

下面是我的代码:

import requests, re
from pyquery import PyQuery as pq

url = 'http://www.share-byte.net/jfKpK8'

session = requests.Session()
resp = session.get(url)
d = pq(resp.text)
script = d('#downloadFile').prev('script').text()
t0 = re.findall(r"t\[0\] = \"(\w*)\"", script)
t1 = re.findall(r"t\[1\] = \"(\w*)\"", script)
params = {'s': t1[0], 'k': t0[0]}
r = session.post('http://cdn.share-byte.net/d.php', data=params)
print(r.status_code)
print(r.content)

谢谢 @依云 @yiner ,dict是可以直接传给post函数的,另外,把返回的头部当作请求头部也是一个问题。Content-Type也是可以去掉的。

阿神

不要把 HTTP 响应的标头作为 HTTP 请求标头发出去…………

你那个 req 其实应该叫 res(ponse) 才对。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号