首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scrapy和rules

Scrapy和rules
EN

Stack Overflow用户
提问于 2020-06-05 00:51:30
回答 1查看 165关注 0票数 0

我是从Scrapy开始的,我成功地制作了几个蜘蛛攻击同一个网站。

第一个获取整个站点中列出的产品,除了它们的价格(因为价格对未登录的用户是隐藏的),第二个登录网站。

我的问题看起来有点奇怪,当我合并两个代码时:结果不起作用!主要的问题是规则没有被处理,就像它们不被Scrapy调用一样。

因为程序必须登录到网站,所以我必须覆盖start_requests,但当我覆盖它时,规则不会被处理。我正在研究文档,但我不明白框架是如何调用方法/函数的,以及为什么不处理规则。

这是我的爬虫代码:

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.exceptions import CloseSpider
from oled.items import OledItem
from scrapy.utils.response import open_in_browser


class OledMovilesSpider(CrawlSpider):
    name = 'webiste-spider'
    allowed_domains = ['website.com']

    rules = {
        # Para cada item
        # Rule(LinkExtractor(allow=(), restrict_xpaths=('//a[contains(text(), '>')]'))),
        Rule(LinkExtractor(allow=(), restrict_xpaths=('//h2[@class="product-name"]/a')), callback='parse_item',
             follow=False)
    }

    def start_requests(self):
        return [scrapy.FormRequest('https://website.com/index.php?route=account/login',
                                 formdata={'email':'website@website.com','password':'website#'},
                                 callback=self.logged_in)]

    def logged_in(self, response):
        urls = ['https://gsmoled.com/index.php?route=product/category&path=33_61']
        print('antes de return')
        return [scrapy.Request(url=url, callback=self.parse_item) for url in urls]

    def parse_item(self, response):
        print("Dentro de Parse")
        open_in_browser(response)
        ml_item = OledItem()
        # info de producto
        ml_item['nombre'] = response.xpath('normalize-space(//title/text())').extract_first()
        ml_item['descripcion'] = response.xpath('normalize-space(//*[@id="product-des"])').extract()
        ml_item['stock'] = response.xpath('normalize-space(//span[@class=available])').extract()
        #ml_item['precio'] = response.xpath('normalize-space(/html/body/main/div/div/div[1]/div[1]/section[1]/div/section[2]/ul/li[1]/span)').extract()
        #ml_item['categoria'] = response.xpath('normalize-space(/html/body/main/div/div/div[1]/div[1]/section[1]/div/section[2]/ul/li[2]/span)').extract()
        yield ml_item

谁能告诉我为什么这些规则不能处理。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-05 13:09:56

我认为您通过覆盖start_requests来绕过规则。parse-method永远不会被调用,因此规则不会被处理。如果想要在登录后处理页面https://gsmoled.com/index.php?route=product/category&path=33_61的规则,可以尝试更改logged_in方法的回调以进行如下解析:return [scrapy.Request(url=url, callback=self.parse) for url in urls]

此时应该处理规则,因为您在规则中指定了' parse_item‘作为回调,所以将为规则生成的所有urls执行parse_item方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62200044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档