panghuahua2017 2024-03-03 22:49 采纳率: 57.1%
浏览 11
已结题

scrapy 怎么确定start_urls里的url是否已经爬取完成

好像大部分都在说,start_requests方法每发起一个url请求,就标记这个url已经访问过,但是这不符合我的需求。

可以理解成start_urls这个列表里的每个url,都是网站里的一个分类,每个分类有多个页面,每个页面有多个详情页,我需要保存这些详情页的数据。

(url(网站里的某个分类)——页面——详情页)

也就是说,只有start_urls这个列表里的某个url下的所有页面的所有详情页都爬取完成,这个url才能标记完成,我应该怎么做?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-03 22:50
    关注

    引自免费微信小程序:皆我百晓生

    当然可以,根据您的需求,在Scrapy中实现对start_urls中每个分类URL下所有页面和详情页的爬取,并确保整个分类完成后再标记为已爬取,您可以采用以下策略:

    1. 维护全局状态:首先,您需要一个全局的数据结构(例如字典或集合)来记录每个分类URL及其对应的详情页是否已经全部爬取。
    class MySpider(scrapy.Spider):
        # 初始化全局字典,存储分类URL及详情页的状态
        all_pages_completed = defaultdict(bool)
    
        def start_requests(self):
            for category_url in self.start_urls:
                yield scrapy.Request(url=category_url, callback=self.parse_category)
    
        def parse_category(self, response):
            # 获取该分类下的所有页面链接并发起请求
            category_url = response.url
            page_links = self.extract_page_links(response)
            self.all_pages_completed[category_url] = False
    
            for page_link in page_links:
                yield scrapy.Request(url=page_link, callback=self.parse_page,
                                    meta={'category_url': category_url})
    
        def parse_page(self, response):
            category_url = response.meta['category_url']
            detail_links = self.extract_detail_links(response)
    
            for detail_link in detail_links:
                yield scrapy.Request(url=detail_link, callback=self.parse_detail,
                                    meta={'category_url': category_url})
    
        def parse_detail(self, response):
            category_url = response.meta['category_url']
    
            # 这里处理详情页数据保存逻辑
            # ...
    
            # 更新详情页计数器或标志位,当这个分类的所有详情页都爬取完成后
            self.update_detail_count(category_url)
    
        def update_detail_count(self, category_url):
            # 假设这里有一个函数来判断当前分类下是否所有详情页都已爬取
            if self.are_all_details_parsed_for_category(category_url):
                self.all_pages_completed[category_url] = True
    
        def closed(self, reason):
            # 当爬虫关闭时,检查是否有未完成的分类
            for url, is_complete in self.all_pages_completed.items():
                if not is_complete:
                    print(f"Category URL {url} was not fully parsed.")
    
    1. 提取链接与回调方法extract_page_linksextract_detail_links 是您自定义的方法,用来从响应中提取出分类下的页面链接和页面内的详情页链接。

    2. 跟踪详情页完成情况update_detail_count 方法用于更新每个分类的详情页爬取完成状态。在实际应用中,您可能需要维护一个计数器或者使用集合来追踪哪些详情页已经被爬取过。

    3. 检查爬取完成are_all_details_parsed_for_category 方法应该根据实际情况编写,它负责判断某个分类下的所有详情页是否都已经成功抓取。

    请根据您的实际项目结构和需求调整上述代码逻辑,确保正确统计每个分类下所有详情页的抓取状态,并在适当的时候将分类URL标记为已完成。由于具体实现细节依赖于目标网站的结构和内容,所以这里只提供了基本框架示例。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月6日
  • 创建了问题 3月3日

悬赏问题

  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊