请求流超时不适用于给定的网站

时间:2017-09-11 15:06:59

标签: python python-3.x web-scraping python-requests

我有以下功能可以从域的主页中提取内容。但它不适用于网站http://mywatchedmovies.com

import requests

def fetch_url(url, timeout, max_content, headers):

    r = requests.get(url, stream=True, timeout=timeout, headers=headers)
    r.raise_for_status()

    if int(r.headers.get('Content-Length',0)) > max_content:
        raise ValueError('response too large')

    content = r.raw.read(max_content+1, decode_content=True)
    if len(content) > max_content:
        print(url)
        raise ValueError('Too large a response')
    return {'url':url,'content':content,'status_code':r.status_code}

timeout = 10
max_content = 5000000
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'}

fetch_url('http://mywatchedmovies.com', timeout, max_content, headers)

如果我改变函数只是获取head,那么它会触发超时,这是好的。但是我需要这个功能才能获得非常高的性能,而不是拿起头来然后拉下主页。或者我可以在没有性能下降的情况下执行此操作吗?

1 个答案:

答案 0 :(得分:0)

请回答我,我不是请求专家。

仅请求带有超时标志的头部必须更快,因为在服务器不响应或下载时间过长的情况下头部的大小非常小,而不是发出一个request.get()并卡在其中反应很长。 即使您将不得不请求后续的主页下载,先前的标题请求也已经过滤掉了有问题的服务器。

仅请求头部。

r = requests.head(url, timeout=1)