0

我需要抓取每个类别下的每一页。目前,我能够进入列表类别并抓取下一页后面的每一页。我想做的是,我想进入一个类别,抓取该类别中的每一页,一旦完成,我想进入下一个类别并做同样的事情。有时某些类别中嵌套了其他类别。

例如; https://www.amazon.com/best-sellers-books-Amazon/zgbs/books/ref=zg_bs_unv_b_1_173508_2(<- 这些是书籍列表)例如左侧有类别(艺术与摄影、有声有声读物……)在每个类别下,例如在艺术与摄影类别下,还有更多类别(建筑、艺术商业,...)然后在建筑下有更多类别(建筑,批评,...)在建筑(地标和纪念碑,宗教建筑,..)下,一旦你到达地标和纪念碑,那就是根节点,它有100 页的列表。所以我想做的我想去艺术和 摄影并继续在每个子类别下进行,直到我点击一个根节点并刮掉每个页面的所有列表,然后在我完成每个要回滚的兄弟节点后转到兄弟节点并进入宗教建筑完成该回滚进入下一个类别在建筑物下完成建筑物下的每个类别回滚进入批评......等等。所以几乎刮掉了亚马逊列出的每个子类别下的每一本书。

现在我有这个逻辑来完成 start_urls 中给出的类别中的每个页面。; (注意:我不能真正列出开始 url 列表中的每个类别,因为它们太多了)下面的代码可以工作并抓取在开始 url 中给出的一个类别下列出的每个页面。我需要的是如何制作它的想法,以便它自动跳转到下一个子类别并在完成复出并进入下一个子类别后执行相同的操作......等等

name = "my_crawler"
allowed_domains = ["somewebsite.com"]
start_urls = [
    "someurl.....", 
]

rules = (Rule(LinkExtractor(allow=(), restrict_xpaths=('//a[@class="pagnNext"]',)), callback="parse_page", follow= True),)


def parse_page(self, response):
    asds = Selector(response).xpath('//span[contains(@class,"price")]/text()').extract()
    for asd in asds:
        item['fsd'] = asd.xpath('@title').extract()[0]
        yield item

有人可以帮忙吗??谢谢

4

2 回答 2

1

以简单的方式,您可以提供要抓取的每个类别的 url,并将其输入 start_urls

start_url=[' http://url_category1.html,http://url_category2.html,http://url_category3.html ']

这是一种方式。

或者您可以使用每个类别中的 href 提出自己的请求,

问候

于 2017-02-02T20:55:36.033 回答
0

您可以这样做的一种方法是使用两种解析方法:一种用于提取指向关注的链接,另一种用于抓取这些页面上的内容:

from scrapy import Request

# start_urls = ...

def parse(self, response):
  # use XPath or whatever to get the links to follow
  for link in links_to_follow:
    yield Request(link, callback=self.parse_next)

def parse_next(self, response):
  # actually do the parsing

您甚至可以在一个页面上部分填充一个项目,将 a 存储Request到该项目的元数据中以跟随的页面,然后在下一页上填充该项目的其余部分,将其交给管道。

您可以在此处阅读有关此内容的更多信息。

于 2017-02-02T22:04:40.967 回答