【问题标题】:Trying to scrape the table using scrapy尝试使用scrapy刮桌子
【发布时间】:2022-01-22 19:50:09
【问题描述】:
from scrapy import Spider
from scrapy.http import Request

class AuthorSpider(Spider):
    name = 'book'
    start_urls = ['https://www.amazon.com/s?k=school+bags&rh=n%3A1069242&ref=nb_sb_noss']

    def parse(self, response):
        books = response.xpath("//h2/a/@href").extract()
        for book in books:
            url = response.urljoin(book)
            yield Request(url, callback=self.parse_book)

    def parse_book(self, response):
        table=response.xpath("//table[@id='productDetails_detailBullets_sections1']").extract_first()
        yield{
            't':table
        }

我正在尝试抓取表格,但我不知道如何从表格中提取 text 试图抓取 product information 这是我提取表格的链接 https://www.amazon.com/Piel-Leather-Double-Flap-Over-Backpack/dp/B00GNEY85A/ref=sr_1_1_sspa?keywords=school%2Bbags&qid=1642846253&s=office-products&sr=1-1-spons&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExMkdMT1hKSkI1UVFTJmVuY3J5cHRlZElkPUEwNTQxMDA5M0c1R0xRQVUwTVdKViZlbmNyeXB0ZWRBZElkPUEwNzc5Njc4MUdQR09VMVBGSTlGSSZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU&th=1

【问题讨论】:

    标签: python web-scraping html-table scrapy


    【解决方案1】:

    要抓取一个表,您可以遍历表头和表数据并将它们分配给键和值,然后生成完整的字典。请参阅下面的示例

    from scrapy import Spider
    from scrapy.http import Request
    
    class AuthorSpider(Spider):
        name = 'book'
        start_urls = ['https://www.amazon.com/s?k=school+bags&rh=n%3A1069242&ref=nb_sb_noss']
    
        def parse(self, response):
            books = response.xpath("//h2/a/@href").extract()
            for book in books:
                url = response.urljoin(book)
                yield Request(url, callback=self.parse_book)
    
        def parse_book(self, response):
            details = {}
            for product_detail in response.xpath("//*[contains(@id,'productDetails')]//table/tr"):
                key = product_detail.xpath("normalize-space(./th/text())").get()
                value = product_detail.xpath("normalize-space(./td/text())").get().replace("\u200e", "")
                if "best sellers rank" in key.lower():
                    det_list = product_detail.xpath("./td/descendant::*/text()").getall()
                    value = "".join([i.strip() for i in det_list])
                if "customer reviews" in key.lower():
                     det_list = product_detail.xpath("./td/descendant::span/text()").getall()
                     value = " ".join([i.strip() for i in det_list])
                details[key] = value
            yield details
    

    【讨论】:

    • 他们没有抓取任何商品我认为亚马逊会阻止抓取商品有什么解决方案
    • 使用用户代理和代理
    【解决方案2】:

    它只适用于您在问题中遇到的这种表格:

    from scrapy import Spider
    from scrapy.http import Request
    
    
    class AuthorSpider(Spider):
        name = 'book'
        start_urls = ['https://www.amazon.com/s?k=school+bags&rh=n%3A1069242&ref=nb_sb_noss']
    
        def parse(self, response):
            books = response.xpath("//h2/a/@href").extract()
            for book in books:
                url = response.urljoin(book)
                # just for the example
                url='https://www.amazon.com/Piel-Leather-Double-Flap-Over-Backpack/dp/B00GNEY85A/ref=sr_1_1_sspa?keywords=school%2Bbags&qid=1642846253&s=office-products&sr=1-1-spons&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExMkdMT1hKSkI1UVFTJmVuY3J5cHRlZElkPUEwNTQxMDA5M0c1R0xRQVUwTVdKViZlbmNyeXB0ZWRBZElkPUEwNzc5Njc4MUdQR09VMVBGSTlGSSZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU&th=1'
                yield Request(url, callback=self.parse_book)
    
        def parse_book(self, response):
            rows = response.xpath('//div[@id="prodDetails"]//tr')
            table = {}
            for row in rows:
                key = row.xpath('.//th//text()').get(default='').strip()
                # this will work for most of the rows (except "Customer Reviews" and "Best Sellers Rank"):
                # value = line.xpath('.//td//text()').get(default='').strip()
                
                # this will work for all the rows
                value = row.xpath('.//td/text() | .//td//span/text()').getall()
                value = ''.join(value).strip()
                table.update({key: value})
    
            yield table
    

    这只是一个例子。您需要检查您可以获得的不同类型的表并相应地调整您的代码。

    我们正在做的是逐行遍历表格并从中提取文本,然后将其添加到字典中并最终生成它。

    要获取我们使用的文本/text()。搜索xpath cheat sheet会帮到你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 2021-01-05
      相关资源
      最近更新 更多