刮刮纽约时报今日最新消息

时间:2017-01-18 00:41:02

标签: python scrapy

我刚刚开始进入Scrapy,我选择了纽约时报今日的第一个测试。 https://www.nytimes.com/column/learning-word-of-the-day

我注意到他们有一个API,但对于我的确切情况,它没有什么我可以使用(我认为)。我基本上希望在该页面上查看当天的每个单词并检索单词,含义和示例段落。

这段简短的代码应该遍历每个网址,至少检索一下这个单词,但是我手上到处都是错误,我不知道为什么! 我一直在使用SelectorGadget来获取我需要的CSS代码,到目前为止这是我的代码:

import scrapy

class NewYorkSpider(scrapy.Spider):
    name = "times"
    start_urls = [ "https://www.nytimes.com/column/learning-word-of-the-day" ]

    # entry point for the spider
    def parse(self,response):
        for href in response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "headline", " " ))]'):
            url = href.extract()
            yield scrapy.Request(url, callback=self.parse_item)

    def parse_item(self, response):
        word = response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "story-subheading", " " ))]//strong').extract()[0]

谢谢你,很多!

更新了错误(现在不是错误,只是没有抓取所谓的信息):

2017-01-18 01:13:48 [scrapy] DEBUG: Filtered duplicate request: <GET https://www.nytimes.com/column/%3Ch2%20class=%22headline%22%20itemprop=%22headline%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Word%20+%20Quiz:%20spawn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/h2%3E> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
2017-01-18 01:13:48 [scrapy] DEBUG: Crawled (404) <GET https://www.nytimes.com/column/%3Ch2%20class=%22headline%22%20itemprop=%22headline%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Word%20+%20Quiz:%20spawn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/h2%3E> (referer: https://www.nytimes.com/column/learning-word-of-the-day)
2017-01-18 01:13:48 [scrapy] DEBUG: Crawled (404) <GET https://www.nytimes.com/column/%3Ch2%20class=%22headline%22%20itemprop=%22headline%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Word%20+%20Quiz:%20introvert%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/h2%3E> (referer: https://www.nytimes.com/column/learning-word-of-the-day)
2017-01-18 01:13:48 [scrapy] DEBUG: Crawled (404) <GET https://www.nytimes.com/column/%3Ch2%20class=%22headline%22%20itemprop=%22headline%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Word%20+%20Quiz:%20funereal%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C/h2%3E> (referer: https://www.nytimes.com/column/learning-word-of-the-day)

2 个答案:

答案 0 :(得分:2)

您在.css方法中使用xpath表达式,该方法适用于css选择器表达式 只需将.css替换为.xpath

response.css('//*[contains(concat( " ", @class, " " ), concat( " ", "headline", " " ))]')
# to
response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "headline", " " ))]')

关于您的第二个错误 - 提取的网址不是绝对网址,例如/some/sub/page.html。要将其转换为绝对网址,您可以使用response.urljoin()函数:

 for href in response.xpath('...'):
    url = href.extract()
    full_url = response.urljoin(url)
    yield Request(full_url)

关于你的第三个错误 - 你的xpath在这里有问题。看起来你使用了一些xpath生成器,这些东西很少生成任何有价值的东西。您在这里寻找的只是一个<a>story-link类:

urls = response.xpath('//a[@class="story-link"]/@href').extract()
for url in urls:
    yield Request(response.urljoin(full_url))

对于你的单词xpath,你可以简单地使用在以下节点下的文本:

word = response.xpath("//h4/strong/text()").extract_first()

答案 1 :(得分:1)

此代码应该有效。要从每个单词的网站获取您想要的其他信息,您只需使用带有XPath或CSS表达式的相应选择器。

有关选择器的详情,我建议使用this网站,当然还有Google

import scrapy

class NewYorkSpider(scrapy.Spider):
    name = "times"
    start_urls = ["https://www.nytimes.com/column/learning-word-of-the-day"]

    # entry point for the spider
    def parse(self,response):
        for href in response.css('a[class="story-link"]::attr(href)'):
            yield scrapy.Request(href.extract(), callback=self.parse_item)

    def parse_item(self, response):
        heading = response.css('h4[class="story-subheading story-content"] strong::text').extract_first()