B.M*_*.W. 20 python scrapy web-scraping
嗨我在我的Mac上安装了Python Scrapy,我试图在他们的网站上关注第一个例子.
他们试图运行命令:
scrapy crawl mininova.org -o scraped_data.json -t json
Run Code Online (Sandbox Code Playgroud)
我不太明白这是什么意思?看起来scrapy原来是一个单独的程序.而且我认为他们没有一个名为crawl的命令.在示例中,它们有一段代码,它是MininovaSpider类和TorrentItem的定义.我不知道这两个类应该去哪里,转到同一个文件,这个python文件的名称是什么?
ale*_*cxe 53
TL; DR:请参阅运行scrapy的自包含最小示例脚本.
首先,有一个正常的Scrapy项目,独立.cfg,settings.py,pipelines.py,items.py,spiders包等是保持和处理您的网页抓取逻辑推荐的方式.它提供了模块化,关注点分离,使事物井井有条,清晰可测.
如果您正在遵循官方的Scrapy教程来创建项目,那么您将通过特殊的scrapy命令行工具运行Web抓取:
scrapy crawl myspider
Run Code Online (Sandbox Code Playgroud)
但是,Scrapy还提供了一个用于从脚本运行爬网的API.
应该提到几个关键概念:
Settingsclass - 基本上是一个键值"容器",用默认的内置值初始化Crawlerclass - 主要类,对于使用Scrapy进行Web抓取所涉及的所有不同组件,它们都像胶水一样reactor- 因为Scrapy内置在twisted异步网络库之上- 为了启动一个爬虫,我们需要把它放在Twisted Reactor中,简单来说就是一个事件循环:反应堆是Twisted中事件循环的核心 - 循环使用Twisted驱动应用程序.事件循环是一种编程构造,它等待和分派程序中的事件或消息.它的工作原理是调用一些内部或外部"事件提供程序",它通常会阻塞直到事件到达,然后调用相关的事件处理程序("调度事件").该反应器为许多服务提供基本接口,包括网络通信,线程和事件分派.
以下是从脚本运行Scrapy的基本简化过程:
创建一个Settings实例(或用于get_project_settings()使用现有设置):
settings = Settings() # or settings = get_project_settings()
Run Code Online (Sandbox Code Playgroud)实例Crawler与settings实例中传递:
crawler = Crawler(settings)
Run Code Online (Sandbox Code Playgroud)实例化一只蜘蛛(这就是它最终的意义,对吧?):
spider = MySpider()
Run Code Online (Sandbox Code Playgroud)配置信号.如果你想拥有一个后处理逻辑,收集统计数据,或者至少要完成爬行,这是一个重要的步骤,因为reactor需要手动停止扭曲.Scrapy docs建议reactor在spider_closed信号处理程序中停止:
请注意,在蜘蛛完成后您还必须自己关闭Twisted reactor.这可以通过将处理程序连接到signals.spider_closed信号来实现.
def callback(spider, reason):
stats = spider.crawler.stats.get_stats()
# stats here is a dictionary of crawling stats that you usually see on the console
# here we need to stop the reactor
reactor.stop()
crawler.signals.connect(callback, signal=signals.spider_closed)
Run Code Online (Sandbox Code Playgroud)
使用传入的蜘蛛配置和启动爬网程序实例:
crawler.configure()
crawler.crawl(spider)
crawler.start()
Run Code Online (Sandbox Code Playgroud)可选择开始记录:
log.start()
Run Code Online (Sandbox Code Playgroud)启动反应堆 - 这将阻止脚本执行:
reactor.run()
Run Code Online (Sandbox Code Playgroud)下面是一个使用DmozSpiderspider的自包含脚本示例,它包含带有输入和输出处理器以及项目管道的项目加载器:
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()
Run Code Online (Sandbox Code Playgroud)
以通常的方式运行它:
python runner.py
Run Code Online (Sandbox Code Playgroud)
并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"}
...
Run Code Online (Sandbox Code Playgroud)
这里有Gist(随意改进):
笔记:
如果settings通过实例化Settings()对象来定义- 您将获得所有默认的Scrapy设置.但是,如果您想要,例如,配置现有管道,或配置DEPTH_LIMIT或调整任何其他设置,您需要在脚本中设置它settings.set()(如示例中所示):
pipelines = {
'mypackage.pipelines.FilterPipeline': 100,
'mypackage.pipelines.MySQLPipeline': 200
}
settings.set('ITEM_PIPELINES', pipelines, priority='cmdline')
Run Code Online (Sandbox Code Playgroud)
或者,使用现有的settings.py预先配置的所有自定义设置:
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
Run Code Online (Sandbox Code Playgroud)
有关该主题的其他有用链接:
Mic*_*x2a 24
你可能有更好的运气,首先查看教程,而不是"一瞥Scrapy"网页.
该教程暗示Scrapy实际上是一个单独的程序.
运行该命令scrapy startproject tutorial将创建一个名为tutorial几个已为您设置的文件的文件夹.
例如,在我的情况下,所述模块/包items,pipelines,settings和spiders已被添加到根包tutorial.
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
Run Code Online (Sandbox Code Playgroud)
该TorrentItem班将被放在里面items.py,而MininovaSpider类会去里面spiders的文件夹.
设置项目后,Scrapy的命令行参数看起来相当简单.他们采取以下形式:
scrapy crawl <website-name> -o <output-file> -t <output-type>
Run Code Online (Sandbox Code Playgroud)
或者,如果要在没有创建项目目录的情况下运行scrapy,可以使用runspider命令:
scrapy runspider my_spider.py
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21298 次 |
| 最近记录: |