【问题标题】:Scrapy crawls but not scrapeScrapy 爬行但不刮
【发布时间】:2016-12-22 07:53:47
【问题描述】:

问题是,如果我将产品 url 直接添加到“start_urls”,一切正常。但是当产品页面在抓取过程中出现时(所有抓取的页面都返回'200')它不会抓取...... 我正在运行蜘蛛:

scrape crawl site_products -t csv -o Site.csv

蜘蛛码:

#-*- coding: utf-8 -*-
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from site.items import SiteItem
import datetime


class SiteProducts(CrawlSpider):
    name = 'site_products'
    allowed_domains = ['www.example.com']
    start_urls = [
        #'http://www.example.com/us/sweater_cod39636734fs.html',
        #'http://www.example.com/us/sweater_cod39693703uh.html',
        #'http://www.example.com/us/pantaloni-5-tasche_cod36883777uu.html',
        #'http://www.example.com/fr/robe_cod34663996xk.html',
        #'http://www.example.com/fr/trousers_cod36898044mj.html',
        'http://www.example.com/us/women/onlinestore/suits-and-jackets',
    ]

    rules = (
        # Extract links matching 'item.php' and parse them with the spider's method parse_item
        Rule(LinkExtractor(allow=('http://www.example.com/us/', 'http://www.example.com/fr/', )), follow=True),
        Rule(LinkExtractor(allow=('.*_cod.*\.html', )), callback='parse_item'),
    )

    def parse_item(self, response):
        self.logger.info('Hi, this is an item page! %s', response.url)
        item = SiteItem()
        item['name'] = response.xpath('//h2[@class="productName"]/text()').extract()
        item['price'] = response.xpath('//span[@class="priceValue"]/text()')[0].extract()
        if response.xpath('//span[@class="currency"]/text()')[0].extract() == '$':
            item['currency'] = 'USD'
        else:
            item['currency'] = response.xpath('//span[@class="currency"]/text()')[0].extract()
        item['category'] = response.xpath('//li[@class="selected leaf"]/a/text()').extract()
        item['sku'] = response.xpath('//span[@class="MFC"]/text()').extract()
        if response.xpath('//div[@class="soldOutButton"]/text()').extract() == True or response.xpath('//span[@class="outStock"]/text()').extract() == True:
            item['avaliability'] = 'No'
        else:
            item['avaliability'] = 'Yes'
        item['time'] = datetime.datetime.now().strftime("%Y.%m.%d %H:%M")
        item['color'] = response.xpath('//*[contains(@id, "color_")]/a/text()').extract()
        item['size'] = response.xpath('//*[contains(@id, "sizew_")]/a/text()').extract()
        if '/us/' in response.url:
            item['region'] = 'US'
        elif '/fr/' in response.url:
            item['region'] = 'FR'
        item['description'] = response.xpath('//div[@class="descriptionContent"]/text()')[0].extract()
        return item

我错过了什么?

【问题讨论】:

    标签: python python-3.x csv scrapy scrapy-spider


    【解决方案1】:

    我已经测试过,该网站似乎阻止了所有非标准用户代理(通过返回 403)。所以尝试将user_agent 类参数设置为以下常见的东西:

    class SiteProducts(CrawlSpider):
        name = 'site_products'
        user_agent = 'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0'
    

    或者只是在项目中设置它settings.py:

    USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0'
    

    您可以在网络上找到更多用户代理字符串,例如official mozzila docummentation

    编辑:
    经过进一步检查,我发现您的 LinkExtractor 逻辑有问题。链接提取器以定义的规则顺序提取并且您的提取器重叠,这意味着第一个带有跟随的链接提取器也提取产品页面,这意味着您拥有的产品链接提取器将抓取之前已经是爬虫的页面并得到欺骗过滤。

    您需要重新设计您的第一个链接提取器以避免产品页面。您只需将链接提取器中的 allow 参数复制到第一个链接提取器的 deny 参数即可。

    【讨论】:

    • 已经在 settings.py 中完成了。我正在为所有页面抓取(200)。但正如我上面所说,我仍然得到 0 次擦伤。但是,如果我将产品 url 添加到“start_urls”,它将很好地抓取该产品。
    • @LeonidIvanov 我已经尝试过您的蜘蛛,它可以工作,但是您的第一个链接提取器似乎阻止了产品提取,请参阅我的编辑了解更多详细信息。
    • 非常感谢!它有帮助!几乎一整天都没有弄清楚问题是什么......顺便说一句,它是“拒绝”而不是“不允许”。
    • @LeonidIvanov 谢谢,已编辑。但是,是的,CrawlSpider 有时会变得有点棘手,因此花费几个小时进行调试并非闻所未闻。一般的经验法则是彻底检查日志。您可以使用scrapy crawl myspider &> myspider.log 保存蜘蛛日志,并使用logging 模块在您的蜘蛛中尽可能多地记录。
    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 2013-01-24
    • 2015-10-18
    • 2014-12-31
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多