Как сканировать несколько ссылок в Scrapy, следуя правилу на основе xpath на данной стартовой странице? - PullRequest
0 голосов
/ 28 августа 2018

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

Стартовая страница будет эта , здесь перечислены многие уникальные предметы из игры (араку тики, sidhbreath и т. Д.), Я хочу, чтобы паук просканировал все эти предметы.

Учитывая, что в качестве стартовой страницы, как определить, по каким ссылкам следовать?

Вот xpaths для первых 3 ссылок, по которым я хочу перейти:

//*[@id="mw-content-text"]/div[3]/table/tbody/tr[1]/td[1]/span/span[1]/a[1]
//*[@id="mw-content-text"]/div[3]/table/tbody/tr[2]/td[1]/span/span[1]/a[1]
//*[@id="mw-content-text"]/div[3]/table/tbody/tr[3]/td[1]/span/span[1]/a[1]

Как вы можете видеть, в середине увеличивается число, 1, затем 2, затем 3 и так далее. Как сканировать эти страницы?

Вот фрагмент моего кода, работающего для первого элемента, Араку Тики, с начальной страницей:

import scrapy
from PoExtractor.items import PoextractorItem
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor


class RedditSpider(scrapy.Spider):
    name = "arakaali"
  #  allowed_domains = ['pathofexile.gamepedia.com']
    start_urls = ['https://pathofexile.gamepedia.com/Araku_Tiki']

    rules = (
        Rule(LinkExtractor(allow=(), restrict_xpaths=()), callback="parse",
             follow=True),
    )



    def parse(self, response):
            item = PoextractorItem()
            item["item_name"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[1]/text()[1]").extract()
            item["flavor_text"] = response.xpath("//*[@id='mw-content-text']/span/span[1]/span[2]/span[3]/text()").extract()
            yield item

Обратите внимание: я не могу заставить его перейти по всем ссылкам на стартовой странице, мой код работает только в том случае, если стартовая страница содержит запрашиваемые данные.

Заранее благодарим за каждый ответ.

1 Ответ

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

Вы можете отправлять запросы разными способами.

1.При использовании скрапа можно использовать следующий код

def parse_page1(self, response):
    return scrapy.Request("http://www.example.com/some_page.html",
                          callback=self.parse_page2)

def parse_page2(self, response):
    # this would log http://www.example.com/some_page.html
    self.logger.info("Visited %s", response.url)

parse_page1 отправит запросы на URL, и вы получите ответ в функции parse_page2.

2.Вы даже можете отправлять запросы с помощью модуля запросов Python,

import requests
resp = req.get("http://www.something.com")

print(resp.text)

Пожалуйста, прокомментируйте, если у вас есть какие-либо сомнения относительно этого, спасибо

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