我是使用python 3抓取网站的新手。当前,我面临一个问题,即获取网站(www.tink.de)的请求确实很慢。每个请求大约需要40秒。当我在其他站点尝试脚本时,我立即收到了请求。
关于该问题,我已经阅读了this,this,this和许多其他内容...但是我没有解决。我还尝试在不同的计算机和操作系统上运行脚本,甚至使用不同的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'}
非常感谢您的帮助!
答案 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)