我是一个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
答案 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
。)