标签: python-requests

限制/限制GRequests中的HTTP请求速率

我正在使用GRequests和lxml 在Python 2.7.3中编写一个小脚本,这将允许我从各个网站收集一些可收集的卡片价格并进行比较.问题是其中一个网站限制了请求数量,如果我超过它,则发回HTTP错误429.

有没有办法在GRequestes中添加限制请求的数量,这样我就不会超过我指定的每秒请求数?另外 - 如果发生HTTP 429,我怎样才能使GRequestes在一段时间后重试?

在旁注 - 他们的限制是非常低的.每15秒就有8个请求.我在浏览器中多次破坏它只是刷新页面等待价格变化.

python throttling http rate-limiting python-requests

23
推荐指数
2
解决办法
1万
查看次数

python请求的理想块大小

选择块大小有什么指导方针吗?

我尝试了不同的块大小,但它们都没有提供与浏览器或wget下载速度相当的下载速度

这是我的代码的快照

 r = requests.get(url, headers = headers,stream=True)
 total_length = int(r.headers.get('content-length'))
 if not total_length is None: # no content length header
 for chunk in r.iter_content(1024):
     f.write(chunk)
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.?

编辑:我尝试了不同速度的网络..而且我能够实现比我的家庭网络更高的速度..但是当我测试wget和浏览器时..速度仍然无法比较

谢谢

python performance python-requests

23
推荐指数
3
解决办法
2万
查看次数

pip安装请求[安全] vs pip安装请求:差异

我正在使用Ubuntu 14.04(Trusty Tahr)和Python 2.7.6版.今天,当我创建一个新的virtualenv并尝试过的时候pip install requests,我收到了错误InsecurePlatformWarning.

我在使用Requests包时按照SSL InsecurePlatform错误中的说明解决了此问题.

但我想了解这两个命令之间的实际区别是什么: pip install requests[security]和pip install requests.

  1. 为什么前者安装了三个额外的包?

  2. 当我将代码推送到生产环境时,有什么需要注意的事项吗?

  3. 他们一般都表现得一样吗?

python pip virtualenv python-2.7 python-requests

23
推荐指数
1
解决办法
2万
查看次数

如何使用python请求获取重定向url

r = requests.get('http://techtv.mit.edu/videos/1585-music-session-02/download.source') 
for i in r.history:
    print(i.url) 
Run Code Online (Sandbox Code Playgroud)

我认为它应该打印出历史记录,但事实并非如此,上面的网址指向一个视频,但我无法得到它,有人帮忙吗?谢谢

python python-requests

23
推荐指数
1
解决办法
3万
查看次数

Python请求 - 如何使用系统ca证书(debian/ubuntu)?

我已经在debian中安装了一个自签名的root ca证书/usr/share/ca-certificates/local并安装了它们sudo dpkg-reconfigure ca-certificates.在这一点上true | gnutls-cli mysite.local很高兴,并且true | openssl s_client -connect mysite.local:443很高兴,但是python2和python3请求模块坚持认为它对证书不满意.

python2:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/adapters.py", line 497, in send
    raise …
Run Code Online (Sandbox Code Playgroud)

python ssl debian debian-based python-requests

23
推荐指数
5
解决办法
4万
查看次数

Python请求从本地URL获取文件

我在我的应用程序的一个方法中使用Python的请求库.方法的主体如下所示:

def handle_remote_file(url, **kwargs):
    response = requests.get(url, ...)
    buff = StringIO.StringIO()
    buff.write(response.content)
    ...
    return True
Run Code Online (Sandbox Code Playgroud)

我想为该方法编写一些单元测试,但是,我想要做的是传递一个假的本地URL,例如:

class RemoteTest(TestCase):
    def setUp(self):
        self.url = 'file:///tmp/dummy.txt'

    def test_handle_remote_file(self):
        self.assertTrue(handle_remote_file(self.url))
Run Code Online (Sandbox Code Playgroud)

当我使用本地URL 调用requests.get时,我得到了下面的KeyError异常:

requests.get('file:///tmp/dummy.txt')

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/packages/urllib3/poolmanager.pyc in connection_from_host(self, host, port, scheme)
76 
77         # Make a fresh ConnectionPool of the desired type
78         pool_cls = pool_classes_by_scheme[scheme]
79         pool = pool_cls(host, port, **self.connection_pool_kw)
80 

KeyError: 'file'
Run Code Online (Sandbox Code Playgroud)

问题是如何将本地URL传递给requests.get?

PS:我编写了上面的例子.它可能包含许多错误.

python http python-requests

22
推荐指数
5
解决办法
3万
查看次数

Python请求编码POST数据

版本:Python 2.7.3

其他库:Python-Requests 1.2.3,jinja2(2.6)

我有一个脚本将数据提交到论坛,问题是非ascii字符显示为垃圾.例如AndréTéchiné这样的名字就像AndréTéchéé一样出现.

以下是数据的提交方式:

1)数据最初是从UTF-8编码的CSV文件加载的,如下所示:

entries = []
with codecs.open(filename, 'r', 'utf-8') as f:
    for row in unicode_csv_reader(f.readlines()[1:]):
        entries.append(dict(zip(csv_header, row)))
Run Code Online (Sandbox Code Playgroud)

unicode_csv_reader位于Python CSV文档页面的底部:http://docs.python.org/2/library/csv.html

当我在解释器中键入条目名称时,我将名称视为u'Andr\xe9 T\xe9chin\xe9'.

2)接下来我通过jinja2渲染数据:

tpl = tpl_env.get_template(u'forumpost.html')
rendered = tpl.render(entries=entries)
Run Code Online (Sandbox Code Playgroud)

当我输入在解释器中呈现的名称时,我再次看到相同的: u'Andr\xe9 T\xe9chin\xe9'

现在,如果我将渲染变量写入这样的文件名,它会正确显示:

with codecs.open('out.txt', 'a', 'utf-8') as f:
    f.write(rendered)
Run Code Online (Sandbox Code Playgroud)

但我必须把它发送到论坛:

3)在POST请求代码中我有:

params = {u'post': rendered}
headers = {u'content-type': u'application/x-www-form-urlencoded'}
session.post(posturl, data=params, headers=headers, cookies=session.cookies)
Run Code Online (Sandbox Code Playgroud)

session是一个请求会话.

并且在论坛帖子中显示了该名称.我尝试过以下方法:

  • 遗漏标题
  • 编码渲染为rendered.encode('utf-8')(相同结果)
  • rendered = urllib.quote_plus(渲染)(全部为%XY)

如果我输入rendered.encode('utf-8'),我会看到以下内容:

'Andr\xc3\xa9 T\xc3\xa9chin\xc3\xa9'
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?谢谢.

python python-2.7 python-requests

22
推荐指数
1
解决办法
6万
查看次数

python请求中的Http重定向代码3XX

我正在尝试捕获重定向URL的http状态代码3XX/302.但我无法得到它,因为它提供了200个状态代码.

这是代码:

import requests
r = requests.get('http://goo.gl/NZek5')
print r.status_code
Run Code Online (Sandbox Code Playgroud)

我想这应该发出301或302,因为它重定向到另一个页面.我曾经尝试过几次重定向网址(例如http://fb.com),但它又发布了200.应该怎样做才能正确捕获重定向代码?

python redirect http-status-codes python-requests

22
推荐指数
2
解决办法
3万
查看次数

如何在Python中编写Web代理

我正在尝试在python中编写Web代理.我们的目标是访问一个像这样的网址:http://proxyurl/http://anothersite.com/并http://anothersite.com像往常一样看到他的内容.我通过滥用请求库得到了很多,但这并不是请求框架的预期用途.我之前已经编写了扭曲的代理,但我不确定如何将其与我想要做的事情联系起来.这是我到目前为止的地方......

import os
import urlparse

import requests

import tornado.ioloop
import tornado.web
from tornado import template

ROOT = os.path.dirname(os.path.abspath(__file__))
path = lambda *a: os.path.join(ROOT, *a)

loader = template.Loader(path(ROOT, 'templates'))


class ProxyHandler(tornado.web.RequestHandler):
    def get(self, slug):
        if slug.startswith("http://") or slug.startswith("https://"):
            if self.get_argument("start", None) == "true":
                parsed = urlparse.urlparse(slug)
                self.set_cookie("scheme", value=parsed.scheme)
                self.set_cookie("netloc", value=parsed.netloc)
                self.set_cookie("urlpath", value=parsed.path)
            #external resource
            else:
                response = requests.get(slug)
                headers = response.headers
                if 'content-type' in headers:
                    self.set_header('Content-type', headers['content-type'])
                if 'length' in headers:
                    self.set_header('length', headers['length'])
                for block …
Run Code Online (Sandbox Code Playgroud)

python proxy tornado python-requests

21
推荐指数
2
解决办法
1万
查看次数

使用python请求模块在单个请求中上载多个文件

Python 请求模块提供了有关如何在单个请求中上传单个文件的良好文档:

 files = {'file': open('report.xls', 'rb')}
Run Code Online (Sandbox Code Playgroud)

我试图通过使用此代码来尝试上传多个文件来扩展该示例:

 files = {'file': [open('report.xls', 'rb'), open('report2.xls, 'rb')]}
Run Code Online (Sandbox Code Playgroud)

但它导致了这个错误:

 File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py",      line 1052, in splittype
 match = _typeprog.match(url)
 TypeError: expected string or buffer
Run Code Online (Sandbox Code Playgroud)

是否可以使用此模块在单个请求中上载文件列表,以及如何?

python-requests multiple-file-upload

21
推荐指数
4
解决办法
2万
查看次数