我该如何调试scrapy

时间:2013-07-01 20:47:15

标签: python web-scraping scrapy

我99%肯定我的hxs.select在这个网站上发生了什么,我无法从这个内部网网站中提取任何内容。当我运行这个时,我得到没有错误,没有任何标题或链接填充。有什么帮助吗?

    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

有没有办法可以调试这个?我也尝试做一个shell网址。当我在我的cmd中输入视图(响应)时,我得到一个“真实”文本文件,而不是我的网络浏览器。

>>> response.url
'https://qvpweb01.ciq.labs.att.com:8080/dis/login.jsp'
>>> hxs.select('//div')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'select'
>>> view(response)
True
>>> hxs.select('//body')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'select'
>>>

2 个答案:

答案 0 :(得分:1)

Scrapy shell确实是一个很好的工具。如果您的文档有XML样式表,那么它可能是一个XML文档。因此,您可以使用sc xxs而非hxs的scrapy shell,就像此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

答案 1 :(得分:0)

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

(对于Windows调试,它可能略有不同)

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

    $ whereis scrapy
    /usr/local/bin/scrapy
    
  2. 将其称为python脚本并启动pdb

    $ python -m pdb /usr/local/bin/scrapy crawl quotes
    
  3. 进入调试器shell后,打开另一个shell实例并找到蜘蛛脚本的路径(驻留在蜘蛛项目中)

    $ realpath path/to/your/spider.py
    /absolute/spider/file/path.py
    
  4. 这将输出绝对路径。将其复制到剪贴板。

    1. 在pdb shell中输入:

      b /absolute/spider/file/path.py:line_number
      
    2. ...在调试该文件时,行号是要中断的所需点。

      1. 在调试器中点击c ...
      2. 现在去做一些PythonFu:)