我知道有十几个与此相关的问题,但是我看到他们的蜘蛛中没有一个方法真的有......
所以我从类别页面开始抓取网站。我抓住了产品类别的链接,然后尝试利用抓取蜘蛛的规则自动迭代“下一个”'每个类别中的页面,在每一步中抓取页面中的某些信息。
问题是我只是转到每个类别的第一页,似乎忽略了我设置的规则的follow = True方面。所以这里的代码,会喜欢一些帮助:
start_urls = ["http://home.mercadolivre.com.br/mais-categorias/"]
rules = (
# I would like this to force the spider to crawl through the pages... calling the product parser each time
Rule(LxmlLinkExtractor(allow=(),
restrict_xpaths = '//*[@id="results-section"]/div[2]/ul/li[@class="pagination__next"]'), follow = True, callback = 'parse_product_links'),
)
def parse(self, response):
categories = CategoriesItem()
#categories['categoryLinks'] = []
for link in LxmlLinkExtractor(allow=('(?<=http://lista.mercadolivre.com.br/delicatessen/)(?:whisky|licor|tequila|vodka|champagnes)'), restrict_xpaths = ("//body")).extract_links(response):
categories['categoryURL'] = link.url
yield Request(link.url, meta={'categoryURL': categories['categoryURL']}, callback = self.parse_product_links)
# ideally this function would grab the product links from each page
def parse_product_links(self, response):
# I have this built out in my code, but it isnt necessary so I wanted to keep it as de-cluttered as possible
感谢您提供的任何帮助,因为我似乎并不完全理解如何将规则中使用的提取器与我想要使用的方法相提并论(这就是为什么我有&#39; parse_product_links& #39;作为两个地点的回调
答案 0 :(得分:0)
编写爬网蜘蛛规则时,请避免使用parse作为回调,因为CrawlSpider使用parse方法本身来实现其逻辑。因此,如果您覆盖解析方法,则爬网蜘蛛将不再起作用。
来自CrawlSpider文件。
如果你不熟悉scrapy是如何工作的,那么使用CrawlSpider
是不可取的。这是一种非常含蓄的捷径,可能会让人感到困惑。
在你的情况下,你覆盖parse
,这不应该发生,你只有下一页的规则。
因此,摆脱parse
方法并扩展规则以包含两个规则:查找产品的规则和查找页面的规则(对于此页面,将follow设置为True,因为您要在新页面中查找新页面)