我如何从具有“下一步”按钮的网站上刮取以及是否滚动?

时间:2019-04-15 14:05:42

标签: python scrapy

我正尝试从名为quotestoscrape的网站上刮取所有数据。但是,当我尝试运行我的代码时,它只会得到一个随机引用。它至少应该仅获取该页面中的所有数据,但仅获取一个。另外,如果我现在以某种方式从第1页获取数据,那么我想要的就是从所有页面获取数据。

  1. 那我该如何解决这个错误(应该从page1中获取所有数据)?
  2. 如何获取下一页中显示的所有数据?

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

请告诉我我可以做什么?

2 个答案:

答案 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上的示例将非常有帮助。