Scrapy爬行与下一页。适当的规则语法

时间:2016-02-10 08:46:08

标签: python scrapy

我正在尝试使用scrapy进行递归网页抓取。我想转到“https://www.doz.pl/apteka/k17_1-Przeciwbolowe”,按照下一步按钮获取此网站上的所有产品名称和价格。

我能够创建这个蜘蛛(它正常工作):

import scrapy

from DOZ2.items import prodItem
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class DmozSpider(scrapy.Spider):
    name = "DOZ2"
    allowed_domains = ["doz.pl"]
    start_urls = ["https://www.doz.pl/apteka/k17_1-Przeciwbolowe"]

    def parse(self, response):

        for sel in response.xpath('//div[@class="details"]'):
            i=prodItem()
            i['price'] = sel.xpath('div[@class="price"]/span/text()').extract()[0]
            i['name'] = sel.xpath('h3/a/text()').extract()[0]
            i['link'] = sel.xpath('h3/a/@href').extract()[0]
            yield i

        if response.xpath('//li[@class="next"]/a/@href'):
            url= response.xpath('//li[@class="next"]/a/@href').extract()[0]
            url= ''.join(['https://www.doz.pl', url])  
            request = scrapy.Request(url=url)
            yield request

但是为了使代码更专业,根据这个post,我想通过实现'规则'来实现。我在示例中更改了代码,但它不起作用。它甚至无法从主页面获取数据。

# -*- coding: iso-8859-2 -*-

import scrapy

from DOZ2.items import prodItem
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class DmozSpider(scrapy.Spider):
    name = "DOZ2b"
    allowed_domains = ["doz.pl"]
    start_urls = ["https://www.doz.pl/apteka/k17_1-Przeciwbolowe"]
    rules = (Rule(LinkExtractor(allow=(), restrict_xpaths=('//li[@class="next"]/a',)), callback="parse_page", follow= True),)

    def parse_page(self, response):

        for sel in response.xpath('//div[@class="details"]'):
            i=prodItem()
            i['price'] = sel.xpath('div[@class="price"]/span/text()').extract()[0]
            i['name'] = sel.xpath('h3/a/text()').extract()[0]
            i['link'] = sel.xpath('h3/a/@href').extract()[0]
            yield i

如果有人能表明我的错误,我的第二段代码不起作用,我将不胜感激?我做了所有必需的更改:创建规则,更改解析函数名称,调整限制路径。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

scrapy中Spiders很少,所有这些只是扩展scrapy.Spider并添加一些功能。要使用CrawlSpider,您实际上需要在创建蜘蛛类时继承它:

from scrapy.spiders import CrawlSpider
class MyCrawlSpider(CrawlSpider):
     name = 'crawlspider1'
     rules = ... # define your rules here