Отказ от электронной коммерции с использованием скрапа - PullRequest
1 голос
/ 22 марта 2020

Я использую scrapy , чтобы отменить сайт Amazon только для обучения. Когда мы делаем покупки по категориям, мы получаем список продуктов, и когда мы нажимаем на продукт, мы получаем информацию об этом продукте. Я сделал основную c часть удаления деталей из списка продуктов, таких как название продукта, цена и их ссылки. но я хочу, чтобы эти сломанные ссылки использовались там и тогда, и страница с описанием каждого продукта должна быть удалена в самой программе.

class AmazonSpiderSpider(scrapy.Spider):
    name = 'amazon_spider'
    start_urls = [
        'https://www.amazon.co.uk/s?me=A1NZU6VUR85CVU&marketplaceID=A1F83G8C2ARO7P'
    ]

    def parse(self, response):
        items = AmazonscrapyItem()
        all_div_quotes = response.css('body')
        for quotes in all_div_quotes:
            product = quotes.css('.a-color-base.a-text-normal').css('::text').extract()
            price = quotes.css('.a-offscreen').css('::text').extract()
            brand = quotes.css('.s-image::attr(src)').extract()
            asin = quotes.css(
                '.sg-col-20-of-24.s-result-item.sg-col-0-of-12.sg-col-28-of-32.sg-col-16-of-20.sg-col.sg-col-32-of-36.sg-col-12-of-16.sg-col-24-of-28::attr(data-asin)').extract()
            productlink = quotes.css('.a-link-normal.a-text-normal').css('::attr(href)').extract()

            items['product'] = product
            items['price'] = price
            items['brand'] = brand
            items['asin'] = asin
            items['productlink'] = productlink

            yield items

        next_page_link = response.css('.a-last a::attr(href)').extract_first()
        next_page_link = response.urljoin(next_page_link)

        yield scrapy.Request(url=next_page_link, callback=self.parse)

1 Ответ

0 голосов
/ 23 марта 2020

Будьте осторожны, Amazon может обнаружить сканеров, и они заблокируют вас.

class AmazonSpiderSpider(scrapy.Spider):
    name = "amazon_spider"


    def start_requests(self):
        page_links = ['https://www.amazon.co.uk/s?me=A1NZU6VUR85CVU&marketplaceID=A1F83G8C2ARO7P', ]
        pages = 2
        page_domain = "https://www.amazon.co.uk/s?i=merchant-items&me=A1NZU6VUR85CVU&page=2&marketplaceID=A1F83G8C2ARO7P&qid=1584935116&ref=sr_pg_"
        while page != 4: # 3 is the last page and it will stop making link when pages = 4
            link = page_domain + str(page)
            page_links.append(link)
            pages+=1

        #request all the pages
        for page in page_links:
            yield scrapy.Request(url=page, callback=self.parse)


    def parse(self, response):
        #scraped all product links
        domain = "https://www.amazon.co.uk"
        link_products = response.xpath('//h2/a/@href').extract()
        for link in link_products:
            product_link = domain + link
            yield scrapy.Request(url=product_link, callback=self.parse_contents)


    def parse_contents(self, response):
        #scrape needed information
        productlink = response.url
        product = response.xpath('//span[@id="productTitle"]/text()').extract()[0].strip()
        price = response.xpath('//span[@id="priceblock_ourprice"]/text()').extract()[0]

        ### I use try, cause amazon dont have a fixed value for brand
        try:
            brand = response.xpath('//a[@id="bylineInfo"]/text()').extract()[0]
        except IndexError:
            brand = response.xpath('//a[@id="brand"]/text()').extract()[0]

        items = AmazonscrapyItem()
        items['product'] = product
        items['price'] = price
        items['brand'] = brand
        # items['asin'] = asin # I dont know what are you trying to crawl here, sorry
        items['productlink'] = productlink

        yield items

...