我正在用Ruby编写一个Web抓取脚本,该脚本打开一个二手车网站,搜索汽车的品牌/型号,循环搜索结果页面,然后在每个页面上抓取数据。
我遇到的问题是,我一开始不一定知道页面的最大数量,只有当我迭代到最近的几个已知页面时,分页才会增加并显示更多页面。
我已经将cleanpages
定义为一个数组,并在首次打开该网站时用我知道的可用页面填充它。然后,我使用cleanpages.each do
遍历那些“页面”。每次进入新页面时,我都会将所有已知页面重新添加到cleanpages
中,然后运行cleanpages.uniq
删除重复项。问题似乎在于cleanpages.each do
仅迭代其原始长度多次。
我可以这样做吗,以便在each do
循环中增加迭代的次数?
答案 0 :(得分:4)
而不是使用Array#each,请尝试将数组用作队列。总体思路是:
queue = initial_pages
while queue.any?
page = queue.shift
new_pages = process(page)
queue.concat(get_unprocessed_pages(new_pages))
end
这里的想法是,您只是从队列的开头一直取走物品,直到它排空。您可以在处理过程中将新项目推入队列的末尾,它们将得到正确处理。
您将要确保从已排队或已处理的new_pages中删除页面。
您也可以只保留数组数据结构,但手动保留指向列表中当前元素的指针。这样做的好处是可以维护“可见”页面的完整列表,因此您可以在将剩余的任何内容追加到列表之前将它们从new_pages列表中删除:
index = 0
queue = initial_pages
while true do
page = queue[index]
break if page.nil?
index += 1
new_pages = get_new_pages(page) - queue
queue.concat(new_pages)
end