我使用Scrapy构建了一个非常简单的刮板。对于输出表,我想显示Google新闻搜索词以及Google resultstats值。
我要捕获的信息显示在Google页面的源中
<input class="gsfi" value="Elon Musk">
和
<div id="resultStats">About 52,300 results</div>
我已经尝试通过('input.value::text')
和('id.resultstats::text')
都包括在内,但是都没有用。有谁知道如何解决这种情况?
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['google.com']
start_urls = ['https://www.google.com/search?q=elon+musk&source=lnt&tbs=cdr%3A1%2Ccd_min%3A1%2F1%2F2015%2Ccd_max%3A12%2F31%2F2015&tbm=nws']
def parse(self, response):
for quote in response.css('div.quote'):
item = {
'search_title': quote.css('input.value::text').extract(),
'results': quote.css('id.resultstats::text').extract(),
}
yield item
答案 0 :(得分:1)
使用Scrapy访问页面时,页面的呈现方式会有所不同。
搜索字段变为:
response.css('input#sbhost::attr(value)').get()
结果计数为:
response.css('#resultStats::text').get()
此外,该页面上没有quote
类。
您可以在scrapy shell中对此进行测试:
scrapy shell -s ROBOTSTXT_OBEY=False "https://www.google.com/search?q=elon+musk&source=lnt&tbs=cdr%3A1%2Ccd_min%3A1%2F1%2F2015%2Ccd_max%3A12%2F31%2F2015&tbm=nws"
然后运行这两个命令。
[编辑] 如果您的目标是让每个URL 一个项目,则可以执行以下操作:
def parse(self, response):
item = {
'search_title': response.css('input#sbhost::attr(value)').get(),
'results': response.css('#resultStats::text').get(),
}
yield item
如果您的目标是提取页面上的每个结果,那么您需要有所不同。