如何使用Scrapy递归抓取子页面

时间:2017-05-31 19:57:52

标签: python beautifulsoup scrapy web-crawler scrapy-spider

所以基本上我试图抓取一组带有一组类别的页面,抓取每个类别的名称,跟随与每个类别相关联的子链接到包含一组子类别的页面,抓取他们的名字,然后按照每个子类别到他们的相关页面并检索文本数据。最后我想输出一个格式有点像:

的json文件
  1. 第1类名称
    • 子类别1名称
      • 此子类别页面中的数据
    • 子类别名称
      • 此页面的数据
  2. 类别n名称
    • 子类别1名称
      • 来自子类别n页面的数据
  3. 最终我希望能够将这些数据用于ElasticSearch

    我几乎没有任何使用Scrapy的经验,这是我到目前为止所做的(只是从第一页上删除类别名称,我不知道该怎么做)...从我的研究中我相信我需要使用CrawlSpider但不确定是什么。我也被建议使用BeautifulSoup。任何帮助将不胜感激。

    class randomSpider(scrapy.Spider):
        name = "helpme"
        allowed_domains = ["example.com"]
        start_urls = ['http://example.com/categories',]
    
        def parse(self, response):
            for i in response.css('div.CategoryTreeSection'):
                yield {
                    'categories': i.css('a::text').extract_first()
                }
    

1 个答案:

答案 0 :(得分:4)

不熟悉ElasticSearch,但我会像这样构建一个刮刀:

class randomSpider(scrapy.Spider):
    name = "helpme"
    allowed_domains = ["example.com"]
    start_urls = ['http://example.com/categories',]

    def parse(self, response):
        for i in response.css('div.CategoryTreeSection'):
            subcategory = i.css('Put your selector here') # This is where you select the subcategory url
            req = scrapy.Request(subcategory, callback=self.parse_subcategory)
            req.meta['category'] = i.css('a::text').extract_first()
            yield req

    def parse_subcategory(self, response):
        yield {
            'category' : response.meta.get('category')
            'subcategory' : response.css('Put your selector here') # Select the name of the subcategory
            'subcategorydata' : response.css('Put your selector here') # Select the data of the subcategory
        }

您收集子类别URL并发送请求。此请求的响应将在parse_subcategory中打开。发送此请求时,我们会在元数据中添加类别名称。

parse_subcategory函数中,您可以从元数据中获取类别名称,并从网页中收集子类别数据。