我刚刚开始进入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)
答案 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()