从脚本scrapy运行蜘蛛
Posted
技术标签:
【中文标题】从脚本scrapy运行蜘蛛【英文标题】:scrapy run spider from script 【发布时间】:2014-03-06 22:15:22 【问题描述】:我想从脚本而不是 scrap crawl
运行我的蜘蛛
我找到了这个页面
http://doc.scrapy.org/en/latest/topics/practices.html
但实际上它并没有说明该脚本的放置位置。
有什么帮助吗?
【问题讨论】:
大概,您将该代码放在您想用来运行蜘蛛的脚本中。 @Talvalin 我在问我应该把脚本放在哪里? 如果您的系统路径和 PYTHONPATH 设置正确,您应该可以将脚本放在您喜欢的任何位置 @Talvalin 所以即使我的scrapy项目也应该在pythonpath中?如是。假设我有 5 个项目来废弃这个域xxx.com
如果所有蜘蛛都具有相同的名称但在不同的项目中,哪个会被解雇?我居然有这种情况
简单的蜘蛛不需要创建项目,可以使用命令scrapy runspider
。我的回答包含一个完整的例子。
【参考方案1】:
简单明了:)
只需检查official documentation。我会在那里做一些改变,这样你就可以控制蜘蛛只在你做python myscript.py
时运行,而不是每次你从它导入时。只需添加一个if __name__ == "__main__"
:
import scrapy
from scrapy.crawler import CrawlerProcess
class MySpider(scrapy.Spider):
# Your spider definition
pass
if __name__ == "__main__":
process = CrawlerProcess(
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
)
process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished
现在将文件保存为myscript.py
并运行“python myscript.py”。
享受吧!
【讨论】:
我已经完成了你的代码。那么,如何将输出保存到 JSON 文件中呢?如果我们从命令提示符或终端运行 scrapy,我们可以设置 scrapy crawl MySpider -o output.json 并获得输出 JSON 文件。如果我们使用您的代码,我可以将代码放在哪里以将输出保存到 JSON 文件? @AlmogCohen @syaifulhusein 是的,它更复杂。我可以看到,在我的一个项目中,我做了以下事情:我创建了一个 Scrapy Pipleline,将处理过的项目存储在内存中。然后在蜘蛛运行结束时,我将它们从内存存储中取出并按照我的意愿操作这些项目。如果愿意提出一个新问题,我可以用代码示例在那里回答。 +Almog Cohen 我认为您的代码示例是我在***.com/questions/52141729/… 的问题的解决方案,请问您能在那里回答吗? @PaulozOiOzuLLuFabrício 你明白了。在那里看到我的答案。 syaifulhusein 如果您仍然需要回答您的问题,您也可以去那里。 ***.com/questions/52141729/… 非常优雅的解决方案【参考方案2】:幸运的是,scrapy 源是开放的,所以你可以按照 crawl command 的工作方式在你的代码中做同样的事情:
...
crawler = self.crawler_process.create_crawler()
spider = crawler.spiders.create(spname, **opts.spargs)
crawler.crawl(spider)
self.crawler_process.start()
【讨论】:
**opts.spargs
是什么?【参考方案3】:
你为什么不这样做呢?
from scrapy import cmdline
cmdline.execute("scrapy crawl myspider".split())
将该脚本放在与 scrapy.cfg
相同的路径中
【讨论】:
【参考方案4】:您可以只创建一个普通的 Python 脚本,然后使用 Scrapy 的命令行选项runspider
,这样您就可以运行蜘蛛而无需创建项目。
例如,您可以使用以下内容创建单个文件 ***_spider.py
:
import scrapy
class QuestionItem(scrapy.item.Item):
idx = scrapy.item.Field()
title = scrapy.item.Field()
class ***Spider(scrapy.spider.Spider):
name = 'SO'
start_urls = ['http://***.com']
def parse(self, response):
sel = scrapy.selector.Selector(response)
questions = sel.css('#question-mini-list .question-summary')
for i, elem in enumerate(questions):
l = scrapy.contrib.loader.ItemLoader(QuestionItem(), elem)
l.add_value('idx', i)
l.add_xpath('title', ".//h3/a/text()")
yield l.load_item()
然后,只要你正确安装了scrapy,你就可以使用:
scrapy runspider ***_spider.py -t json -o questions-items.json
【讨论】:
我在l = scrapy.contrib.loader.ItemLoader(QuestionItem(), elem)
: exceptions.AttributeError: 'module' object has no attribute 'loader'
上收到此错误。关于如何解决这个问题的任何想法?
@Basj 你需要import scrapy.contrib.loader
才能工作。
谢谢@elias。我应该在您的代码中添加什么才能从 python ***_spider.py
而不是 scrapy runspider ...
运行它?我真的被这个小问题困住了。
@Basj 由于 Scrapy 在 Twisted 之上的工作方式,这不是推荐的使用方式:通常你使用 scrapy 命令运行爬虫或将项目部署在 scrapyd 的实例上。如果您真的想在脚本中运行,我无法补充您从这些文档中获得的太多信息——我从未亲自做过。以上是关于从脚本scrapy运行蜘蛛的主要内容,如果未能解决你的问题,请参考以下文章