962464_Yikz 2023-05-25 19:38 采纳率: 0%
浏览 13

scrapy没有结果,如何解决?

img

img


找的xpath在普通的python文件中能爬取数据,为什么在scrapy中什么也没有

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-25 22:50
    关注
    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7575955
    • 你也可以参考下这篇文章:爬取中国最好大学网数据(Python的Scrapy框架与Xpath联合运用)
    • 除此之外, 这篇博客: Python爬虫框架Scrapy入门(二)第一个爬虫程序:使用xpath爬取起点中文网中的 四、实现爬虫 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 打开我们之前建立的爬虫工程,在spider目录下建立爬虫文件qidian_spider.py导入需要用到的库

      from scrapy import Request
      from scrapy.spiders import  Spider

      创建一个继承自 Spider的爬虫类,其中包含爬虫名称、目标网页、解析方法

      class HotSaleSpider(Spider):
          name = "hot" #爬虫名称
          start_urls = ["https://www.qidian.com/rank/hotsales?style=1"]#目标网站地址
          def parse(self, response):#用于数据解析
          	pass

      注意到parse方法的参数是response,这是因为我们使用爬虫框架会自动帮我们得到网页的响应,不需要我们另外编写代码向网页发起request请求,在scrapy内部已经发起请求并直接返回响应了。

      下图是scrapy框架的结构,我们需要做的就是完成spider的部分:得到网页响应后进行提取信息。在爬虫内部完成了1-6的工作。
      在这里插入图片描述
      所以我们重点编写parse方法。基于我们之前的网页分析,这里使用xpath方法提取信息。

      首先我们定位到class="book-mid-info",每本小说的信息都保存在这个"book-mid-info"类之下。

      list_selector = response.xpath("//div[@class='book-mid-info']")

      然后遍历每一本小说,获取各项信息,定位的方法同样是查看信息所在的标签。小说名称“诡秘之主”保存在"book-mid-info"类中的h4标签下的a标签,小说作者“爱潜水的乌贼”保存在"book-mid-info"类中的p标签下的a标签。
      在这里插入图片描述

      for one_selector in list_selector:
          # 获取小说信息
          name = one_selector.xpath("h4/a/text()").extract()[0] #提取当前定位下的文字
          author = one_selector.xpath("p[1]/a[1]/text()").extract()[0]
          type = one_selector.xpath("p[1]/a[2]/text()").extract()[0]
          form = one_selector.xpath("p[1]/span/text()").extract()[0]

      最后定义一个字典保存每本小说的各项信息并且通过生成器返回:

      # 保存小说信息为字典
      hot_dict = {
          "name":name,
          "author":author,
          "type":type,
          "form":form
      }
      yield hot_dict # 生成器返回每一本小说的信息

      关于yield关键字的含义可以参看:Python关键字:yield生成器

      完整代码:

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      #@Time  : 2020/2/20 11:45
      #@Author: bz
      #@File  : qidian_spider.py
      
      from scrapy import Request
      from scrapy.spiders import  Spider
      
      class HotSaleSpider(Spider):
          name = "hot" #爬虫名称
          start_urls = ["https://www.qidian.com/rank/hotsales?style=1"]#目标网站地址
          def parse(self, response):#用于数据解析
              #使用xpath定位
              list_selector = response.xpath("//div[@class='book-mid-info']")
              for one_selector in list_selector:
                  # 获取小说信息
                  name = one_selector.xpath("h4/a/text()").extract()[0] #提取当前定位下的文字
                  author = one_selector.xpath("p[1]/a[1]/text()").extract()[0]
                  type = one_selector.xpath("p[1]/a[2]/text()").extract()[0]
                  form = one_selector.xpath("p[1]/span/text()").extract()[0]
                  # 保存小说信息为字典
                  hot_dict = {
                      "name":name,
                      "author":author,
                      "type":type,
                      "form":form
                  }
                  yield hot_dict # 生成器返回每一本小说的信息
    • 您还可以看一下 王涛老师的150讲轻松学习Python网络爬虫课程中的 xpath-语法详细讲解小节, 巩固相关知识点
    • 以下回答由chatgpt基于相关博客总结生成:

      首先,可能是因为Scrapy中的响应对象不同于Python中的request库,需要使用Selector类来解析响应数据。可以使用以下代码将响应数据加载到Selector对象中:

      from scrapy.selector import Selector
      
      selector = Selector(text=response.text)
      

      如果还是不能获取到数据,可以检查xpath表达式是否正确。在Scrapy中使用xpath语法时,需要注意"."和"/"的使用,具体见参考资料中的段落1。

      如果还是不能解决问题,可以尝试使用Chrome浏览器的开发者工具查看目标数据在网页源代码中的位置,从而确定正确的xpath表达式。

      最后,可以检查是否需要先调用extract()方法将Selector对象转化为字符串类型才能获取数据。如:

      title = selector.xpath('//title/text()').extract_first()
      
    评论

报告相同问题?

问题事件

  • 创建了问题 5月25日

悬赏问题

  • ¥15 无源定位系统的时差估计误差标准差
  • ¥15 请问这个代码哪里有问题啊
  • ¥20 python--version在命令端输入结果Python is not defined怎么办?还有pip不是exe格式是不是没安装成功?
  • ¥15 通过GaussianView进行结构微调消除虚频
  • ¥15 调用transformers库
  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同
  • ¥15 excel 上下按钮 显示行
  • ¥20 云卓h12pro 数传问题