Файл json не создается с помощью Python Scrapy Spider

1

Вещь, которую я хочу сделать

Я хочу сделать json файл, используя Python Scrapy spider. В настоящее время я изучаю "Визуализация данных с помощью Python и JavaScript". В соскабливании неизвестно, почему файл json не создается.

Структура каталога

/root
nobel_winners   scrapy.cfg

/nobel_winners:
__init__.py     items.py    pipelines.py    spiders
__pycache__     middlewares.py    settings.py

/nobel_winners/spiders:
__init__.py     __pycache__     nwinners_list_spider.py

Рабочий процесс/код

Введите следующий код в nwinners_list_spider.py в /nobel_winners/spiders.

#encoding:utf-8

import scrapy

class NWinnerItem(scrapy.Item):
    country = scrapy.Field()

class NWinnerSpider(scrapy.Spider):
    name = 'nwinners_list'
    allowed_domains = ['en.wikipedia.org']
    start_urls = ["https://en.wikipedia.org/wiki/List_of_Nobel_laureates_by_country"]

    def parse(self, response):

        h2s = response.xpath('//h2')

        for h2 in h2s:
            country = h2.xpath('span[@class="mw-headline"]/text()').extract()

Введите следующий код в корневой каталог.

scrapy crawl nwinners_list -o nobel_winners.json

ошибка

Появится следующий экран, и данные не будут введены в json файл.

2018-07-25 10:01:53 [scrapy.core.engine] INFO: Spider opened
2018-07-25 10:01:53 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

Что я пробовал

1. В тексте это был немного более длинный источник, но я проверил его только для переменных "страны".

2. Я вошел в оболочку scrapy и проверил движения каждого из них с помощью оболочки на основе IPython. И было подтверждено, что значение было твердо в "стране".

h2s = response.xpath('//h2')

for h2 in h2s:
    country = h2.xpath('span[@class="mw-headline"]/text()').extract()
    print(country)
Теги:
scrapy

1 ответ

0
Лучший ответ

Попробуйте использовать этот код:

import scrapy

class NWinnerItem(scrapy.Item):
    country = scrapy.Field()

class NWinnerSpider(scrapy.Spider):
    name = 'nwinners_list'
    allowed_domains = ['en.wikipedia.org']
    start_urls = ["https://en.wikipedia.org/wiki/List_of_Nobel_laureates_by_country"]

    def parse(self, response):

        h2s = response.xpath('//h2')

        for h2 in h2s:
            yield NWinnerItem(
                country = h2.xpath('span[@class="mw-headline"]/text()').extract_first()
            )

А затем запустите scrapy crawl nwinners_list -o nobel_winners.json -t json


В функции обратного вызова вы анализируете ответ (веб-страницу) и возвращаете либо dicts с извлеченными данными, объекты Item, объекты Request, либо итерабельными из этих объектов. Смотрите документацию по скрипированию

Это причина, почему есть 0 элемент, который нужно очистить, вам нужно вернуть их!

Также обратите внимание, что .extract() возвращает список на основе вашего запроса xpath, а .extract_first() возвращает первый элемент списка.

  • 1
    Спасибо за ваш хороший комментарий. Я попробовал твой код, чтобы он работал! Я добавлю больше кода и продолжу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню