Трудности с анализом в разборе нескольких URL-адресов и хранении данных - PullRequest
0 голосов
/ 29 августа 2018

Я с помощью извлечения данных из тегов сценария нескольких URL с помощью Regex. У меня есть CSV-файл ('links.csv'), который содержит все URL-адреса, которые мне нужно очистить. Мне удалось прочитать CSV и сохранить все URL-адреса в переменной с именем 'start_urls'. Моя проблема в том, что мне нужен способ читать URL-адреса из start_urls по одному и выполнять следующую часть моего кода. Когда я выполняю свой код в терминале, и он возвращает 2 ошибки:

1. for pvi_subtype_name,pathIndicator.depth_5,model_name in zip(source): ValueError: not enough values to unpack (expected 3, got 1)
2. source = response.xpath("//script[contains(., 'COUNTRY_SHOP_STATUS')]/text()").extract()[0] IndexError: list index out of range

Вот несколько примеров URL, которые я сохранил в исходном csv ('links.csv'):

"https://www.samsung.com/uk/smartphones/galaxy-note8/"
"https://www.samsung.com/uk/smartphones/galaxy-s8/"
"https://www.samsung.com/uk/smartphones/galaxy-s9/"

Вот мой код:

import scrapy
import csv
import re

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        with open('links.csv','r') as csvf:
            for url in csvf:
                yield scrapy.Request(url.strip())

    def parse(self, response):
        source = response.xpath("//script[contains(., 'COUNTRY_SHOP_STATUS')]/text()").extract()[0]
        def get_values(parameter, script):
            return re.findall('%s = "(.*)"' % parameter, script)[0]

        with open('baza.csv', 'w') as csvfile:
            fieldnames = ['Category', 'Type', 'SK']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writeheader()
            for pvi_subtype_name,pathIndicator.depth_5,model_name in zip(source):
                writer.writerow({'Category': get_values("pvi_subtype_name", source), 'Type': get_values("pathIndicator.depth_5", source), 'SK': get_values("model_name", source)})

1 Ответ

0 голосов
/ 29 августа 2018

Сайт для S9 имеет структуру, отличную от S8, поэтому всегда будет ошибка, потому что на S9 вы не найдете COUNTRY_SHOP_STATUS.

Использование csv-writer напрямую не похоже на копирование. Вы перезаписываете свой результат много раз. Потому что вы открываете новый CSV-файл для каждого продукта. Если вы действительно хотите сделать это таким образом. Откройте файл csv в start_requests и добавьте в синтаксический анализ. Но взгляните на предметные конвейеры. Я удаляю цикл с молнией, потому что синтаксический анализ уже на самом низком уровне.

  import scrapy
  import csv
  import re

  class QuotesSpider(scrapy.Spider):
      name = "quotes"

      def start_requests(self):
          with open('so_52069753.csv','r') as csvf:
              urlreader = csv.reader(csvf, delimiter=',',quotechar='"')
              for url in urlreader:
                  if url[0]=="y":
                      yield scrapy.Request(url[1])
          with open('so_52069753_out.csv', 'w') as csvfile:
                  fieldnames = ['Category', 'Type', 'SK']
                  writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                  writer.writeheader()

      def parse(self, response):
          def get_values(parameter, script):
              return re.findall('%s = "(.*)"' % parameter, script)[0]
          source_arr = response.xpath("//script[contains(., 'COUNTRY_SHOP_STATUS')]/text()").extract()
          if source_arr:
              source = source_arr[0]
              #yield ({'Category': get_values("pvi_subtype_name", source), 'Type': get_values("pathIndicator.depth_5", source), 'SK': get_values("model_name", source)})
              with open('so_52069753_out.csv', 'a') as csvfile:
                  fieldnames = ['Category', 'Type', 'SK']
                  writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                  writer.writerow({'Category': get_values("pvi_subtype_name", source), 'Type': get_values("pathIndicator.depth_5", source), 'SK': get_values("model_name", source)})

Я также изменил входной файл csv_file (so_52069753.csv):

y,https://www.samsung.com/uk/smartphones/galaxy-note8/
y,https://www.samsung.com/uk/smartphones/galaxy-s8/
y,https://www.samsung.com/uk/smartphones/galaxy-s9/

Так что можно настроить, обрабатывается ли URL или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...