Следуйте новостным ссылкам с помощью scrapy - PullRequest
0 голосов
/ 14 февраля 2019

Я новичок в сканировании и сканировании, я пытаюсь извлечь некоторые новости из https://www.lacuarta.com/,, а также просто новости, которые соответствуют тегу san-valentin.

Веб-страница - это просто заголовки сизображение новости, если вы хотите прочитать его, вы должны нажать на новости, и вы попадете на страницу истории (https://www.lacuarta.com/etiqueta/san-valentin/)

Итак, я думаю, что мои шаги:

  1. Перейти на страницу, которая соответствует тегу, который я хочу, в данном случае san-valentin
  2. Извлечь URL из новостей
  3. Перейти на страницу новостей
  4. Извлечение нужных мне данных

У меня уже есть пункты 1 и 2:

import scrapy

class SpiderTags(scrapy.Spider):
    name = "SpiderTags"

    def start_requests(self):
        url = 'https://www.lacuarta.com/etiqueta/'
        tag = getattr(self, 'tag', None)
        if tag is not None:
            url = url + 'etiqueta/' + tag
        yield scrapy.Request(url, self.parse)

    def parse(self, response):
        for url in response.css("h4.normal a::attr(href)"):
            yield{
                "link:": url.get()
            }

До этого у меня есть ссылки на новости, теперь яне могу понять, как войти в эту новость для извлечения нужных мне данных, а затем вернуться на свою исходную веб-страницу, чтобы перейти на страницу № 2 и повторить все

PD: информация, которую я хочу, уже знает, как ее получить

  • Название: response.css("title::text").get()
  • История: response.css("div.col-md-11 p::text").getall()
  • Автор: response.css("div.col-sm-6 h4 a::text").getall()
  • Дата: response.css("div.col-sm-6 h4 small span::text").getall()

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019
import scrapy
from scrapy.spiders import CrawlSpider

class SpiderName(CrawlSpider):
    name = 'spidername'
    allowed_domains = ['lacuarta.com']
    start_urls = ['https://www.lacuarta.com/etiqueta/san-valentin/']

    def parse(self, response):
        for item in response.xpath('//article[@class="archive-article modulo-fila"]'):
        # maybe you need more data whithin `item`
            post_url = item.xpath('.//h4/a/@href').extract_first()
            yield response.follow(post_url, callback=self.post_parse)

        next_page = response.xpath('//li[@class="active"]/following-sibling::li/a/@href').extract_first()
        if next_page:
            yield response.follow(next_page, callback=self.parse)

    def post_parse(self, response):
        title = response.xpath('//h1/text()').extract_first()
        story = response.xpath('//div[@id="ambideXtro"]/child::*').extract()
        author = response.xpath('//div[@class="col-sm-6 m-top-10"]/h4/a/text()').extract_first()
        date = response.xpath('//span[@class="ltpicto-calendar"]').extract_first()
        yield {'title': title, 'story': story, 'author': author, 'date': date}
0 голосов
/ 14 февраля 2019

Вам нужно yield новый Request, чтобы перейти по ссылке.Например:

def parse(self, response):
    for url in response.css("h4.normal a::attr(href)"):
        # This will get the URL value, not follow it:
        # yield{
        #     "link:": url.get()
        # }
        # This will follow the URL:
        yield scrapy.Request(url.get(), self.parse_news_item)

def parse_news_item(self, response):
    # Extract things from the news item page.
    yield {
        'Title': response.css("title::text").get(),
        'Story': response.css("div.col-md-11 p::text").getall(),
        'Author': response.css("div.col-sm-6 h4 a::text").getall(),
        'Date': response.css("div.col-sm-6 h4 small span::text").getall(),
    }
...