我有用于爬网的URL列表。['http://domain1.com','http://domain1.com/page1','http://domain2.com']
代码:
prev_domain = ''
while urls:
url = urls.pop()
if base_url(url) == prev_domain: # base_url is custom function return domain of an url
urls.append(url) # is this is possible?
continue
else:
crawl(url)
基本上我不想爬同一个领域的网页不断。继续爬网一个域url,返回http响应状态码429:请求太多。用户在给定的时间内发送了太多请求(“速率限制”)。为了回避这个问题,我打算用下面的逻辑。你知道吗
循环遍历列表中的所有项,并将当前元素基url与以前处理的元素基url进行比较。你知道吗
如果基本URL不同,则处理下一步,否则不处理当前元素,只需将此元素附加到同一列表中。你知道吗
注意:如果列表中的URL属于同一域,请延迟处理每个元素,然后执行。你知道吗
请提供您的想法。你知道吗
检查以下代码段
crawl()
将仅为唯一域调用。你知道吗或者您可以使用:
通过这种方式,您可以根据域对URL进行分类,也可以使用
crawl()
作为唯一域。你知道吗您的算法几乎是正确的,但不是实现:
这就是为什么你的程序会永远循环:如果这个域和前一个域是一样的,你只需要追加,然后弹出,然后追加,然后。。。。你需要的不是一堆,而是一个循环:
让我们看一下“abcd”排列的无序列表:
第一个字母是
domain
。下面是对您的代码稍加修改的版本:修改是:
if L and
,因为如果列表域的最后一个元素是prev
,那么您将永远使用单元素列表循环:pop,与prev、insert、pop相同,…(与pop/append相同)下面是另一个选项:创建dict
domain -> list of urls
:现在,获取每个
domain
的元素并清除dict,然后循环直到dict为空:输出更加均匀。你知道吗
相关问题 更多 >
编程相关推荐