Scrapy: как получить список URL и перебрать их потом - PullRequest
0 голосов
/ 22 января 2019

Я новичок в python и scrapy, посмотрел несколько уроков по udemy и youtube и теперь пробую свой первый собственный пример.Я знаю, как сделать цикл, если есть следующая кнопка.Но в моем случае его нет.

Вот мой код, работающий над одним из URL, но стартовый URL необходимо изменить позже:

class Heroes1JobSpider(scrapy.Spider):
name = 'heroes1_job'

# where to extract
allowed_domains = ['icy-veins.com']
start_urls = ['https://www.icy-veins.com/heroes/alarak-build-guide']

def parse(self, response):
    #what to extract
    hero_names = response.xpath('//span[@class="page_breadcrumbs_item"]/text()').extract()
    hero_buildss = response.xpath('//h3[@class="toc_no_parsing"]/text()').extract()
    hero_buildskillss = response.xpath('//span[@class="heroes_build_talent_tier_visual"]').extract()

    for item in zip(hero_names, hero_buildss, hero_buildskillss):
        new_item = Heroes1Item()

        new_item['hero_name'] = item[0]
        new_item['hero_builds'] = item[1]
        new_item['hero_buildskills'] = item[2]


        yield new_item

Но это только одинГерой, и я хочу около 90 из них.Каждый URL зависит от имени героя.Я могу получить список URL-адресов с помощью этой команды:

    start_urls = ['https://www.icy-veins.com/heroes/assassin-hero-guides')

    ...

  response.xpath('//div[@class="nav_content_block_entry_heroes_hero"]/a/@href').extract()

Но я не знаю, как сохранить этот список для того, чтобы функция синтаксического анализа могла зацикливаться на них.

спасибо взаранее!

1 Ответ

0 голосов
/ 22 января 2019

Важно ли их анализировать в функции parse?Вы можете проанализировать свой список героев в одной функции, а затем выполнить итерацию этого списка, чтобы очистить данные о героях следующим образом:

from scrapy import Request
...

start_urls = ['https://www.icy-veins.com/heroes/assassin-hero-guides')

def parse(self, response):
    heroes_xpath = '//div[@class="nav_content_block_entry_heroes_hero"]/a/@href'
    for link in response.xpath(heroes_xpath).extract():
        yield Request(response.urljoin(link), self.parse_hero)

def parse_hero(self, response):
    # copying your method here
    hero_names = response.xpath('//span[@class="page_breadcrumbs_item"]/text()').extract()
    hero_buildss = response.xpath('//h3[@class="toc_no_parsing"]/text()').extract()
    hero_buildskillss = response.xpath('//span[@class="heroes_build_talent_tier_visual"]').extract()

    for item in zip(hero_names, hero_buildss, hero_buildskillss):
        new_item = Heroes1Item()
        new_item['hero_name'] = item[0]
        new_item['hero_builds'] = item[1]
        new_item['hero_buildskills'] = item[2]
        yield new_item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...