跟踪新闻链接,抓狂

时间:2019-02-14 18:07:44

标签: python-3.x web-scraping scrapy web-crawler scrapy-spider

我是新来的爬行者,我试图从https://www.lacuarta.com/中提取一些新闻,也只是与标签san-valentin相匹配的新闻。

该网页只是带有新闻图片的标题,如果您想阅读该新闻,则必须单击该新闻,这会将ypu带到该故事的页面(https://www.lacuarta.com/etiqueta/san-valentin/

所以,我想我要采取的步骤是:

  1. 转到与我想要的标签匹配的页面,在这种情况下为san-valentin
  2. 从新闻中提取网址
  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 :(得分:1)

您需要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(),
    }

答案 1 :(得分:1)

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}