Scrapy蜘蛛停止刮

gz5pxeao  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(137)

我正在使用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页的所有页面?任何帮助或见解将不胜感激。
在此先谢谢您!

zazmityj

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。
举例来说:

class MySpider(scrapy.Spider):

    name = "spidername"
    start_urls = [...]

    def start_requests(self):
        for url in self.start_urls:
             yield scrapy.Request(url, callback=self.parse, cb_kwargs={"count": 1})

    def parse(self, response, count=None):
        if count >= 100:
            return
        for result in response.xpath(".//h2/a"):
            yield scrapy.Request(url=result.xpath("@href").extract_first(), callback=self.parse_item)
         
        next_page_url = response.url + f"?page={count}"
        yield scrapy.Request(next_page_url, callback=self.parse, cb_kwargs={"count": count + 1})

字符串

相关问题