我需要帮助来抓取aspx网站

时间:2020-09-08 23:25:37

标签: python asp.net web-scraping scrapy web-crawler

我目前正在尝试从超市的不同类别中抓取产品的主要信息(名称,价格和图片网址),但由于页面似乎无法访问该类别,我感到十分困惑直接输入网址,它总是将我重定向到主页。

我要抓取的页面是:https://www.veadigital.com.ar/(这是主页) 但我想访问“ Bebidas”类别的不同子类别的页面。 子类别的网址如下:https://www.veadigital.com.ar/Comprar/Home.aspx#_atCategory=false&_atGrilla=true&_id=141446

仅id会更改,但是当我在subcategorie url中运行Spider时,会得到主页作为响应。抱歉,如果我不够清楚,将不胜感激

这是我的蜘蛛:

from scrapy.spiders import CrawlSpider
from scrapy.http import Request
from scrapy.selector import Selector
from ..items import ProductoGenericoItem


class VeaSpider(CrawlSpider):
    name = "vea"

    pos = 1
    base_url = "https://www.veadigital.com.ar/Comprar/Home.aspx#_atCategory=false&_atGrilla=true&_id={0}"
    c = 0

    cat = [
        141446, # a base de hierbas
        446126, # aguas sin gas
        446127, # aguas con gas
        446128, # aguas saborizadas
        141231, # aperitivos
        141236, # gaseosas cola
    ]

    start_urls = [
        base_url.format(cat[c])
    ]

    def parse(self, response):
        item = ProductoGenericoItem()

        product_info = response.xpath("//li[@class='grilla-producto-container full-layout']").getall()
        for p in product_info:
            sel = Selector(text=p)

            item['repetido'] = False
            item['superMercado'] = 'Vea Argentina'
            item['sucursal'] = 'NO'
            item['marca'] = ''
            item['empresa'] = ''
            item['ean'] = ''
            item['sku'] = ''
            item['idArticulo'] = ''
            item['nombre'] = sel.xpath(
                "normalize-space(/html/body/li/div[2]/div/div[2]/div/div//text())"
            ).get()
            item['descripcion'] = ''
            precio = sel.xpath(
                "normalize-space(/html/body/li/div[2]/div/div[2]/div/div[2]/text())"
            ).get()
            centavos = sel.xpath(
                "normalize-space(/html/body/li/div[2]/div/div[2]/div/div[2]/span/text())"
            ).get()
            item['precio'] = precio + ',' + centavos
            item['precioPromocional'] = ''
            item['condicion'] = ''
            item['precioPorMedida'] = sel.xpath(
                "normalize-space(/html/body/li/div[2]/div/div[2]/div/div[3]/text())"
            ).get()
            item['stock'] = ''
            item['categoria'] = 'Bebidas'
            item['subcategoria'] = response.xpath(
                "normalize-space(//div[@class='category-breadcrumbs']/a//text())"
            )
            item['segmento'] = response.xpath(
                "normalize-space(//span[@class='selected']//text())"
            )
            item['imagen'] = sel.xpath(
                "/html/body/li/div[2]/div/div/img[1]/@src"
            ).get()
            item['promocion'] = sel.xpath(
                "normalize-space(/html/body/li/div/div/p)"
            ).get()
            # if 'Oferta' in item['promocion']:
            #     item['precioPromocional'] = item['promocion'].replace('Oferta', '')
            if item['segmento'] != '':
                    item['posicionSegmento'] = self.pos
            else:
                item['posicionSubcategoria'] = self.pos

            self.pos += 1

            yield item


        if self.c < len(self.cat) - 1:
            self.c += 1
            self.pos = 1
            yield Request(
                self.base_url.format(self.cat[self.c]),
                callback=self.parse,
            )
        else:
            print('finished')

1 个答案:

答案 0 :(得分:1)

那么,您假设只使用了参数。会话和内部代码仍可以存在于后面的代码中。并且会话可以包含其调用来源的引用URL或页面。

我经常不得不重定向页面,因为虽然我可能有一些参数,但我仍然有一些会话变量设置,以及以前的代码设置要运行。因此,如果传入页面缺少这些内部会话值?然后我重定向,因为我需要运行上一页的代码设置来加载信息和所需的值。

从某种意义上说,这与桌面代码没什么不同。您可能在客户页面上,然后点击添加发票。因此,代码将运行以获取并设置诸如发票付款条件之类的东西,以及诸如此类的大量信息,然后启动实际表格以输入发票。这类代码会延续到asp.net。

然后是引用URL的简单问题。我有一个用户评论反馈页面。它是网站上允许未登录用户输入内容的少数位置之一。但是一些垃圾邮件机器人正在滥用此功能。 (并且他们不必登录即可使用反馈页面)。

因此,现在该代码的“反馈”页面(后面的代码)检查了引用URL(启动该页面的URL)。如果引荐URL不是来自我的网站,则我将重定向到主页。从用户的角度来看,您输入的URL似乎无效。因此,出于安全考虑,通常会检查引用网址,如果该页面不是由网站启动的,则我们知道并拒绝该请求。

这意味着我的许多URL仅在从网站启动时才起作用。如果您尝试直接输入URL,还是从网络抓取器输入URL?然后,引荐网址不再来自我的网站。

因此,在您实际进入相关页面之前,我将重定向至上一页,以确保所有设置代码和内容均正确无误。

我的意思是显示项目页面吗?那么用户必须先搜索,然后找到项目。然后单击该项目行将设置很多东西,然后我们跳到项目查看页面,然后显示该项目页面。

在这种情况下,我使用了很多session()变量,而不是URL中的参数。但这没关系-简单的问题是,在跳转到该项目URL之前,我需要设置很多东西。如果您直接输入项目网址,那么我会跳回到项目选择页面,因为在页面加载之前我需要所有信息设置。

通常将参数和session()混合使用。因此,在很多情况下,URL中的JUST参数将不起作用。对于真正的大型Web可伸缩网站(亚马逊,Facebook等),他们无法使用session(0),因为在使用“服务器场”时无法很好地扩展。 (每个Web服务器在内存会话中都不能使用说)。

但是,对于较小的网站?这样,开发人员就可以更加自由地使用session()来设置页面(代码中的内部值),从而可以更自由地这样做。因此,可以使用额外的“负载”和服务器要求,即URL中的参数之外必须具有可用变量。

因此,成千上万的asp.net应用程序并非仅在URL中使用参数。如果他们已经/允许登录用户,则尤其如此。因此,后面的代码将具有仅限于给定用户的值和信息。因此,URL参数和内部session()变量都是网站正常工作所必需的。

因此,网站越小,网站的可扩展农场类型的规模就越小?然后,更自由的开发人员使用内部session()值。这样一来,开发人员就可以编写更多的业务复杂代码,而无需付出更多的努力(并且不会因我可能添加的各种丑陋垃圾而使URL混乱)。

另一个问题?在许多情况下,URL中使用了参数吗?好吧,我会事先加载数据,因此只有一个登录用户的范围内的参数才起作用。如果我没有这样做,那么您可以输入一个ID或其他用户的一些参数值-很大的安全漏洞。我记得在早期,一家信用卡公司在URL中使用了您的“ ID”。如果您输入其他ID,则可以查看他人的信用卡信息!因此,这种方法使用较少,但是更重要的是,这意味着通常URL中的参数不再足够了。

通常,代码将需要或简单地检查引荐URL-这为网站增加了额外的安全性。因此,您的抓取代码将必须启动主页,然后使用URL参数跳转到该页面。由于URL代码会检查引荐URL,而且它必须来自THEIR网站,而不是您(或您的抓取器)输入的URL,因此它必须在该主页或之前的页面上单击一个按钮。因此,您不能从头开始页面,也不能从其网页之一开始。引用网址已检查。

在您的示例中,带有参数的第二页有效,并且无需点击主页即可工作。但是话又说回来,您需要一种获取正确参数的方法,而且我不认为猜测或组成必须首先猜测的参数如何可行。