使用 CrawlSpider

Working with CrawlSpider

我正在研究 Crawlspider,它会抓取 www.flipkart.com 并递归抓取链接中的链接 returns 该网站中所有手机的详细信息。所有品牌都有这种格式的 hrefmobiles/samsung~brand/pr?sid=tyy,4io 所以我尝试将正则表达式提供给 "Rule"。问题是我的代码没有返回任何东西。我不知道是什么问题。 我的代码是:

from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import Rule, CrawlSpider
from scrapy.selector import HtmlXPathSelector
from flipkart.items import FlipkartItem

class FlipkartSpider(CrawlSpider):

         name = "flipkart"
         allowed_domains = ["Flipkart.com"]
         start_urls = ["http://www.flipkart.com/mobiles"]
         rules = (Rule(LinkExtractor(allow ="/^([a-z]+)(\/[a-z]{7})(\/[a-z0-9~]+)(\/[a-z\?=0-9,]+)$/"), callback = 'parse_item', follow=True), )

        def parse_item(self, response):
            hxs = HtmlXPathSelector(response)
            titles = hxs.select("//div[@class='product-unit unit-4 browse-product new-design ']")
            items = []
            for titles in titles:
                item = FlipkartItem()
                item ['brand'] = titles.select("//a[@class='fk-display-block nav-section-item tpadding5 bpadding5']/@title").extract()       
                item ['model'] = titles.select("//a[@class='fk-display-block']/text()").extract()
                item ['price'] = titles.select("//span[@class='fk-font-17 fk-bold']/text()").extract()
                item ['description'] = titles.select("//li/span[@class='text']/text()").extract()  
                items.append(item)                                              
                return items

我在 pipelines.pysettings.py 中没有做任何事情。我已经初始化了items.py中的所有参数。 任何形式的帮助表示赞赏。提前致谢。

任何人都可以分享他的代码,以便我可以查看或更正我的代码吗?请。

您声明您感兴趣的所有链接都采用以下格式:

mobiles/samsung~brand/pr?sid=tyy,4io

并且在您的代码中有以下正则表达式:

/^([a-z]+)(\/[a-z]{7})(\/[a-z0-9~]+)(\/[a-z\?=0-9,]+)$/

请检查 regex101.com 您的正则表达式,您会发现它与您提供的示例不匹配。

也许以下正则表达式更符合您的需要:'sid=tyy,4io'。至少蜘蛛会抓取页面(据我测试)。

p.s.: 除了不匹配的正则表达式之外,您的代码中还有其他 problems/errors。首先要提到 for titles in titles: 循环。此错误经常出现在本网站发布的 scrapy 初学者脚本中。我想知道所有这些人从哪里得到同样容易出错的代码?那么 - 你介意分享你从哪里获得那部分代码吗?如果我们知道来源,也许我们可以更正它。

编辑(添加了一些代码):

import scrapy
from scrapy.contrib.spiders import Rule, CrawlSpider
from scrapy.contrib.linkextractors import LinkExtractor

from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import TakeFirst, MapCompose, Join
from scrapy.utils.markup import replace_escape_chars

class FlipkartItem(scrapy.Item):
    brand = scrapy.Field()
    model = scrapy.Field()
    price = scrapy.Field()
    description = scrapy.Field()

class FlipkartSpider(CrawlSpider):

    name = "flipkart"
    allowed_domains = ["www.flipkart.com"] # filtered offsite request
    start_urls = ["http://www.flipkart.com/mobiles"]
    rules = (
        Rule(
            LinkExtractor(allow ='sid=tyy,4io'),
            callback = 'parse_item',
            follow=True),
    )

    def parse_item(self, response):

        products = response.xpath('//div[contains(@class,"product-unit")]')
        for product in products:
            l = ItemLoader(FlipkartItem(), product)
            l.default_input_processor = MapCompose(lambda v: v.split(), replace_escape_chars)
            l.default_output_processor = Join()

            l.add_xpath('model', './/div[contains(@class,"pu-title")]//text()')
            l.add_xpath('price', './/div[contains(@class,"pu-price")]//text()')
            l.add_xpath('description', './/ul[contains(@class,"pu-usp")]//text()')
            yield l.load_item()