首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >对从Python脚本中运行Scrapy感到困惑

对从Python脚本中运行Scrapy感到困惑
EN

Stack Overflow用户
提问于 2013-07-10 15:00:45
回答 3查看 6.1K关注 0票数 6

遵循document,我可以从Python脚本运行scrapy,但我无法获得scrapy结果。

这是我的蜘蛛:

代码语言:javascript
代码运行次数:0
运行
复制
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from items import DmozItem

class DmozSpider(BaseSpider):
    name = "douban" 
    allowed_domains = ["example.com"]
    start_urls = [
        "http://www.example.com/group/xxx/discussion"
    ]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        rows = hxs.select("//table[@class='olt']/tr/td[@class='title']/a")
        items = []
        # print sites
        for row in rows:
            item = DmozItem()
            item["title"] = row.select('text()').extract()[0]
            item["link"] = row.select('@href').extract()[0]
            items.append(item)

        return items

注意最后一行,我尝试使用返回的解析结果,如果我运行:

代码语言:javascript
代码运行次数:0
运行
复制
 scrapy crawl douban

终端可以打印返回结果

但是我无法从Python脚本中获得返回结果。下面是我的Python脚本:

代码语言:javascript
代码运行次数:0
运行
复制
from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy.settings import Settings
from scrapy import log, signals
from spiders.dmoz_spider import DmozSpider
from scrapy.xlib.pydispatch import dispatcher

def stop_reactor():
    reactor.stop()
dispatcher.connect(stop_reactor, signal=signals.spider_closed)
spider = DmozSpider(domain='www.douban.com')
crawler = Crawler(Settings())
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
log.msg("------------>Running reactor")
result = reactor.run()
print result
log.msg("------------>Running stoped")

我尝试在reactor.run()中获取结果,但它什么也不返回。

怎样才能得到结果呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-10 15:16:03

终端会打印结果,因为默认日志级别设置为DEBUG

当您从脚本运行爬行器并调用log.start()时,默认日志级别设置为INFO

只需替换:

代码语言:javascript
代码运行次数:0
运行
复制
log.start()

使用

代码语言:javascript
代码运行次数:0
运行
复制
log.start(loglevel=log.DEBUG)

更新:

要获得字符串形式的结果,您可以将所有内容记录到一个文件中,然后从文件中读取,例如:

代码语言:javascript
代码运行次数:0
运行
复制
log.start(logfile="results.log", loglevel=log.DEBUG, crawler=crawler, logstdout=False)

reactor.run()

with open("results.log", "r") as f:
    result = f.read()
print result

希望这能有所帮助。

票数 8
EN

Stack Overflow用户

发布于 2014-05-27 22:54:45

我在问自己同样的问题时发现了你的问题,也就是:“我怎样才能得到结果?”由于这个问题在这里没有回答,我努力自己寻找答案,现在我已经找到了,我可以分享它:

代码语言:javascript
代码运行次数:0
运行
复制
items = []
def add_item(item):
    items.append(item)
dispatcher.connect(add_item, signal=signals.item_passed)

或者对于scrapy 0.22 (http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script),将我的解决方案的最后一行替换为:

代码语言:javascript
代码运行次数:0
运行
复制
crawler.signals.connect(add_item, signals.item_passed)

我的解决方案自由地改编自http://www.tryolabs.com/Blog/2011/09/27/calling-scrapy-python-script/

票数 5
EN

Stack Overflow用户

发布于 2014-03-14 17:05:37

在我的示例中,我将脚本文件放在scrapy项目级别,例如,如果是scrapyproject/scrapyproject/spiders,则将其放在scrapyproject/myscript.py

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17564305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档