簡體   English   中英

我需要幫助抓取 aspx 站點

[英]I need help scraping an aspx site

我目前正在嘗試從超市的不同類別中抓取產品的主要信息(名稱、價格和圖片網址),但我正在努力處理該頁面,因為我似乎無法直接訪問類別網址,它總是將我重定向到主頁。

我試圖抓取的頁面是: https : //www.veadigital.com.ar/ (這是主頁)但我想訪問“Bebidas”類別的不同子類別頁面。 子類別的url是這樣的: https : //www.veadigital.com.ar/Comprar/Home.aspx#_atCategory=false&_atGrilla=true&_id=141446

只有 id 更改,但是當我在子類別 url 中運行我的蜘蛛時,我得到主頁作為響應。 對不起,如果我不夠清楚,任何幫助都會非常感謝

這是我的蜘蛛:

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')

好吧,您假設僅使用參數。 會話和內部代碼仍然可以存在於代碼后面。 並且會話可以包含其調用的引用 URL 或頁面。

我經常不得不重新定向頁面,因為雖然我可能有一些參數,但我仍然有一些會話變量設置,以及以前的代碼設置要運行。 那么,如果傳入頁面缺少這些內部會話值? 然后我重新定向,因為我需要運行之前的頁面代碼設置來加載信息和所需的值。

在某種程度上,這與桌面代碼沒有太大不同。 您可能在客戶頁面上,然后點擊添加發票。 因此,代碼將運行以獲取和設置諸如發票付款條款之類的內容,以及無數其他內容,然后啟動實際表單以輸入發票。 而這種類型的代碼會延續到asp.net。

然后是引用 URL 的簡單問題。 我有一個用戶評論反饋頁面。 它是網站中為數不多的允許未登錄用戶輸入內容的地方之一。 但是一些垃圾郵件機器人正在濫用這一點。 (並且他們不必登錄即可使用反饋頁面)。

因此,現在反饋頁面(代碼隱藏)檢查引用 URL(啟動頁面的 URL)。 如果引用 URL 不是來自我的網站,那么我會重定向回主頁。 從用戶的角度來看,您輸入的 URL 似乎不起作用。 因此,通常出於安全原因,人們會檢查引用 URL,如果該頁面不是由網站啟動的,那么我們就會知道並拒絕該請求。

這意味着我的許多 URL 僅在通過網站啟動時才有效。 如果您嘗試直接輸入 URL 或從網絡抓取工具中輸入 URL? 然后引用 URL 不再來自我的網站。

因此,我重新定向到以前的頁面,以確保在您真正到達相關頁面之前,所有類型的設置代碼和內容都是正確的。

我的意思是,用於顯示項目頁面? 那么用戶必須搜索,然后找到項目。 然后單擊該項目行將設置相當多的東西,然后我們跳轉到項目查看頁面,然后顯示該項目頁面。

在這種情況下,我使用了相當多的 session() 變量而不是 URL 中的參數。 但這並不重要 - 簡單的問題是我需要在您跳轉到該項目 URL 之前進行很多設置。 如果您直接輸入項目 url,那么我會將您跳轉回項目選擇頁面,因為我需要在頁面加載之前設置所有信息。

通常混合使用參數和 session()。 所以 URL 中的 JUST 參數在很多情況下不起作用。 對於真正巨大的大型 Web 可擴展網站(亞馬遜、Facebook 等),那么他們無法負擔使用 session(0),因為在使用“服務器群”時不能很好地擴展。 (每個 Web 服務器不能在內存會話中使用 say)。

但是,對於較小的網站? 然后開發人員可以更自由地使用 session() 東西來設置頁面(代碼中的內部值),因此更經常地自由地這樣做。 因此,可以使用額外的“負載”和服務器要求,即在 URL 中的參數之外具有可用的變量(因此經常使用)。

因此,大量的 asp.net 應用程序不僅僅使用 URL 中的參數。 如果他們有/允許登錄用戶,情況尤其如此。 因此,后面的代碼將具有僅限於給定用戶的值和信息。 因此,網站的正確工作需要 URL 參數和內部 session() 變量。

那么網站越小,可擴展的農場類型網站的規模就越小? 然后更自由的開發人員使用內部 session() 值。 這允許開發人員編寫更多業務復雜的代碼,並且以更少的努力完成(並且不會用我可能添加的各種丑陋的垃圾來混淆 URL)。

另一個問題? 在許多情況下,在 URL 中使用參數時? 好吧,我事先加載了數據,因此只有登錄用戶范圍內的參數才能工作。 如果我沒有這樣做,那么您可以輸入屬於其他用戶的 ID 或某些參數值 - 大安全漏洞。 在早期,我記得一家信用卡公司在 URL 中使用了您的“ID”。 如果您輸入另一個ID,您可以查看其他人的信用卡信息! 所以這種方法較少使用,但更重要的是這意味着通常只有 URL 中的參數不再足夠。

代碼經常需要或只是檢查引用 URL - 這為網站增加了額外的安全性。 因此,您的抓取代碼必須啟動主頁面,然后跳轉到帶有 URL 參數的頁面。 並且它必須在該主頁或頁面之前單擊一個按鈕,因為 URL 代碼會檢查引用 URL - 它必須來自他們的網站 - 而不是您(或您的抓取工具)輸入的 URL。 所以你不能從頭開始頁面,而不是從他們的網頁之一開始。 檢查引用 URL。

在您的示例中,帶有參數的第二頁可以工作,並且無需點擊主頁即可工作。 但是話又說回來,您需要一種方法來獲得正確的參數,而我不明白猜測或彌補您首先必須猜測的參數有什么實際意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM