【问题标题】:Scrapy nested page crawlingScrapy嵌套页面爬取
【发布时间】:2015-03-19 21:20:45
【问题描述】:

我正在为嵌套页面抓取而苦苦挣扎。

我只获得与第一个爬网页面项目数一样多的项目。

网站结构会是这样的。

  1. 抓取品牌 - 品牌链接
  2. 使用品牌链接去抓取模型和模型链接
  3. 使用模型链接抓取特定公告及其属性。

假设品牌 A 有 2 个模型,第一个模型有 11 个公告,第二个模型有 9 个。品牌 B 有 3 个模型,每个模型有 5 个公告。

在上面的示例中,我需要将每个公告作为单独的项目(总共 35 个)获取,但我需要将项目编号作为品牌,例如品牌 A 和第一个公告,然后是品牌 B 和第一个公告。

class SiteSpider(CrawlSpider):
log.start(logfile="log.txt", loglevel="DEBUG", logstdout=None)
name = "site"
#download_delay = 2
allowed_domains = ['site.com']
start_urls = ['http://www.site.com/search.php?c=1111']
items = {}


def parse(self, response):
    sel = Selector(response)
    #requests =[]
    brands = sel.xpath("//li[@class='class_11']")
    for brand in brands:
        item = SiteItem()
        url = brand.xpath('a/@href')[0].extract()
        item['marka'] = brand.xpath("a/text()")[0].extract()
        item['marka_link'] =  brand.xpath('a/@href')[0].extract()
        request = Request("http://www.site.com"+url,callback=self.parse_model, meta={'item':item})
        # requests.append(request)
        #
        yield request

def parse_model(self, response):
    sel = Selector(response)
    models = sel.xpath("//li[@class='class_12']")
    for model in models:

        item = SiteUtem(response.meta["item"])
        url2 = model.xpath('a/@href')[0].extract()
        item ['model'] = model.xpath("a/text()")[0].extract()
        item ['model_link'] = url2

    return item

你能帮这个菜鸟用伪代码来实现吗?我猜我在基础级别犯了一个错误。

【问题讨论】:

  • 嗨,保罗,感谢您的关注。到目前为止,我添加了我尝试实现的代码。因为我是 python 和 scrapy 的新手,所以我正在一步一步地做。在第一个解析函数中,我试图获取品牌和品牌的链接。我能够做到这一点并获得完整的品牌列表。但诀窍在于它创造的商品数量与品牌数量一样。我正在尝试实现的算法似乎存在问题。

标签: python scrapy


【解决方案1】:

在您的parse_model 中,您有一个创建项目但不产生项目的循环,请尝试将其更改为:

def parse_model(self, response):
    sel = Selector(response)
    models = sel.xpath("//li[@class='class_12']")
    for model in models:

        item = SiteUtem(response.meta["item"])
        url2 = model.xpath('a/@href')[0].extract()
        item ['model'] = model.xpath("a/text()")[0].extract()
        item ['model_link'] = url2

        yield item

【讨论】:

  • 感谢您的帮助:)
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 2020-02-05
  • 2023-03-05
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多