我正尝试从名为quotestoscrape的网站上刮取所有数据。但是,当我尝试运行我的代码时,它只会得到一个随机引用。它至少应该仅获取该页面中的所有数据,但仅获取一个。另外,如果我现在以某种方式从第1页获取数据,那么我想要的就是从所有页面获取数据。
items.py文件
import scrapy
class QuotetutorialItem(scrapy.Item):
title = scrapy.Field()
author = scrapy.Field()
tag = scrapy.Field()
quotes_spider.py文件
import scrapy
from ..items import QuotetutorialItem
class QuoteScrapy(scrapy.Spider):
name = 'quotes'
start_urls = [
'http://quotes.toscrape.com/'
]
def parse(self, response):
items = QuotetutorialItem()
all_div_quotes = response.css('div.quote')
for quotes in all_div_quotes:
title = quotes.css('span.text::text').extract()
author = quotes.css('.author::text').extract()
tag = quotes.css('.tag::text').extract()
items['title'] = title
items['author'] = author
items['tag'] = tag
yield items
请告诉我我可以做什么?
答案 0 :(得分:1)
据报道,它没有提高您的收益率。而要浏览下一页,只需添加对下一个按钮的检查,并在其后产生一个请求。
import scrapy
class QuoteScrapy(scrapy.Spider):
name = 'quotes'
start_urls = [
'http://quotes.toscrape.com/'
]
def parse(self, response):
items = {}
all_div_quotes = response.css('div.quote')
for quotes in all_div_quotes:
title = quotes.css('span.text::text').extract()
author = quotes.css('.author::text').extract()
tag = quotes.css('.tag::text').extract()
items['title'] = title
items['author'] = author
items['tag'] = tag
yield items
next_page = response.css('li.next a::attr(href)').extract_first()
if next_page:
yield response.follow(next_page)
答案 1 :(得分:0)
由于@LanteDellaRovere在注释中已正确标识,因此应该对yield
循环的每次迭代执行for
语句-这就是为什么您仅看到单个(可能是最后一个)链接的原因从每个页面。
就阅读连续的页面而言,您可以从页面底部的<nav>
元素中提取它,但是结构非常简单-链接(未指定标签时)采用以下形式
http://quotes.toscrape.com/page/N/
您会发现,对于N = 1,您将获得第一页。因此,只需访问URL以增加N的值,直到尝试看到返回404应该是一种简单的解决方案即可。
对Scrapy不太了解,我无法为您提供确切的代码,但是如果您想使用更复杂和Pythonic的方法,https://docs.scrapy.org/en/latest/intro/tutorial.html#following-links上的示例将非常有帮助。