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




