本节介绍使用Scrapy时的常见做法。这些内容涉及许多主题,并且通常不属于任何其他特定部分。   从脚本运行Scrapy 您可以使用API从脚本运行Scrapy,而不是运行Scrapy的典型方法。scrapy crawl 请记住,Scrapy是建立在Twisted异步网络库之上的,因此您需要在Twisted reactor中运行它。 您可以用来运行蜘蛛的第一个实用程序是 scrapy.crawler.CrawlerProcess。该类将为您启动Twisted reactor,配置日志记录并设置关闭处理程序。此类是所有Scrapy命令使用的类。 这是一个示例,展示如何使用它运行单个蜘蛛

本文档介绍了调试蜘蛛的最常用技术。考虑下面的scrapy蜘蛛: import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = ‘myspider’ start_urls = ( ‘http://example.com/page1’, ‘http://example.com/page2’, ) def parse(self, response): # collect `item_urls` for item_url in item_urls: yield scrapy.Request(

注意 scrapy.log已被弃用于其函数,支持显式调用Python标准日志记录。继续阅读以了解有关新记录系统的更多信息。 Scrapy使用Python的内置日志记录系统进行事件记录。我们将提供一些简单的示例来帮助您入门,但对于更高级的用例,强烈建议您仔细阅读其文档。 日志记录开箱即用,并且可以在某种程度上使用记录设置中列出的Scrapy设置进行配置。 Scrapy调用scrapy.utils.log.configure_logging()设置一些合理的默认值并在运行命令时在日志记录设置中处理这些设置,因此如果您从脚本中运行Scrapy中所述的脚本运行Scrapy,建议手动调用它。 &nbsp

尽管您可以使用任何可调用函数作为输入和输出处理器,但Scrapy提供了一些常用的处理器,如下所述。其中一些MapCompose(如通常用作输入处理器)组成了按顺序执行的几个函数的输出,以产生最终的解析值。 以下是所有内置处理器的列表: class scrapy.loader.processors.Identity 最简单的处理器,它什么都不做。它返回原始值不变。它不接收任何构造函数参数,也不接受Loader上下文。 例: >>> from scrapy.loader.processors import Identity >>> proc = Identity

随着您的项目变得越来越大并获得越来越多的蜘蛛,维护成为一个基本问题,特别是当您必须为每个蜘蛛处理许多不同的解析规则,有很多例外,但也想重用通用处理器时。 项目加载器旨在减轻解析规则的维护负担,同时不失去灵活性,同时提供扩展和覆盖它们的便捷机制。因此,Item Loaders支持传统的Python类继承,以处理特定蜘蛛(或蜘蛛组)的差异。 例如,假设某个特定站点用三个破折号(例如)包含其产品名称,并且您不希望最终在最终产品名称中删除这些破折号。—Plasma TV— 以下是通过重用和扩展默认Product Item Loader(ProductLoader)来删除这些破折号的方法: fr

声明项目加载器 通过使用类定义语法将Item Loaders声明为Items。这是一个例子: from scrapy.loader import ItemLoader from scrapy.loader.processors import TakeFirst, MapCompose, Join class ProductLoader(ItemLoader): default_output_processor = TakeFirst() name_in = MapCompose(unicode.title) name_out = Join() price_in = MapCompose(uni

蜘蛛是定义如何抓取某个站点(或一组站点)的类,包括如何执行爬行(即跟随链接)以及如何从其页面中提取结构化数据(即抓取项目)。换句话说,Spiders是您为特定站点(或者在某些情况下,一组站点)爬网和解析页面定义自定义行为的地方。 对于蜘蛛,刮擦周期经历如下: 首先生成初始请求以爬网第一个URL,并指定要使用从这些请求下载的响应调用的回调函数。 第一个执行请求是通过调用 start_requests()(默认情况下)为在请求中作为回调函数的方法中Request指定的URL start_urls和parse方法生成的 方法获得的。 在回调函数中,您解析响应(网页)并返回带有提取的数据,Item对象

将Python 2代码移植到Python 3 author: Brett Cannon 摘要 Python 3是Python的未来,而Python 2仍然存在activeuse,最好让你的项目可用于两个主要版本的Python。本指南旨在帮助您弄清楚如何最好地支持Python 2&3同时 //如果您想要扩展模块而不是纯Python代码,请参阅将扩展模块移植到Python 3 . 如果您想阅读一个核心Python开发人员对Python 3came的存在进行了解,你可以阅读Nick Coghlan的Python 3 Q&一个orBrett Cannon的为什么Python 3存在.

导入模块 PyObject * PyImport_ImportModule( const char  *name) Return value: New reference. 这是PyImport_ImportModuleEx()的简化界面下面,将globals和locals参数设置为NULL和level setto 0.当name参数包含一个点(当它指定了一个包的子模块),fromlist参数设置为列表[“*”],以便返回值是模块而不是包含它的顶级包,否则就是这种情况。。(不幸的是,当name infact指定子包而不是子模块时,这会产生额外的副作用:加载包__all__变量中指定的子模块。)

modulefinder– 查找脚本使用的模块 源代码: Lib / modulefinder.py 这个模块提供了ModuleFinder类,可以用来确定脚本导入的模块集。modulefinder.py也可以作为脚本运行,给出Python脚本的文件名作为参数,之后将打印导入模块的输出端口. modulefinder.AddPackagePath(pkg_name, path) 记录名为pkg_name可以在指定的path. modulefinder.ReplacePackage(oldname, newname) 中找到,指定名为oldname的模块实际上是名为newname.