Próbuję przeanalizować wszystkie kategorie i ich zagnieżdżone kategorie recesivelly z tego Strona internetowa, która ostatecznie prowadzi do takiego Page i wreszcie to Innermost strona, skąd chciałbym przynieść wszystkie tytuły produktów.

Skrypt może wykonać powyższe kroki. , jeśli chodzi o przybieranie wszystkich tytułów z Strony wyników przemierzając wszystkie następne strony, skrypt ma mniej treści niż ile tam jest są.

To jest to, co napisałem:

class mySpider(scrapy.Spider):
    name = "myspider"

    start_urls = ['https://www.phoenixcontact.com/online/portal/gb?1dmy&urile=wcm%3apath%3a/gben/web/main/products/subcategory_pages/Cables_P-10/e3a9792d-bafa-4e89-8e3f-8b1a45bd2682']
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}

    def parse(self,response):
        cookie = response.headers.getlist('Set-Cookie')[1].decode().split(";")[0]
        for item in response.xpath("//div[./h3[contains(.,'Category')]]/ul/li/a/@href").getall():
            item_link = response.urljoin(item.strip())
            if "/products/list_pages/" in item_link:
                yield scrapy.Request(item_link,headers=self.headers,meta={'cookiejar': cookie},callback=self.parse_all_links)
            else:
                yield scrapy.Request(item_link,headers=self.headers,meta={'cookiejar': cookie},callback=self.parse)


    def parse_all_links(self,response):
        for item in response.css("[class='pxc-sales-data-wrp'][data-product-key] h3 > a[href][onclick]::attr(href)").getall():
            target_link = response.urljoin(item.strip())
            yield scrapy.Request(target_link,headers=self.headers,meta={'cookiejar': response.meta['cookiejar']},callback=self.parse_main_content)

        next_page = response.css("a.pxc-pager-next::attr(href)").get()
        if next_page:
            base_url = response.css("base::attr(href)").get()
            next_page_link = urljoin(base_url,next_page)
            yield scrapy.Request(next_page_link,headers=self.headers,meta={'cookiejar': response.meta['cookiejar']},callback=self.parse_all_links)


    def parse_main_content(self,response):
        item = response.css("h1::text").get()
        print(item)

Jak mogę uzyskać wszystkie tytuły dostępne w tej kategorii?

The script gets different number of results every time I run it.

-2
MITHU 21 listopad 2020, 15:08

1 odpowiedź

Najlepsza odpowiedź

Twoim głównym problemem jest to, że trzeba użyć oddzielnych cookiejar dla każdego "/products/list_pages/", aby poprawnie uzyskać następną stronę. Użyłem do tego zmiennej klasy cookie (patrz mój kod) i kilkakrotnie miały ten sam wynik (4293 pozycji).

Oto mój kod (nie pobieram strony produktu (wystarczy przeczytać tytuł produktu z listy produktów):

class mySpider(scrapy.Spider):
    name = "phoenixcontact"

    start_urls = ['https://www.phoenixcontact.com/online/portal/gb?1dmy&urile=wcm%3apath%3a/gben/web/main/products/subcategory_pages/Cables_P-10/e3a9792d-bafa-4e89-8e3f-8b1a45bd2682']
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
    cookie = 1

    def parse(self,response):
        # cookie = response.headers.getlist('Set-Cookie')[1].decode().split(";")[0]
        for item in response.xpath("//div[./h3[contains(.,'Category')]]/ul/li/a/@href").getall():
            item_link = response.urljoin(item.strip())
            if "/products/list_pages/" in item_link:
                cookie = self.cookie
                self.cookie += 1
                yield scrapy.Request(item_link,headers=self.headers,meta={'cookiejar': cookie},callback=self.parse_all_links, cb_kwargs={'page_number': 1})
            else:
                yield scrapy.Request(item_link,headers=self.headers,callback=self.parse)


    def parse_all_links(self,response, page_number):
        # if page_number > 1:
        #     with open("Samples/Page.htm", "wb") as f:
        #         f.write(response.body)
        # for item in response.css("[class='pxc-sales-data-wrp'][data-product-key] h3 > a[href][onclick]::attr(href)").getall():
        for item in response.xpath('//div[@data-product-key]//h3//a'):
            target_link = response.urljoin(item.xpath('./@href').get())
            item_title = item.xpath('./text()').get()
            yield {'title': item_title}
            # yield scrapy.Request(target_link,headers=self.headers,meta={'cookiejar': response.meta['cookiejar']},callback=self.parse_main_content)

        next_page = response.css("a.pxc-pager-next::attr(href)").get()
        if next_page:
            base_url = response.css("base::attr(href)").get()
            next_page_link = response.urljoin(next_page)
            yield scrapy.Request(next_page_link,headers=self.headers,meta={'cookiejar': response.meta['cookiejar']},callback=self.parse_all_links, cb_kwargs={'page_number': page_number + 1})
1
gangabass 29 listopad 2020, 12:58