使用CrawlSpider

时间:2015-06-12 11:35:57

标签: python scrapy

我正致力于org.junit.runner.JUnitCore抓取www.flipkart.com,在递归抓取链接中的链接后,会返回该网站中所有手机的详细信息。所有品牌都有Crawlspider这种格式:href,4io所以我试图将正则表达式赋予"规则"。问题是我的代码没有返回任何内容。我不知道是什么问题。 我的代码是:

mobiles/samsung~brand/pr?sid=tyy

我在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.py中没有做过任何事情。我已经初始化了settings.py中的所有参数。 任何形式的帮助表示赞赏。提前谢谢。

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

1 个答案:

答案 0 :(得分:1)

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

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。:除了不匹配的正则表达式之外,代码中还有其他问题/错误。首先提到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()