Python:避免在爬行时下载未更改页面的最佳算法
我正在写一个爬虫,它定期检查新闻网站的新文章列表。 我读过关于避免不必要的页面下载的不同方法,基本上确定了5个标题元素,这些元素有助于确定页面是否已更改: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
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
<代码>如果修改,因为不是服务器发送给您的东西,而是您发送给服务器的东西
您要做的是一个HTTPGET
,其中包含一个(如果自
头修改)标题,指示您上次检索资源的时间。如果您返回的是状态代码304
,而不是通常的200
,则自那时起资源未被修改,您应该使用存储的副本(不会发送新副本)
此外,您应该保留上次检索文档时的Expires
标题,如果您存储的文档副本尚未过期,则根本不发布GET
将其翻译成Python只是一个练习,但是如果在请求中添加一个
(如果已修改,则添加)头,以存储响应中的Expires
头,应该很简单,并从响应中检查状态代码。在发出请求之前,您需要检查的唯一事项是Expires
<代码>如果修改,因为
不是服务器发送给您的东西,而是您发送给服务器的东西
您要做的是一个HTTPGET
,其中包含一个(如果自
头修改)标题,指示您上次检索资源的时间。如果您返回的是状态代码304
,而不是通常的200
,则自那时起资源未被修改,您应该使用存储的副本(不会发送新副本)
此外,您应该保留上次检索文档时的Expires
标题,如果您存储的文档副本尚未过期,则根本不发布GET
将其翻译成Python只是一个练习,但是如果请求中添加了一个(如果修改过的话)
头,存储响应中的Expires
头,并检查响应中的状态代码,应该很简单。您的回答意味着不需要关心ETag?那么内容长度呢?如果内容长度
或ETAG
发生更改,则文档已被修改,如果自
获取
请求后进行了修改,则请求将返回文档。如果没有匹配的标题,您也可以在中使用ETAG
,但对我来说两者都使用似乎是多余的,而且ETAG
是可选的,所以我选择IMS
。您的回答意味着不需要关心ETAG?那么内容长度呢?如果内容长度
或ETAG
发生更改,则文档已被修改,如果自
获取
请求后进行了修改,则请求将返回文档。如果没有匹配的标题,您也可以在中使用ETAG
,但对我来说两者都使用似乎是多余的,而且ETAG
是可选的,所以我会选择IMS
。