Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非常基本的例子_Python_Web Scraping_Scrapy - Fatal编程技术网

Python 非常基本的例子

Python 非常基本的例子,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,嗨,我已经在我的mac上安装了Python Scrapy,我试图在他们的web上跟踪v 他们试图运行命令: scrapy crawl mininova.org -o scraped_data.json -t json 我不太明白这是什么意思?看起来scrapy是一个独立的程序。我认为他们没有一个叫爬网的命令。在本例中,它们有一段代码,这是类MininovaSpider和TorrentItem的定义。我不知道这两个类应该去哪里,去同一个文件,这个python文件的名字是什么 与“一目了然”的网页

嗨,我已经在我的mac上安装了Python Scrapy,我试图在他们的web上跟踪v

他们试图运行命令:

scrapy crawl mininova.org -o scraped_data.json -t json

我不太明白这是什么意思?看起来scrapy是一个独立的程序。我认为他们没有一个叫爬网的命令。在本例中,它们有一段代码,这是类MininovaSpider和TorrentItem的定义。我不知道这两个类应该去哪里,去同一个文件,这个python文件的名字是什么

与“一目了然”的网页相比,你可能会更幸运地先浏览一遍

本教程暗示Scrapy实际上是一个单独的程序

运行命令
scrapy startproject tutorial
将创建一个名为
tutorial
的文件夹,其中包含已为您设置的多个文件

例如,在我的例子中,模块/包
管道
设置
爬行器
已添加到根包
教程

tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...
TorrentItem
类将放在
items.py
中,
MininovaSpider
类将放在
Spider
文件夹中

项目设置完成后,Scrapy的命令行参数看起来相当简单。它们的形式如下:

scrapy crawl <website-name> -o <output-file> -t <output-type>

TL;DR:请参阅

首先,建议使用一个带有单独的
.cfg
settings.py
pipelines.py
items.py
spider
包等的普通Scrapy项目来保存和处理您的web抓取逻辑。它提供了模块化、关注点分离,使事情有条理、清晰且可测试

如果您按照创建项目的步骤进行操作,则可以通过一个特殊的
scrapy
命令行工具运行web scraping:

scrapy crawl myspider

但是,
Scrapy
也提供了一个API

应提及几个关键概念:

  • -基本上是一个键值“容器”,用
  • -主类,其作用类似于使用Scrapy刮网所涉及的所有不同组件的胶水
  • Twisted
    reactor
    -由于Scrapy内置于
    Twisted
    异步网络库之上-要启动爬虫程序,我们需要将其放入事件循环中,简单地说就是:
reactor是Twisted中事件循环的核心,该循环使用Twisted驱动应用程序。事件循环是一种编程构造,它等待和 在程序中分派事件或消息。它通过调用一些 内部或外部“事件提供程序”,通常在 事件已到达,然后调用相关的事件处理程序 (“发送事件”)。反应器提供了与反应器的基本接口 服务数量,包括网络通信、线程和 事件调度

以下是从脚本运行Scrapy的基本简化过程:

  • 创建
    设置
    实例(或用于使用现有设置):

  • 使用传入的
    设置
    实例实例化
    爬虫程序

    crawler = Crawler(settings)
    
    crawler.configure()
    crawler.crawl(spider)
    crawler.start()
    
  • 实例化一个spider(这就是它最终的目的,对吧?)

  • 配置信号。如果您想要拥有后处理逻辑,或者至少想要完成爬行,这是一个重要的步骤,因为扭曲的
    反应器需要手动停止。Scrapy docs建议停止处理程序中的
    反应器

请注意,您还必须自己关闭扭曲反应堆 蜘蛛完成后。这可以通过连接 信号处理程序。蜘蛛_关闭信号

  • 使用传入的爬行器配置并启动爬行器实例:

    crawler = Crawler(settings)
    
    crawler.configure()
    crawler.crawl(spider)
    crawler.start()
    
  • 可选启动:

  • 启动反应器-这将阻止脚本执行:

    reactor.run()
    
下面是一个示例自包含脚本,该脚本正在使用并涉及和:

以常规方式运行它:

python runner.py
并在管道的帮助下观察导出到
items.jl
的项目:

{"desc": "", "link": "/", "title": "Top"}
{"link": "/Computers/", "title": "Computers"}
{"link": "/Computers/Programming/", "title": "Programming"}
{"link": "/Computers/Programming/Languages/", "title": "Languages"}
{"link": "/Computers/Programming/Languages/Python/", "title": "Python"}
...
此处提供了要点(请随意改进):


注:

如果您通过实例化
settings()
对象来定义
settings
,您将获得所有默认设置。但是,例如,如果要配置现有管道,或配置
深度限制
或调整任何其他设置,则需要通过在脚本中进行设置(如示例所示):

或者,将现有的
settings.py
与所有预配置的自定义设置一起使用:

from scrapy.utils.project import get_project_settings

settings = get_project_settings()

有关该主题的其他有用链接:


你想做什么?我试图在那里的网站上按照这个例子来抓取minonova的项目。如果你想用它们作为例子,今晚我将一些旧的抓取脚本推送到github:我们可以手动调用管道以这种方式对项目进行后处理吗?非常感谢@alecxe给出这个详细的答案!为了使您的示例代码真正100%独立,并且可以非常容易地用于
Scrapy
学习者,您可以添加一个非常简单的spider示例吗?(例如爬行)@pad添加了关于使用自定义设置(包括配置管道)的说明。谢谢,说得好。@Basj我实际上正在考虑制作一个示例github项目,其中包括一个运行Scrapy的简单脚本。希望这周有时间。谢谢。哦,是的@alecxe这会很好,甚至是一个要点。目标:使用
python mycrawler.py
:)运行爬虫程序所需的最简单和最短代码(自包含文件)
import json

from scrapy.crawler import Crawler
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import Join, MapCompose, TakeFirst
from scrapy import log, signals, Spider, Item, Field
from scrapy.settings import Settings
from twisted.internet import reactor


# define an item class
class DmozItem(Item):
    title = Field()
    link = Field()
    desc = Field()


# define an item loader with input and output processors
class DmozItemLoader(ItemLoader):
    default_input_processor = MapCompose(unicode.strip)
    default_output_processor = TakeFirst()

    desc_out = Join()


# define a pipeline
class JsonWriterPipeline(object):
    def __init__(self):
        self.file = open('items.jl', 'wb')

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item


# define a spider
class DmozSpider(Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        for sel in response.xpath('//ul/li'):
            loader = DmozItemLoader(DmozItem(), selector=sel, response=response)
            loader.add_xpath('title', 'a/text()')
            loader.add_xpath('link', 'a/@href')
            loader.add_xpath('desc', 'text()')
            yield loader.load_item()


# callback fired when the spider is closed
def callback(spider, reason):
    stats = spider.crawler.stats.get_stats()  # collect/log stats?

    # stop the reactor
    reactor.stop()


# instantiate settings and provide a custom configuration
settings = Settings()
settings.set('ITEM_PIPELINES', {
    '__main__.JsonWriterPipeline': 100
})

# instantiate a crawler passing in settings
crawler = Crawler(settings)

# instantiate a spider
spider = DmozSpider()

# configure signals
crawler.signals.connect(callback, signal=signals.spider_closed)

# configure and start the crawler
crawler.configure()
crawler.crawl(spider)
crawler.start()

# start logging
log.start()

# start the reactor (blocks execution)
reactor.run()
python runner.py
{"desc": "", "link": "/", "title": "Top"}
{"link": "/Computers/", "title": "Computers"}
{"link": "/Computers/Programming/", "title": "Programming"}
{"link": "/Computers/Programming/Languages/", "title": "Languages"}
{"link": "/Computers/Programming/Languages/Python/", "title": "Python"}
...
pipelines = {
    'mypackage.pipelines.FilterPipeline': 100,
    'mypackage.pipelines.MySQLPipeline': 200
}
settings.set('ITEM_PIPELINES', pipelines, priority='cmdline')
from scrapy.utils.project import get_project_settings

settings = get_project_settings()