Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:避免在爬行时下载未更改页面的最佳算法_Python_Http Headers_Etag_Web Crawler_If Modified Since - Fatal编程技术网

Python:避免在爬行时下载未更改页面的最佳算法

Python:避免在爬行时下载未更改页面的最佳算法,python,http-headers,etag,web-crawler,if-modified-since,Python,Http Headers,Etag,Web Crawler,If Modified Since,我正在写一个爬虫,它定期检查新闻网站的新文章列表。 我读过关于避免不必要的页面下载的不同方法,基本上确定了5个标题元素,这些元素有助于确定页面是否已更改: HTTP状态 埃塔格 上次修改(与自请求后修改的If组合) 到期 内容长度 优秀的团队似乎实现了其中的一些方法 我正在用Python(或任何类似的语言)寻找做出这种决定的最佳代码。 请记住,头信息始终由服务器提供 这可能类似于: def shouldDonwload(url,prev_etag,prev_lastmod,prev_expire

我正在写一个爬虫,它定期检查新闻网站的新文章列表。 我读过关于避免不必要的页面下载的不同方法,基本上确定了5个标题元素,这些元素有助于确定页面是否已更改:

  • HTTP状态
  • 埃塔格
  • 上次修改(与自请求后修改的If组合)
  • 到期
  • 内容长度
  • 优秀的团队似乎实现了其中的一些方法

    我正在用Python(或任何类似的语言)寻找做出这种决定的最佳代码。 请记住,头信息始终由服务器提供

    这可能类似于:

    def shouldDonwload(url,prev_etag,prev_lastmod,prev_expires, prev_content_length):
        #retrieve the headers, do the magic here and return the decision
        return decision
    

    您需要向
    shouldldownload
    (或
    urlopen
    的结果)传递一个标题目录:

    打开URL时执行此操作:

    # my urllib2 is a little fuzzy but I believe `urlopen()` doesn't 
    #  read the whole file until `.read()` is called, and you can still 
    #  get the headers with `.headers`.  Worst case is you may have to 
    #  `read(50)` or so to get them.
    s = urllib2.urlopen(MYURL)
    try:
        if shouldDownload(s.headers):
            source = s.read()
            # do stuff with source
       else:
            continue
    # except HTTPError, etc if you need to  
    finally:
        s.close()
    

    您需要向
    shouldldownload
    (或
    urlopen
    的结果)传递一个标题目录:

    打开URL时执行此操作:

    # my urllib2 is a little fuzzy but I believe `urlopen()` doesn't 
    #  read the whole file until `.read()` is called, and you can still 
    #  get the headers with `.headers`.  Worst case is you may have to 
    #  `read(50)` or so to get them.
    s = urllib2.urlopen(MYURL)
    try:
        if shouldDownload(s.headers):
            source = s.read()
            # do stuff with source
       else:
            continue
    # except HTTPError, etc if you need to  
    finally:
        s.close()
    

    在发出请求之前,您需要检查的唯一事项是
    Expires
    <代码>如果修改,因为不是服务器发送给您的东西,而是您发送给服务器的东西

    您要做的是一个HTTP
    GET
    ,其中包含一个
    (如果自
    头修改)标题,指示您上次检索资源的时间。如果您返回的是状态代码
    304
    ,而不是通常的
    200
    ,则自那时起资源未被修改,您应该使用存储的副本(不会发送新副本)

    此外,您应该保留上次检索文档时的
    Expires
    标题,如果您存储的文档副本尚未过期,则根本不发布
    GET


    将其翻译成Python只是一个练习,但是如果在请求中添加一个
    (如果已修改,则添加
    )头,以存储响应中的
    Expires
    头,应该很简单,并从响应中检查状态代码。

    在发出请求之前,您需要检查的唯一事项是
    Expires
    <代码>如果修改,因为
    不是服务器发送给您的东西,而是您发送给服务器的东西

    您要做的是一个HTTP
    GET
    ,其中包含一个
    (如果自
    头修改)标题,指示您上次检索资源的时间。如果您返回的是状态代码
    304
    ,而不是通常的
    200
    ,则自那时起资源未被修改,您应该使用存储的副本(不会发送新副本)

    此外,您应该保留上次检索文档时的
    Expires
    标题,如果您存储的文档副本尚未过期,则根本不发布
    GET


    将其翻译成Python只是一个练习,但是如果请求中添加了一个
    (如果修改过的话)
    头,存储响应中的
    Expires
    头,并检查响应中的状态代码,应该很简单。

    您的回答意味着不需要关心ETag?那么内容长度呢?如果
    内容长度
    ETAG
    发生更改,则文档已被修改,如果自
    获取
    请求后进行了修改,则
    请求将返回文档。如果没有匹配的
    标题,您也可以在
    中使用
    ETAG
    ,但对我来说两者都使用似乎是多余的,而且
    ETAG
    是可选的,所以我选择
    IMS
    。您的回答意味着不需要关心ETAG?那么内容长度呢?如果
    内容长度
    ETAG
    发生更改,则文档已被修改,如果自
    获取
    请求后进行了修改,则
    请求将返回文档。如果没有匹配的
    标题,您也可以在
    中使用
    ETAG
    ,但对我来说两者都使用似乎是多余的,而且
    ETAG
    是可选的,所以我会选择
    IMS