Создание паука-скрапа по ссылкам в заданном стартовом URL - PullRequest
0 голосов
/ 30 августа 2018

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

Цель: это моя стартовая страница . здесь вы видите список амулетов, я хочу ввести каждую из этих страниц амулетов, а внутри этих страниц очистить текст аромата и название предмета.

Сначала я создал работающий прототип, который дал один амулет, который очищал его данные, теперь я хочу расширить его, чтобы он сделал это для всех сразу, но я изо всех сил пытаюсь найти, как это сделать.

Вот код на данный момент:

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


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

    rules = (Rule(LinkExtractor(restrict_xpaths=(unique=True), callback='parse', follow=True))


    def parse(self, response):
        for link in LinkExtractor(allow=(), deny=()).extract_links(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

xpath item_name и flavor_text работает хорошо, он был извлечен с помощью функции «проверки элемента» Chrome, но в правилах или в цикле parse есть что-то, что не работает, так как это дебютный вывод:

2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}
2018-08-30 09:23:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://pathofexile.gamepedia.com/List_of_unique_accessories>
{'flavor_text': [], 'item_name': []}

Это продолжается некоторое время, а затем файл, содержащий имя и название, показывает, что:

flavor_text,item_name

,

,

,

,

,

,

И это продолжается более 300 строк.

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

Заранее спасибо за каждый ответ

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Не используйте parse в качестве имени для обратного вызова с LinkExtractor! Я исправил ваши синтаксические ошибки и добавил restrict_xpaths в ваш код:

class ArakaaliSpider(CrawlSpider):
    name = "arakaali"
    allowed_domains = ['pathofexile.gamepedia.com']
    start_urls = ['https://pathofexile.gamepedia.com/List_of_unique_accessories']

    rules = (
        Rule(
            LinkExtractor(
                restrict_xpaths='//table[contains(@class, "wikitable")]//tr/td[1]//span[@class="c-item-hoverbox__activator"]//a[1]'
            ),
            callback='parse_details',
            follow=True
        ),
    )


    def parse_details(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
0 голосов
/ 30 августа 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)

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

...