使用python模块请求获取请求确实很慢

时间:2019-02-10 15:53:04

标签: python web-scraping python-requests

我是使用python 3抓取网站的新手。当前,我面临一个问题,即获取网站(www.tink.de)的请求确实很慢。每个请求大约需要40秒。当我在其他站点尝试脚本时,我立即收到了请求。

关于该问题,我已经阅读了thisthisthis和许多其他内容...但是我没有解决。我还尝试在不同的计算机和操作系统上运行脚本,甚至使用不同的Internet连接。

我当前的解决方法是使用silenium(的确更快),但是我想解决request模块的问题。

有人可以帮忙吗?

这是我的示例代码:

import requests
from datetime import datetime

url = 'https://www.tink.de'

headers = {
    'user-agent': ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) '
                   'AppleWebKit/537.36 (KHTML, like Gecko) '
                   'Chrome/45.0.2454.101 Safari/537.36')
}

print('Process started! ' + str(datetime.now()))

r = requests.get(url, headers=headers) # I also tried with stream=True
print(r.content)

print('Process finished! ' + str(datetime.now()))

更新,这是我的响应标题:

{'Date': 'Sun, 10 Feb 2019 22:27:15 GMT', 'Content-Type': 'text/html; charset=UTF-8', 'Content-Length': '69400', 'Connection': 'keep-alive', 'Server': 'nginx/1.10.3 (Ubuntu)', 'X-Frame-Options': 'SAMEORIGIN', 'X-Aoestatic-Action': 'cms_index_index', 'X-Tags': 'PAGE-14-1', 'X-Aoestatic': 'cache', 'X-Aoestatic-Lifetime': '86400', 'X-Aoestatic-Debug': 'true', 'Expires': 'Mon, 30 Apr 2008 10:00:00 GMT', 'X-Url': '/', 'Cache-Control': 'public', 'X-Aoestatic-Fetch': 'Removed cookie in vcl_backend_response', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'X-Varnish': '134119436 128286748', 'Age': '33396', 'Via': '1.1 varnish-v4', 'X-Cache': 'HIT (2292)', 'Client-ip': '10.XX.XX.XX', 'Accept-Ranges': 'bytes'}

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果它在其他站点上运行很快,并且唯一的“ www.tink.de”运行缓慢,则可能是该站点运行缓慢。您总是可以尝试不带任何标头的请求,只需简单以下操作即可:

import requests

url = 'http://tink.de'
resp = requests.get(url)

print("Status: {}".format(resp.status_code))
print("Content:")
print(resp.content)

希望这会有所帮助。

答案 1 :(得分:0)

现在,我强迫python使用IPv4-Connection而不是IPv6并将以下代码添加到我的脚本中:

import socket
import ssl

try:
    from http.client import HTTPConnection
except ImportError:
    from httplib import HTTPConnection
from requests.packages.urllib3.connection import VerifiedHTTPSConnection


class MyHTTPSConnection(VerifiedHTTPSConnection):
    def connect(self):
        self.sock = socket.socket(socket.AF_INET)
        self.sock.connect((self.host, self.port))
        if self._tunnel_host:
            self._tunnel()
        self.sock = ssl.wrap_socket(self.sock, self.key_file, self.cert_file)

requests.packages.urllib3.connectionpool.HTTPSConnection = MyHTTPSConnection
requests.packages.urllib3.connectionpool.VerifiedHTTPSConnection = MyHTTPSConnection
requests.packages.urllib3.connectionpool.HTTPSConnectionPool.ConnectionCls = MyHTTPSConnection

socket.AF_INET起到了作用,并强制请求使用IPv4连接。

感谢@ user2824140:https://stackoverflow.com/a/39233701/3956043

要禁用不安全警告,请添加:

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)