我是从Scrapy开始的,我成功地制作了几个蜘蛛攻击同一个网站。
第一个获取整个站点中列出的产品,除了它们的价格(因为价格对未登录的用户是隐藏的),第二个登录网站。
我的问题看起来有点奇怪,当我合并两个代码时:结果不起作用!主要的问题是规则没有被处理,就像它们不被Scrapy调用一样。
因为程序必须登录到网站,所以我必须覆盖start_requests,但当我覆盖它时,规则不会被处理。我正在研究文档,但我不明白框架是如何调用方法/函数的,以及为什么不处理规则。
这是我的爬虫代码:
# -*- 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谁能告诉我为什么这些规则不能处理。
发布于 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方法。
https://stackoverflow.com/questions/62200044
复制相似问题