Вещь, которую я хочу сделать
Я хочу сделать 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)
Попробуйте использовать этот код:
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()
возвращает первый элемент списка.