Scrapy不提取数据,css选择器是正确的

时间:2017-10-26 21:54:08

标签: css scrapy

这是我的第一个刮刀,我遇到了一些麻烦。首先,我创建了我的css选择器,它们在使用scrapy shell时起作用。当我运行myspider时,它只返回此

2017-10-26 14:48:49 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: digikey)
2017-10-26 14:48:49 [scrapy.utils.log] INFO: Overridden settings: {'BOT_NAME': 'digikey', 'CONCURRENT_REQUESTS': 1, 'NEW
SPIDER_MODULE': 'digikey.spiders', 'SPIDER_MODULES': ['digikey.spiders'], 'USER_AGENT': 'digikey ("Mozilla/5.0 (Windows
NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02")'}
2017-10-26 14:48:49 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
2017-10-26 14:48:50 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2017-10-26 14:48:50 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2017-10-26 14:48:50 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2017-10-26 14:48:50 [scrapy.core.engine] INFO: Spider opened
2017-10-26 14:48:50 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min
)
2017-10-26 14:48:50 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-10-26 14:48:52 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.digikey.com/products/en/capacitors/alumin
um-electrolytic-capacitors/58/page/3?stock=1> (referer: None)
2017-10-26 14:48:52 [scrapy.core.engine] INFO: Closing spider (finished)
2017-10-26 14:48:52 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 329,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 104631,
 'downloader/response_count': 1,
 'downloader/response_status_count/200': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2017, 10, 26, 21, 48, 52, 235020),
 'log_count/DEBUG': 2,
 'log_count/INFO': 7,
 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2017, 10, 26, 21, 48, 50, 249076)}
2017-10-26 14:48:52 [scrapy.core.engine] INFO: Spider closed (finished)
PS C:\Users\dalla_000\digikey>

我的蜘蛛看起来像这样

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from digikey.items import DigikeyItem
from scrapy.selector import Selector

class DigikeySpider(CrawlSpider):
    name = 'digikey'
    allowed_domains = ['digikey.com']
    start_urls = ['https://www.digikey.com/products/en/capacitors/aluminum-electrolytic-capacitors/58/page/3?stock=1']

rules = (
    # Extract links matching 'category.php' (but not matching 'subsection.php')
    # and follow links from them (since no callback means follow=True by default).
    Rule(LinkExtractor(allow=('/products/en/capacitors/aluminum-electrolytic-capacitors/58/page/3?stock=1', ), deny=('subsection\.php', ))),
)
def parse_item(self, response):
    for row in response.css('table#productTable tbody tr'):
        item = DigikeyItem()
        item['partnumber'] = row.css('.tr-mfgPartNumber [itemprop="name"]::text').extract_first()
        item['manufacturer'] =  row.css('[itemprop="manufacture"] [itemprop="name"]::text').extract_first()
        item['description'] = row.css('.tr-description::text').extract_first()
        item['quanity'] = row.css('.tr-qtyAvailable::text').extract_first()
        item['price'] = row.css('.tr-unitPrice::text').extract_first()
        item['minimumquanity'] = row.css('.tr-minQty::text').extract_first()
        yield item

        parse_start_url = parse_item

items.py看起来像:

import scrapy


class DigikeyItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    partnumber = scrapy.Field()
    manufacturer = scrapy.Field()
    description = scrapy.Field()
    quanity= scrapy.Field()
    minimumquanity = scrapy.Field()
    price = scrapy.Field()
    pass'

环境:

BOT_NAME = 'digikey'

SPIDER_MODULES = ['digikey.spiders']
NEWSPIDER_MODULE = 'digikey.spiders'


# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'digikey ("Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02")'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

我很难理解为什么没有使用工作css选择器提取数据。此外蜘蛛正在完成工作和关闭。我限制蜘蛛只抓取一个页面,当它正常工作时我将为整个网站打开它。

2 个答案:

答案 0 :(得分:0)

我认为您不需要使用CrawlSpider,因为该蜘蛛的创建目的是为了获取帖子或实际项目链接而导航不同类别的论坛或博客等网站(&# 39; s rules的用途。

您的rules正在尝试将不同的网址设为follow,然后从这些网址访问与您的rule匹配的特定网址,然后使用这些网址的响应调用此处指定的方法

但是在您的情况下,您想要访问start_urls内的特定网址,因此CrawlSpider无法正常工作。您应该只使用Spider实施来获取start_urls网址的响应。

class DigikeySpider(scrapy.Spider):
    name = 'digikey'
    allowed_domains = ['digikey.com']
    start_urls = ['https://www.digikey.com/products/en/capacitors/aluminum-electrolytic-capacitors/58/page/3?stock=1']

    def parse(self, response):
        ...

答案 1 :(得分:0)

这对我有用(不要改变缩进):

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

from scrapy.selector import Selector

class DigikeyItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    partnumber = scrapy.Field()
    manufacturer = scrapy.Field()
    description = scrapy.Field()
    quanity= scrapy.Field()
    minimumquanity = scrapy.Field()
    price = scrapy.Field()

class DigikeySpider(CrawlSpider):
    name = 'digikey'
    allowed_domains = ['digikey.com']
    start_urls = ['https://www.digikey.com/products/en/capacitors/aluminum-electrolytic-capacitors/58/page/3?stock=1']

    rules = (
        # Extract links matching 'category.php' (but not matching 'subsection.php')
        # and follow links from them (since no callback means follow=True by default).
        Rule(LinkExtractor(allow=('/products/en/capacitors/aluminum-electrolytic-capacitors/58/page/3', )),callback='parse_item'),
    )

    def parse_item(self, response):
        for row in response.css('table#productTable tbody tr'):
            item = DigikeyItem()
            item['partnumber'] = row.css('.tr-mfgPartNumber [itemprop="name"]::text').extract_first()
            item['manufacturer'] =  row.css('[itemprop="manufacture"] [itemprop="name"]::text').extract_first()
            item['description'] = row.css('.tr-description::text').extract_first()
            item['quanity'] = row.css('.tr-qtyAvailable::text').extract_first()
            item['price'] = row.css('.tr-unitPrice::text').extract_first()
            item['minimumquanity'] = row.css('.tr-minQty::text').extract_first()
            yield item

    parse_start_url = parse_item

但是,如果您要测试规则,请将start_urls更改为

 start_urls = ['https://www.digikey.com/products/en/capacitors/aluminum-electrolytic-capacitors/58']

并删除parse_start_url = parse_item