首页 > 解决方案 > 尝试使用 Scrapy 抓取数据但只得到空白答案

问题描述

我目前正在尝试从该网站上抓取特定数据,但是当我在此之后使用 cmd 进行爬网时,json 和 csv 文件最终只是空白我做错了什么?

import scrapy
class RatesSpider(scrapy.Spider):
    name = 'rates'
    allowed_domains = ['https://www.ratehub.ca/best-mortgage-rates/5-year/fixed']
    start_urls = ['http://https://www.ratehub.ca/best-mortgage-rates/5-year/fixed/']
 
    def parse(self, response):
        for row in response.xpath('//*[@id="AllRatesTable_SpQFd"]//tr'):
            yield {
                'Rate' : row.xpath('td[1]//span').get(),
                'Provider': row.xpath('td[2]//text()').get(),
            }

我尝试通过多种方式解决此问题,包括更改表格的 xpath,但最终导致 csv 中甚至没有标签。

标签: pythonscrapy

解决方案


我没有时间完全测试您的代码(即您的 xpath 表达式),但我可以给您一些顶级指针:

  1. A) 在allowed_domains中,您应该只包含ratehub.ca而不是包含您当前拥有的整个链接。有关更多信息,请参阅文档
    假设您的目标网址是https://www.example.com/1.html,然后将“example.com”添加到列表中
  2. A)在您的start_urls中,请注意您正在复制http://部分,这肯定行不通。 B)在你的start_urls,你应该删除最后一个/,好像我没有弄错scrapy会自动添加它。
  3. 您确定禁用 Java-Script 时表格不会消失吗?我尝试用您xpath的表格搜索 HTML 树,//*@id="AllRatesTable_SpQFd"]//tr 但没有返回任何内容。我建议确保您禁用 java-script 并再次尝试以确保它有效。
  4. 通过添加text()以下语句的最后一部分,您确保将文本提取回来。“率”不是文字吗?
yield {
                'Rate' : row.xpath('td[1]//span//text()').get(),
                'Provider': row.xpath('td[2]//text()').get(),
            }

推荐阅读