【问题标题】:How can I debug Scrapy?如何调试 Scrapy?
【发布时间】:2022-03-11 03:11:51
【问题描述】:

我 99% 确定我在此网站上的 hxs.select 发生了什么事。我无法提取任何东西。当我运行以下代码时,我没有收到任何错误反馈。 titlelink 不会被填充。有什么帮助吗?

def parse(self, response):
    self.log("\n\n\n We got data! \n\n\n")
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//div[@class=\'footer\']')
    items = []
    for site in sites:
        item = CarrierItem()
        item['title'] = site.select('.//a/text()').extract()
        item['link'] = site.select('.//a/@href').extract()
        items.append(item)
    return items

有没有办法调试这个?我还尝试使用带有 url 的 scrapy shell 命令,但是当我在 shell 中输入 view(response) 时,它只返回 True 并打开一个文本文件而不是我的 Web 浏览器。

>>> 响应.url 'https://qvpweb01.ciq.labs.att.com:8080/dis/login.jsp' >>> hxs.select('//div') 回溯(最近一次通话最后): 文件“”,第 1 行,在 AttributeError:“NoneType”对象没有属性“选择” >>> 视图(响应) 真的 >>> hxs.select('//body') 回溯(最近一次通话最后): 文件“”,第 1 行,在 AttributeError:“NoneType”对象没有属性“选择”

【问题讨论】:

  • 我的网站根本没有加载。 response.body 长什么样子?
  • 您可以随时添加print sites 并查看抓取过程中打印的内容。
  • 此站点是我们的内部网,因此您将无法访问它。如果我输入 response.body 我确实会取回 xml 样式表(我无法发布太多字符)>>> response.body '\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n \n \n \n \n 登录\n \n \n 链接 >
  • 我在代码中添加了打印站点,但没有任何反应,我在 cmd 提示符中看到的唯一区别是它有一个空括号 []

标签: python web-scraping scrapy


【解决方案1】:

Scrapy shell 确实是一个很好的工具。如果您的文档有一个 XML 样式表,那么它可能就是一个 XML 文档。所以你可以使用带有xxs的scrapy shell,而不是hxs,就像这个关于删除命名空间的Scrapy文档示例一样: http://doc.scrapy.org/en/latest/topics/selectors.html#removing-namespaces

如果这不起作用,我倾向于回到纯 lxml.etree 并转储整个文档的元素:

import lxml.etree
import lxml.html

class myspider(BaseSpider):
    ...
    def parse(self, response):
        self.log("\n\n\n We got data! \n\n\n")
        root = lxml.etree.fromstring(response.body).getroot()
        # or for broken XML docs:
        # root = lxml.etree.fromstring(response.body, parser = lxml.etree.XMLParser(recover=True)).getroot()
        # or for HTML:
        # root = lxml.etree.fromstring(response.body, parser=lxml.html.HTMLParser()).getroot()

        # and then lookup what are the actual elements I can select
        print list(root.iter()) # this could be very big, but at least you all what's inside, the element tags and namespaces

【讨论】:

    【解决方案2】:

    您可以从命令行使用 pdb 并在文件中添加断点。但这可能涉及一些步骤。

    (windows调试可能略有不同)

    1. 找到您的scrapy 可执行文件:

      $ whereis scrapy
      /usr/local/bin/scrapy
      
    2. 调用它作为python脚本并启动pdb

      $ python -m pdb /usr/local/bin/scrapy crawl quotes
      
    3. 在调试器外壳中,打开另一个外壳实例并找到您的蜘蛛脚本的路径(位于您的蜘蛛项目中)

      $ realpath path/to/your/spider.py
      /absolute/spider/file/path.py
      

    这将输出绝对路径。将其复制到剪贴板。

    1. 在 pdb shell 中输入:

      b /absolute/spider/file/path.py:line_number
      

    ...其中行号是调试该文件时所需的中断点。

    1. 在调试器中点击c...

    现在去做一些 PythonFu :)

    【讨论】:

      【解决方案3】:

      使用 VSCode:

      1。找到您的 scrapy 可执行文件所在的位置:

      $ which scrapy
      /Users/whatever/tutorial/tutorial/env/bin/scrapy
      

      对我来说是/Users/whatever/tutorial/tutorial/env/bin/scrapy,复制那个路径。

      2。创建launch.json文件

      转到 VSCode 中的调试选项卡,然后单击“添加配置”

      3。将以下模板粘贴到launch.json中

      {
          // Use IntelliSense to learn about possible attributes.
          // Hover to view descriptions of existing attributes.
          // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "Python: Current File",
                  "args": ["crawl", "NAME_OF_SPIDER"],
                  "type": "python",
                  "request": "launch",
                  "program": "PATH_TO_SCRAPY_FILE",
                  "console": "integratedTerminal",
                  "justMyCode": false
              }
          ]
      }
      

      在该模板中,将 NAME_OF_SPIDER 替换为您的蜘蛛名称(在我的例子中为 datasets)。 PATH_TO_SCRAPY_FILE 与您在步骤 1 中获得的输出。(在我的情况下为 /Users/whatever/tutorial/tutorial/env/bin/scrapy)。

      4。检查 VSCode 是否已在您的 scrapy 项目的根目录中打开

      5。设置断点,点击调试!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-14
        • 2019-08-30
        • 2015-11-18
        • 2019-03-22
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 2018-08-18
        相关资源
        最近更新 更多