• 学习scrapy,发现列表返回为空


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 2401_86192092 2024-07-23 21:52 采纳率: 0% 浏览 4 首页/ 编程语言 / 学习scrapy,发现列表返回为空 python 问题遇到的现象和发生背景 遇到的现象和发生背景,请写出第一个错误信息 import scrapy class ItcastSpider(scrapy.Spider): name = "itcast" allowed_domains = ["itcast.cn/"] start_urls = ["https://python.itheima.com/?pythonzly#navjxtd"] def parse(self, response): # with open("itcast.html", "wb")as f: # f.write(response.body) node_list = response.xpath('//div[@class="li_txt"]') print(node_list) for node in node_list: temp = {} temp['name'] = node.xpath('./h3/text()').extract() temp['experience'] = node.xpath('./p/text()').extract() yield temp print(response.status) 我觉得我的xpath路径正确的 用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50% 请求帮助 运行结果及详细报错内容 我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60% 我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏” 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 阿里嘎多学长 2024-07-23 21:52
      关注

      以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


      在使用Scrapy进行网页爬取时,遇到列表返回为空的问题,通常有以下几种可能的原因:

      1. Xpath表达式错误:尽管你确信Xpath路径是正确的,但有时候网页的微小变化,比如类名或标签的更改,都会导致Xpath失效。建议再次检查Xpath表达式是否与网页的当前结构相匹配。

      2. 网页加载问题:如果网页是通过JavaScript动态加载内容,Scrapy可能无法直接获取到这些内容。可以尝试使用response.css()结合response.xpath()来提取数据,或者使用Selenium等工具来处理动态加载的内容。

      3. 请求被拦截或响应不正确:确保你的请求没有被服务器拦截,并且响应的状态码是200。可以通过打印response.status来检查这一点。

      4. 编码问题:确保网页的编码与你的爬虫编码设置一致,否则可能会因为编码问题导致解析错误。

      5. Scrapy设置问题:检查Scrapy的设置,比如USER_AGENT等,确保你的请求看起来像是来自一个正常的浏览器。

      针对你的问题,以下是一些可能的解决步骤:

      • 验证Xpath:使用浏览器的开发者工具来检查元素的Xpath是否正确。
      • 检查响应:打印response.text来查看网页的HTML内容,确保Scrapy获取到了正确的页面内容。
      • 使用response.css():如果response.xpath()不起作用,尝试使用response.css()来选择元素。
      • 检查日志:查看Scrapy的日志输出,可能会有有用的错误信息或警告。
      • 使用代理或更改请求头:如果怀疑请求被拦截,尝试使用代理或更改请求头。

      下面是一些示例代码,展示如何使用response.css()和打印响应内容:

      import scrapy
      
      class ItcastSpider(scrapy.Spider):
          name = "itcast"
          allowed_domains = ["itheima.com"]  # 确保域名正确
          start_urls = ["https://python.itheima.com/?pythonzly#navjxtd"]
      
          def parse(self, response):
              # 打印响应状态码
              print(response.status)
      
              # 打印响应内容
              print(response.text)
      
              # 使用CSS选择器尝试提取数据
              node_list = response.css('div.li_txt')
      
              for node in node_list:
                  temp = {
                      'name': node.css('h3::text').get(),
                      'experience': node.css('p::text').get()
                  }
                  yield temp
      

      请注意,上面的代码中我将allowed_domains中的域名更正为"itheima.com",因为原始代码中的域名似乎有误。同时,我使用了response.css()来尝试提取数据。

      最后,如果你认为需要快速获得回答,可以考虑使用“付费悬赏”的方式,但这并不是必需的,因为社区中有很多乐于助人的开发者。希望这些建议能帮助你解决问题。

      展开全部

      评论 编辑记录
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-23 21:52
      关注

      引自免费微信小程序:皆我百晓生

      首先,你的Scrapy代码看起来是正确的,你的XPath路径看起来也没有问题。但是,如果你的列表返回为空,那么可能有以下几个原因:

      1. 页面结构改变:网页的结构可能已经改变,你的XPath可能已经不再适用。你可以检查网页源代码来确认元素是否还存在并且具有相同的类名或ID。
      2. JavaScript渲染:有些网站的内容是通过JavaScript动态加载的,这种情况下,Scrapy获取的页面内容和你在浏览器中看到的可能不同。如果页面有这种动态加载内容,你可能需要使用Splash或Selenium等工具来渲染JavaScript后再进行抓取。
      3. 请求头问题:有些网站会对爬虫进行反爬虫策略,例如检查User-Agent等请求头信息。你可以尝试修改请求头信息来绕过反爬虫策略。
      4. 网站访问限制:网站可能有访问频率限制,过于频繁的请求可能导致被暂时封禁。你需要合理设置请求间隔。

      首先,我建议你检查一下网页源代码,确认一下你要抓取的元素是否还存在并且具有相同的类名。如果网页结构没有改变,那么你可以尝试打印出response的内容,看看是否成功获取了网页内容。你也可以尝试修改请求头信息来绕过反爬虫策略。如果以上都没有问题,那么你可能需要检查一下网站是否有动态加载内容的情况。

      关于你的代码,如果你想保存抓取到的数据,你可以使用Scrapy的Item和ItemLoader,这样可以更好地管理和处理数据。另外,你可能需要在Spider中设置合适的请求延迟以避免被暂时封禁。以下是一个简单的例子:

      import scrapy
      from scrapy import Request
      
      class ItcastSpider(scrapy.Spider):
          name = "itcast"
          allowed_domains = ["itcast.cn"]
          start_urls = ["https://python.itheima.com/?pythonzly#navjxtd"]
          custom_settings = {
              'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',  # 修改为你的浏览器User-Agent
              'DOWNLOAD_DELAY': 2  # 设置请求间隔为2秒
          }
      
          def parse(self, response):
              node_list = response.xpath('//div[@class="li_txt"]')
              for node in node_list:
                  temp = {}
                  temp['name'] = node.xpath('./h3/text()').get()  # 使用get()方法可以直接获取结果,无需extract()
                  temp['experience'] = node.xpath('./p/text()').get()  # 同上
                  yield temp  # 返回数据作为生成器输出
              print(response.status)  # 输出响应状态码
      

      在这个代码中,我设置了自定义的User-Agent和请求间隔,并且使用get()方法简化数据提取过程。如果仍然有问题,你可以进一步排查JavaScript渲染和网站反爬虫策略的问题。

      展开全部

      评论 编辑记录
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    【C语言】刷题笔记 Day1
    A、B机器正常TCP连接后,B突然断网,A处于什么状态?
    线性代数
    Oracle数据库透明加密 安当加密
    Jackson指定json的key
    图像拼接Image switch(opencv配置,有关的函数只在低版本中存在,例如3.4.2.16)
    web 面试高频考点 —— HTTP 篇
    今天你考ACP了没?备考指南即将上线!
    Verilog generate
    Go的并发
  • 原文地址:https://ask.csdn.net/questions/8132351