如果声明在scrapy中不适用于蜘蛛

时间:2014-04-02 20:48:58

标签: python web-crawler scrapy

我是一个python / scrapy新手。我试图抓住一个网站进行练习,基本上我想要完成的是拉动所有活跃的公司并将它们下载到CSV文件。你可以看到我的代码粘贴在下面我添加了一个IF语句,它似乎没有工作,我不确定我做错了什么。

另外我认为蜘蛛根据其输出多次抓取网站。我每次运行时都只希望它抓取一次网站。

只是一个FYI我搜索stackoverflow的答案,我找到了一些解决方案,但我无法让它们中的任何一个工作。我想这是新秀的一部分。

from scrapy.spider import Spider
from scrapy.selector import Selector
from bizzy.items import BizzyItem

class SunSpider(Spider):
    name = "Sun"
    allowed_domains = ['sunbiz.org']
    start_urls = [
    'http://search.sunbiz.org/Inquiry/CorporationSearch/SearchResults/EntityName/a/Page1'
]


    def parse(self, response):
        sel = Selector(response)
        sites = sel.xpath('//tbody/tr')
        items = []
        for site in sites:
            item = BizzyItem()
            item["company"] = sel.xpath('//td[1]/a/text()').extract()
            item["status"] = sel.xpath('//td[3]/text()').extract()
            if item["status"] != 'Active':
                pass
            else:
                items.append(item)
        return items

1 个答案:

答案 0 :(得分:1)

多次爬行?

我现在有时间阅读您的代码并浏览您要抓取的网站的源代码。首先,我可以告诉你,我对Scrapy的有限经验表明你的蜘蛛没有多次抓取网站。您正在经历的只是调试输出的噩梦般的墙壁scrapy开发人员认为默认情况下是一个好主意。 :)

如果你仔细阅读它,它实际上是非常有用的信息,如果你能学会发现模式,你几乎可以随着它的嗖嗖声读出它。我相信他们正确使用stderr因此,如果您处于Unix-y环境中,您可以使用scrapy crawl myspider -o output.json -t json 2&>/dev/null(IIRC)将其静音。

神秘的if陈述

由于extract操作选择器的性质很可能会返回多个元素,因此它会返回list。如果您要打印结果,即使在xpath中选择了text(),您会发现它看起来像这样:

[u'string']  # Note the brackets
#^ no little u if you are running this with Python 3.x

您需要该列表的第一个元素(仅限成员)[0]。幸运的是,您可以将其添加到已为extract构建的方法链中:

item["company"] = sel.xpath('//td[1]/a/text()').extract()[0]
item["status"] = sel.xpath('//td[3]/text()').extract()[0]

然后(假设您的xpath是正确的 - 我没有检查它),您的条件应该按预期运行。 (任何大小的列表永远不会等于字符串,因此您总是pass。)