【问题标题】:How to Collect all book categories with the help of scrapy?如何在scrapy的帮助下收集所有书籍类别?
【发布时间】:2021-12-22 22:29:20
【问题描述】:

我是 scrapy 和 python 的新手,无法理解流程。来自本站https://books.toscrape.com/

我正在寻找如何使用 scrapy 收集不同类型书籍的所有类别。然后确定,每个类别列出了多少本书,并将结果导出为 JSON 格式。

我可以使用 VSC 或 spyder 哪些软件?

【问题讨论】:

  • 您可以使用您喜欢的任何 IDE。请添加您的代码以便我们更好地帮助您,并阅读how to ask

标签: python scrapy


【解决方案1】:

实际上,我最近刚刚为类似的东西构建了一个刮板。然而,最好的学习是通过实践和剖析代码并自己修改代码来实现它。

这是一个示例爬虫,它使用各种工具和 scrapy 来获取类别页面、书籍页面和下一页的信息。

link 中提供了一些额外信息,我在其中使用以下代码作为问题的一部分。也许,这对你也有用。

我建议使用下面的爬虫,通过收集页面左侧类别的信息来构建自己的爬虫。

刮板的快速分解:

BooksItem:

  • 这里我们构建一个字段来存储来自 itemloader 的结果,有点像存储列表的变量。

BookSpider:

  • 我们设置了start_urls

start_requests:

  • yed 来自起始 url 的请求(我通常将内容存储为列表,以养成为我的项目使用多个起始 url 的习惯)。回调告诉您在哪里解析信息。

parse:

  • 获取容器的 xpath,创建一个循环并设置一个项目加载器以引用 BooksItem 中的字段。找到项目的 xpath,并构建另一个带有书籍页面链接的请求。我们还可以通过 if 语句在下一页获取信息。

parse_book:

  • 在书页中获取一些信息并生成项目加载器。
class BooksItem(scrapy.Item):
    items = Field(output_processor=TakeFirst())
    price = Field(output_processor=TakeFirst())
    availability = Field(output_processor=TakeFirst())


class BookSpider(scrapy.Spider):
    name = "books"
    start_urls = ['https://books.toscrape.com']

    custom_setting = {
        'DOWNLOAD_DELAY': 1,
        'ROBOTSTXT_OBEY': False,
        'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',
        'CONCURRENT_REQUESTS': 100,
        'CONCURRENT_REQUESTS_PER_IP': 100
    }

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url,
                callback=self.parse
            )

    def parse(self, response):
        data = response.xpath('//div[@class = "col-sm-8 col-md-9"]//li')
        for books in data:
            loader = ItemLoader(BooksItem(), selector=books)
            loader.add_xpath('items', './/article[@class="product_pod"]/h3/a//text()')
            loader.add_xpath('price', './/p[@class="price_color"]//text()')

            for url in books.xpath('.//h3/a//@href').getall():
                yield scrapy.Request(
                    response.urljoin(url),
                    callback=self.parse_book,
                    cb_kwargs={'loader': loader}
                )

        # for next_page in [response.xpath('.//a[normalize-space()="next"]//@href').get()]:
        next_page = response.xpath('.//a[normalize-space()="next"]//@href').get()
        if next_page is not None:
            yield response.follow(next_page, callback=self.parse)

    def parse_book(self, response, loader):
        book_quote = response.xpath('//p[@class="instock availability"]/i/following-sibling::text()').get().strip()

        loader.add_value('availability', book_quote)
        yield loader.load_item()

【讨论】:

    【解决方案2】:

    我对网络抓取也很陌生,最近才开始学习它。这是我尝试抓取您提到的网站。

    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    
    
    class BooksSpider(CrawlSpider):
        name = 'books'
        allowed_domains = ['books.toscrape.com']
        start_urls = ['http://books.toscrape.com/?']
    
        rules = (
            Rule(LinkExtractor(
                restrict_xpaths="//li//article[@class='product_pod']//h3/a"), callback='parse_item', follow=True),
    
            Rule(LinkExtractor(
                restrict_xpaths="//li[@class='next']/a"), follow=True)
        )
    
        def parse_item(self, response):
            yield {
                'book_title': response.xpath("//article[@class='product_page']//h1/text()").get(),
                'price': response.xpath("//article[@class='product_page']//p[@class='price_color']/text()").get(),
                'availability': response.xpath("//table[@class='table table-striped']//tr[position() = 6]/td/text()").get(),
                'no_of_reviews': response.xpath("//table[@class='table table-striped']//tr[position() = 7]/td/text()").get()
            }
    

    【讨论】:

      猜你喜欢
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2016-04-12
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多