Scrapy SitemapSpider получить дополнительную информацию из карты сайта - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь использовать SitemapSpider для анализа карты сайта.Пожалуйста, посмотрите следующий код, Как я могу получить дополнительную информацию в функции разбора из карты сайта.Например, карта сайта уже содержит news:keywords и news:stock_tickers.Как получить эти данные и передать в функцию анализа?

from scrapy.spiders import SitemapSpider
class ReutersSpider(SitemapSpider):
    name = 'reuters'
    sitemap_urls = ['https://www.reuters.com/sitemap_news_index1.xml']

    def parse(self, response):
        # How can I get data like news:stock_tickers from sitemap for this item? I only have url from the sitemap here.
        yield {
            'title': response.css("title ::text").extract_first(),
            'url': response.url
        }

Пример элемента Sitemap

<url>
<loc>
https://www.reuters.com/article/micron-tech-results/update-6-micron-sales-profit-miss-estimates-as-chip-glut-hurts-prices-idUSL3N1YN50N
</loc>
<news:news>
<news:publication>
<news:name>Reuters</news:name>
<news:language>eng</news:language>
</news:publication>
<news:publication_date>2018-12-19T03:50:10+00:00</news:publication_date>
<news:title>
UPDATE 6-Micron sales, profit miss estimates as chip glut hurts prices
</news:title>
<news:keywords>Headlines,Industrial Conglomerates</news:keywords>
<news:stock_tickers>
SEO:000660,SEO:005930,TYO:6502,NASDAQ:AAPL,NASDAQ:AMZN
</news:stock_tickers>
</news:news>
</url>

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Как отметил @stranac, Scrapy разработан (и все связанные с ним пауки) для получения информации из Интернета, и файлы Sitemap являются хорошим способом найти эти ссылки в продуктах на каждом веб-сайте, но на самом деле это не очень хорошофактически сканирует информацию непосредственно из файлов Sitemap.

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

from scrapy import Spider
from lxml import etree


class MySpider(Spider):
    name = 'sitemap_example'

    def start_requests(self):
        yield Request('https://www.reuters.com/sitemap_news_index1.xml')

    def parse(self, response):
        sitemap = etree.fromstring(response.body)
        for child in sitemap.getchildren():
            inner_children = child.getchildren()
            news_child = [x for x in inner_children if 'news' in x.tag]
            if not news_child:
                continue
            else:
                news_child = news_child[0]
                stock_child = [x for x in news_child if 'stock_tickers' in x.tag]
                keywords_child = [x for x in news_child if 'keywords' in x.tag]
                title_child = [x for x in news_child if 'title' in x.tag]
                if stock_child:
                    yield {
                        'stock_tickers': stock_child[0].text,
                        'keywords': keywords_child[0].text,
                        'title': title_child[0].text,
                    }

Пожалуйста, дайте мне знать, что вы думаете, иесли я могу помочь вам чем-нибудь еще.

0 голосов
/ 19 декабря 2018

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

Вы можете перезаписать его _parse_sitemap метод для передачи данных в сгенерированные мета-запросы.
Однако, если ваша карта сайта достаточно проста, может быть проще просто выполнить собственный синтаксический анализ карты сайта.

...