Соскрести ASIN со страницы поиска Amazon - PullRequest
5 голосов
/ 05 апреля 2019

Я пытаюсь почистить номера ASIN на Amazon. Обратите внимание, что речь идет не о деталях продукта (например: https://www.youtube.com/watch?v=qRVRIh3GZgI),, а о поиске по ключевому слову (в данном примере «триммер», попробуйте следующее: https://www.amazon.com/s?k=trimmer&ref=nb_sb_noss_2). Результатов много продуктов, я могу очистить все названия.

Что не видно, так это ASIN (уникальный номер Amazon). При просмотре HTML я видел ссылку в тексте (href), которая содержит номер ASIN. В приведенном ниже примере ASIN = B01MSHQ5IQ

<a class="a-link-normal a-text-normal" href="/Philips-Norelco-Groomer-MG3750-50/dp/B01MSHQ5IQ/ref=sr_1_3?keywords=trimmer&amp;qid=1554462204&amp;s=gateway&amp;sr=8-3">

Заканчивается на мой вопрос: Как я могу получить все названия продуктов и номера ASIN на странице? Например:

Number     Title                       ASIN
 1       Braun, Beardtrimmer          B07JH1LLYR 
 2       TNT Pro Series Waist         B00R84J2PK
 ...     ...                          ...

Пока что я использую scrapy (но также открыты для других решений Python) и могу очищать заголовки.

Пока мой код:

Первый запуск в командной строке:

scrapy startproject tutorial

Затем настройте файлы в Spider (см. Пример 1) и items.py (см. Пример 2).

Пример 1

class AmazonProductSpider(scrapy.Spider):
  name = "AmazonDeals"
  allowed_domains = ["amazon.com"]

  #Use working product URL below
  start_urls = [
     "https://www.amazon.com/s?k=trimmer&ref=nb_sb_noss_2"         

]
 ## scrapy crawl AmazonDeals -o Asin_Titles.json

  def parse(self, response):
      items = AmazonItem()


      Title = response.css('.a-text-normal').css('::text').extract()
      items['title_Products'] = Title 
      yield items

По запросу @glhr, добавив items.py код:

Пример 2

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class AmazonItem(scrapy.Item):
  # define the fields for your item here like:
  title_Products = scrapy.Field()

1 Ответ

1 голос
/ 08 апреля 2019

Вы можете получить ссылку на продукт, извлекая атрибут href из <a class="a-link-normal a-text-normal" href="...">:

Link = response.css('.a-text-normal').css('a::attr(href)').extract()

Из ссылки вы можете использовать регулярное выражение для извлечения номера ASIN из ссылки:

(?<=dp/)[A-Z0-9]{10}

Приведенное выше регулярное выражение будет соответствовать 10 символам (заглавным буквам или цифрам), перед которыми стоит dp/.См. Демонстрацию здесь: https://regex101.com/r/mLMv3k/1

Вот рабочая реализация метода parse():

def parse(self, response):
    Link = response.css('.a-text-normal').css('a::attr(href)').extract()
    Title = response.css('span.a-text-normal').css('::text').extract()

    # for each product, create an AmazonItem, populate the fields and yield the item
    for result in zip(Link,Title):
        item = AmazonItem()
        item['title_Product'] = result[1]
        item['link_Product'] = result[0]
        # extract ASIN from link
        ASIN = re.findall(r"(?<=dp/)[A-Z0-9]{10}",result[0])[0]
        item['ASIN_Product'] = ASIN
        yield item

Это требует расширения AmazonItem новыми полями:

class AmazonItem(scrapy.Item):
    # define the fields for your item here like:
    title_Product = scrapy.Field()
    link_Product = scrapy.Field()
    ASIN_Product = scrapy.Field()

Пример вывода:

{'ASIN_Product': 'B01MSHQ5IQ',
 'link_Product': '/Philips-Norelco-Groomer-MG3750-50/dp/B01MSHQ5IQ',
 'title_Product': 'Philips Norelco Multigroom Series 3000, 13 attachments, '
                  'FFP, MG3750'}
{'ASIN_Product': 'B01MSHQ5IQ',
 'link_Product': '/Philips-Norelco-Groomer-MG3750-50/dp/B01MSHQ5IQ',
 'title_Product': 'Philips Norelco Multi Groomer MG7750/49-23 piece, beard, '
                  'body, face, nose, and ear hair trimmer, shaver, and clipper'}

Демонстрация: https://repl.it/@glhr/55534679-AmazonSpider

Чтобы записать вывод в файл JSON, просто укажите параметры экспорта канала в пауке:

class AmazonProductSpider(scrapy.Spider):
    name = "AmazonDeals"
    allowed_domains = ["amazon.com"]
    start_urls = ["https://www.amazon.com/s?k=trimmer&ref=nb_sb_noss_2"]
    custom_settings = {
            'FEED_URI' : 'Asin_Titles.json',
            'FEED_FORMAT' : 'json'
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...