You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Scrapy爬虫问题:仅获取图书链接,无法抓取书名并保存至CSV

嘿,我来帮你解决这个爬虫的问题!你的Scrapy脚本现在只拿到了图书链接,没抓取到书名,主要是因为你没在代码里加入提取书名的逻辑——要么直接从搜索列表页提取,要么跟进到详情页去获取。我给你两种实用方案,按需选择就行:

方案1:直接从搜索列表页提取书名(高效省时间)

亚马逊的搜索结果页本身就显示了图书标题,直接在这里提取不需要跳转详情页,速度更快。修改后的代码如下:

import scrapy

class AmazonSpiderSpider(scrapy.Spider):
    name = 'amazon_spider'
    allowed_domains = ['www.amazon.com']
    start_urls = ['https://www.amazon.com/s/ref=dp_bc_3?ie=UTF8&node=468216&rh=n%3A283155%2Cn%3A%212349030011%2Cn%3A465600%2C']

    def parse(self, response):
        # 定位非赞助的图书条目(避免抓取广告)
        book_items = response.css('.s-result-item[data-asin]:not(.s-sponsored-list-item)')
        
        for item in book_items:
            # 提取书名:亚马逊列表页书名通常在h2下的span里
            book_title = item.css('h2 a span::text').get(default='无书名').strip()
            
            # 提取并拼接完整图书链接
            book_link = item.css('h2 a::attr(href)').get()
            full_book_link = response.urljoin(book_link) if book_link else '无效链接'
            
            # 生成数据(Scrapy会自动处理后续导出)
            yield {
                '书名': book_title,
                '链接': full_book_link
            }

        # 处理翻页(可选,如需抓取多页结果)
        next_page_url = response.css('.s-pagination-next::attr(href)').get()
        if next_page_url:
            yield response.follow(next_page_url, callback=self.parse)

使用说明:

运行爬虫时直接用Scrapy自带的CSV导出命令,不用自己写文件操作:

scrapy crawl amazon_spider -o amazon_books.csv

执行后会自动生成CSV文件,书名和链接分别在不同列里。

方案2:进入详情页提取书名(适合需要完整信息的场景)

如果列表页的书名显示不完整,或者你还想抓取详情页的其他信息(比如作者、价格),可以跟进到图书详情页提取标题。代码如下:

import scrapy

class AmazonSpiderSpider(scrapy.Spider):
    name = 'amazon_spider'
    allowed_domains = ['www.amazon.com']
    start_urls = ['https://www.amazon.com/s/ref=dp_bc_3?ie=UTF8&node=468216&rh=n%3A283155%2Cn%3A%212349030011%2Cn%3A465600%2C']

    def parse(self, response):
        book_items = response.css('.s-result-item[data-asin]:not(.s-sponsored-list-item)')
        
        for item in book_items:
            book_link = item.css('h2 a::attr(href)').get()
            if book_link:
                full_link = response.urljoin(book_link)
                # 向详情页发送请求,并用meta传递链接信息
                yield scrapy.Request(
                    url=full_link,
                    callback=self.parse_book_detail,
                    meta={'book_link': full_link}
                )

        # 翻页处理
        next_page_url = response.css('.s-pagination-next::attr(href)').get()
        if next_page_url:
            yield response.follow(next_page_url, callback=self.parse)

    def parse_book_detail(self, response):
        # 从详情页提取完整书名(亚马逊详情页标题通常在#productTitle)
        full_title = response.css('#productTitle::text').get(default='无书名').strip()
        # 从meta中取出之前传递的链接
        book_link = response.meta.get('book_link', '无效链接')
        
        yield {
            '书名': full_title,
            '链接': book_link
        }

重要注意事项:

  • 亚马逊有反爬机制,记得在Scrapy的settings.py里配置用户代理和下载延迟:
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    DOWNLOAD_DELAY = 2  # 每2秒发一次请求,避免被封
    
  • 如果CSS选择器失效,打开亚马逊页面按F12调出开发者工具,自己定位元素调整选择器即可。

内容的提问来源于stack exchange,提问作者Land Owner

火山引擎 最新活动