我正在使用Scrapy蜘蛛从网站的多个页面中抓取数据。我们的目标是通过所有的网页爬行每个开始网址,但我希望蜘蛛停止后,爬行的最大网页为每个开始网址。但是,爬行器没有按预期工作,它没有爬遍所有页面。
我尝试使用字典来实现计数管理,以跟踪为每个URL抓取的页面数量。以下是我目前的实现:
def parse(self, response):
# Get the current count from the request's
self.counts = {url: 1 for url in self.start_urls} # Initialize count for each start URL
# Check if the count has reached 100
count = self.counts[response.url]
if count > 100:
return # Stop crawling further
# Increment the count for the next page
self.counts[response.url] += 1
# Parse the items on the current page
for result in response.xpath(".//h2/a"):
yield scrapy.Request(url=result.xpath("@href").extract_first(), callback=self.parse_item)
# Generate the URL for the next page and request it
next_page_url = response.url + f"?page={count}"
yield scrapy.Request(next_page_url, callback=self.parse)
字符串
爬行器似乎启动并爬取某些页面,但在到达每个起始URL的所有页面之前停止。我不知道我错在哪里。我如何修改蜘蛛程序以确保它能为每个起始URL爬遍最多100页的所有页面?任何帮助或见解将不胜感激。
在此先谢谢您!
1条答案
按热度按时间zazmityj1#
你的方法有很多问题。
1.你正在parse方法内部初始化计数机制。这意味着每次调用parse方法时,它都在重建对象并删除以前的版本。
1.然后在下一行查询当前url的计数,因此结果要么是1,要么在request.url不在start_urls中的情况下抛出KeyError异常。
1.然后检查计数是否大于100,这将始终为False,因为如果它在上一步中幸存下来,这意味着它在
start_urls
中,因此它的计数将为1,因为您之前刚刚初始化了2条指令。1.最后,在最后,你为下一个页面生成了一个新的url,并创建了一个要用相同方法解析的请求,这意味着这个请求可能不会在
start_urls
中,这几乎可以保证它会抛出我前面提到的KeyError异常。因此,实际上你所做的就是创建一种方法,几乎可以保证你永远不会超过start_urls中任何一个url的第一页,你的计数器永远不会有机会达到3,更不用说100了。
一个更好的替代方法是在parse方法之外初始化计数器字典,并将其作为spider的类属性,而不是示例属性。但即使这样,这也不会达到你想要的目标,因为每个
start_url
请求生成的每个next_page
都有一个唯一的url,因此不会以你想要的方式贡献给计数器。一个更好的替代方案是覆盖start_requests方法,并在初始请求的cb_kwargs参数中包含一个计数器,您可以手动递增并沿着到每个下一页,直到它达到100。
举例来说:
字符串