Python 非常基本的例子
嗨,我已经在我的mac上安装了Python Scrapy,我试图在他们的web上跟踪v 他们试图运行命令: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文件的名字是什么 与“一目了然”的网页
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
-由于Scrapy内置于reactor
异步网络库之上-要启动爬虫程序,我们需要将其放入事件循环中,简单地说就是:Twisted
- 创建
实例(或用于使用现有设置):设置
- 使用传入的
实例实例化设置
:爬虫程序
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()
有关该主题的其他有用链接:
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()