【问题标题】:How to build a stand alone Scrapy Spider?如何构建一个独立的 Scrapy Spider?
【发布时间】:2018-05-15 23:16:04
【问题描述】:

很抱歉重新发布,我之前帖子中的标题令人困惑。在蜘蛛示例(下面的代码)中,我如何使用“pyinstaller”(或其他一些安装程序)来构建可执行文件(例如 myspidy.exe),这样最终用户就不需要在 windows 环境中安装 scrapy 和 python ?安装 Python 和 Scrapy 后,通过执行命令“scrapy crawl quotes”来运行爬虫。最终用户将在没有预装 Python 和 Scrapy 的 Windows 电脑上运行下载并运行“myspidy.exe”。非常感谢!

import scrapy
class QuotesSpider(scrapy.Spider): 
    name = "quotes"
    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
           f.write(response.body)
        self.log('Saved file %s' % filename)

谢谢 EVHZ。我按照您的建议对代码进行了更改,并在运行时出现以下错误。

D:\craftyspider\spidy\spidy\spiders\dist>.\runspidy
Traceback (most recent call last):
File "spidy\spiders\runspidy.py", line 35, in <module>
File "site-packages\scrapy\crawler.py", line 249, in __init__
File "site-packages\scrapy\crawler.py", line 137, in __init__
File "site-packages\scrapy\crawler.py", line 326, in _get_spider_loader
File "site-packages\scrapy\utils\misc.py", line 44, in load_object
File "importlib\__init__.py", line 126, in import_module
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'scrapy.spiderloader'
[14128] Failed to execute script runspidy

【问题讨论】:

标签: python scrapy pyinstaller


【解决方案1】:

为了将所有内容保存在 python 文件中,只需通过以下方式执行:

python script.py

你可以使用你拥有的代码,并添加一些东西:

import scrapy
from scrapy.crawler import CrawlerProcess

from scrapy.utils.project import get_project_settings
# useful if you have settings.py 
settings = get_project_settings()

# Your code
class QuotesSpider(scrapy.Spider): 
  name = "quotes"
  def start_requests(self):
    ...    

# Create a process
process = CrawlerProcess( settings )
process.crawl(QuotesSpider)
process.start()

另存为script.py。然后,使用pyinstaller

pyinstaller --onefile script.py

将在名为 dist 的子目录中生成捆绑包。

【讨论】:

  • 您好,谢谢。我尝试了上述方法并在以下过程中遇到了这些错误。
  • 对不起,运行时的错误如上原问题所示。
  • 我使用 --hidden-import 来解决丢失的模块“scrapy.spiderloader”,这导致更多的丢失模块都以“scrapy.*...”开头。感谢您的帮助。
  • 对不起,上面的评论暗示我明白了。我还没有。我添加了大约 50 个 --hidden-import 来解决丢失的模块。现在我得到“没有这样的文件...... mime.types”。
  • 关于ModuleNotFoundError: No module named 'scrapy.spiderloader' 仔细检查该文件在pyinstaller 之前工作,那么也许该模块在构建过程中被隐藏了?很难说没有关于项目结构、代码、您使用的 --hidden-imports 的更多细节。但仔细观察,如果脚本与python 一起使用,那么这是构建过程中的问题。你会得到它,或者如果没有,创建另一个关于构建的问题。不过,跟踪构建,它必须在那里。
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2022-10-24
相关资源
最近更新 更多