如何刮掉每个主题下的每一页

时间:2017-02-02 16:43:03

标签: python xpath scrapy scrapely

我需要抓住每个类别下的每一页。 目前,我可以进入列表类别,并通过下一页抓取后面的每个页面。我想做的是,我想进入一个类别,刮去该类别中的每一页,一旦完成,我想继​​续下一个类别并做同样的事情。有时,某些类别中嵌套了其他类别。

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

现在我有这个逻辑来执行start_urls中给出的类别中的每个页面。 (注意:我无法真正列出起始网址列表中的每个类别,因为它们有很多类别)下面的代码可以工作并擦除在起始网址中给出的一个类别下列出的每个网页。我需要的是如何制作它的想法,以便它自动跳转到下一个子类别并完成相同的事情,一旦它完成回归并转到下一个子类......等等

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

任何人都可以帮忙吗? 感谢

2 个答案:

答案 0 :(得分:0)

以简单的方式,您可以提供您要抓取的每个类别的网址, 并在start_urls中输入

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

这是一种方式。

或者您可以使用每个类别中的href发表您自己的请求

此致

答案 1 :(得分: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

您甚至可以在一个页面上部分填充项目,将Request存储到该项目的元数据中的页面,并填写下一页上的项目的其余部分,并将其生成管道。

您可以阅读有关此here的更多信息。