Framework Scrapy - Scrapyd服务器.
我在蜘蛛中获得jobid值有一些问题.
将数据发布到http:// localhost:6800/schedule.json后,响应为
status = ok
jobid = bc2096406b3011e1a2d0005056c00008
Run Code Online (Sandbox Code Playgroud)
但是我需要在进程中使用当前蜘蛛内部的这个jobid.它可用于open {jobid} .log文件或其他动态原因.
class SomeSpider(BaseSpider):
name = "some"
start_urls = ["http://www.example.com/"]
def parse(self, response):
items = []
for val in values:
item = SomeItem()
item['jobid'] = self.jobid # ???!
items.append(item)
return items
Run Code Online (Sandbox Code Playgroud)
但是只有在完成任务后我才会看到这个工作:(谢谢!
我的项目文件夹中有多个蜘蛛,想要一次运行所有的蜘蛛,所以我决定使用scrapyd服务运行它们.我已经开始这样做了
首先,我在当前项目文件夹中
我打开了scrapy.cfg文件,然后取消注释了url行
[部署]
我运行了scrapy server命令,运行良好,并且运行了scrapyd服务器
我试过这个命令 scrapy deploy -l
结果: default http://localhost:6800/
scrapy deploy -L scrapyd我得到了以下输出结果:
Usage
=====
scrapy deploy [options] [ [target] | -l | -L <target> ]
deploy: error: Unknown target: scrapyd
Run Code Online (Sandbox Code Playgroud)
当我尝试使用此命令部署项目时scrapy deploy scrapyd -p default出现以下错误
Usage
=====
scrapy deploy [options] [ [target] | -l | -L <target> ]
deploy: error: Unknown target: scrapyd
Run Code Online (Sandbox Code Playgroud)
我真的无法识别whey scrapyd是否显示上述错误,可以引导我以正确的方式将项目部署到scrapyd
提前致谢..........
编辑代码:
在看到Peter Kirby的答案之后,我在scrapy.cfg中命名了target并在我的项目文件夹中尝试了以下命令,
命令:
scrapy deploy ebsite …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我通过 SSH 连接的虚拟 Ubuntu 16.04 服务器上运行 Scrapyd。当我通过简单地运行来运行scrapy
$ scrapyd
Run Code Online (Sandbox Code Playgroud)
我可以通过访问http://82.165.102.18:6800连接到 Web 界面。
但是,一旦我关闭 SSH 连接,Web 界面就不再可用,因此,我认为我需要以某种方式在后台运行 Scrapyd 作为服务。
经过一番研究,我发现了一些建议的解决方案:
有人知道最好/推荐的解决方案是什么吗?不幸的是,Scrapyd 文档相当单薄且过时。
对于某些背景,我每天需要运行大约 10-15 个蜘蛛。
我正在运行Scrapyd并在同时启动4个蜘蛛时遇到一个奇怪的问题.
2012-02-06 15:27:17+0100 [HTTPChannel,0,127.0.0.1] 127.0.0.1 - - [06/Feb/2012:14:27:16 +0000] "POST /schedule.json HTTP/1.1" 200 62 "-" "python-requests/0.10.1"
2012-02-06 15:27:17+0100 [HTTPChannel,1,127.0.0.1] 127.0.0.1 - - [06/Feb/2012:14:27:16 +0000] "POST /schedule.json HTTP/1.1" 200 62 "-" "python-requests/0.10.1"
2012-02-06 15:27:17+0100 [HTTPChannel,2,127.0.0.1] 127.0.0.1 - - [06/Feb/2012:14:27:16 +0000] "POST /schedule.json HTTP/1.1" 200 62 "-" "python-requests/0.10.1"
2012-02-06 15:27:17+0100 [HTTPChannel,3,127.0.0.1] 127.0.0.1 - - [06/Feb/2012:14:27:16 +0000] "POST /schedule.json HTTP/1.1" 200 62 "-" "python-requests/0.10.1"
2012-02-06 15:27:18+0100 [Launcher] Process started: project='thz' spider='spider_1' job='abb6b62650ce11e19123c8bcc8cc6233' pid=2545
2012-02-06 15:27:19+0100 [Launcher] Process finished: project='thz' spider='spider_1' job='abb6b62650ce11e19123c8bcc8cc6233' pid=2545
2012-02-06 …Run Code Online (Sandbox Code Playgroud) 有人可以指导我如何打开我现有的python项目的一步一步的程序吗?文档一直在提到包中的setup.py,但我在项目中找不到它...
谢谢,
我是scrapy和scrapyd的新手.做了一些阅读并开发了我的抓取工具,它抓取了一个新闻网站,并从中提供了所有新闻文章.如果我只是简单地运行爬虫
scrapy crawl project name -o something.txt
Run Code Online (Sandbox Code Playgroud)
它正确地为我提供了something.txt中的所有抓取数据.
现在我尝试使用scrapyd在localhost:6800上部署我的scrapy crawler项目.
我使用了爬行器
curl http://localhost:6800/schedule.json -d project=tutorial -d spider=dmoz_spider
Run Code Online (Sandbox Code Playgroud)
它在命令行上给了我这个
{"status": "ok", "jobid": "545dfcf092de11e3ad8b0013d43164b8"}
Run Code Online (Sandbox Code Playgroud)
这是我认为是正确的,我甚至能够看到我的cralwer作为localhost:6800的UI视图上的工作
但是我在哪里可以找到我以前在something.txt中收集的爬虫所抓取的数据.
请帮忙....
这是我的抓取代码
class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["timesofindia.com"]
start_urls = ["http://mobiletoi.timesofindia.com/htmldbtoi/TOIPU/20140206/TOIPU_articles__20140206.html"]
def parse(self, response):
sel = Selector(response)
torrent = DmozItem()
items=[]
links = sel.xpath('//div[@class="gapleftm"]/ul[@class="content"]/li')
sel.xpath("//div[@class='gapleftm']/ul[@class='content']/li/b/a/stname/text()").extract()
sel.xpath("//div[@class='gapleftm']/ul[@class='content']/li/b/a/@href").extract()
for ti in sel.xpath("//a[@class='pda']/text()").extract():
yield DmozItem(title=ti)
for url in sel.xpath("//a[@class='pda']/@href").extract():
itemLink = urlparse.urljoin(response.url, url)
yield DmozItem(link=url)
yield Request(itemLink, callback=self.my_parse)
def my_parse(self, response):
sel = Selector(response)
self.log('A response from …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,通过scrapyd安排scrapy抓取工作.项目很好地流向数据库,我可以通过listjobs.json端点来查看作业状态.所以很好,我甚至可以知道作业何时完成.
但是,有时候工作会失败.可能是因为HTTP错误或凭据错误.我想访问已完成的作业状态,最好是来自scrapyd api.就像listjobs.json今天给我的东西一样,我希望得到的结果如下:
{"status": "ok",
"error": [{"id": "78391cc0fcaf11e1b0090800272a6d06", "spider": "spider1"}],
"running": [{"id": "422e608f9f28cef127b3d5ef93fe9399", "spider": "spider2", "start_time": "2012-09-12 10:14:03.594664"}],
"finished": [{"id": "2f16646cfcaf11e1b0090800272a6d06", "spider": "spider3", "start_time": "2012-09-12 10:14:03.594664", "end_time": "2012-09-12 10:24:03.594664"}]}
Run Code Online (Sandbox Code Playgroud)
当然,我可以让作业自己更新一些数据库或文件,我可以从应用程序检查,但我想知道是否有更清洁的方式.
我刚刚在virtualenv中安装了scrapyd-client(1.1.0),并成功运行命令'scrapyd-deploy',但是当我运行'scrapyd-client'时,终端说:找不到命令:scrapyd-client.
根据自述文件(https://github.com/scrapy/scrapyd-client),应该有一个'scrapyd-client'命令.
我检查了路径'/lib/python2.7/site-packages/scrapyd-client',只检查了文件夹中的'scrapyd-deploy'.
命令'scrapyd-client'暂时被删除了吗?
我想知道如何忽略不填充所有字段的项目,某种丢弃,因为在scrapyd的输出中我得到的页面没有填满所有字段.
我有那个代码:
class Product(scrapy.Item):
source_url = scrapy.Field(
output_processor = TakeFirst()
)
name = scrapy.Field(
input_processor = MapCompose(remove_entities),
output_processor = TakeFirst()
)
initial_price = scrapy.Field(
input_processor = MapCompose(remove_entities, clear_price),
output_processor = TakeFirst()
)
main_image_url = scrapy.Field(
output_processor = TakeFirst()
)
Run Code Online (Sandbox Code Playgroud)
分析器:
def parse_page(self, response):
try:
l = ItemLoader(item=Product(), response=response)
l.add_value('source_url', response.url)
l.add_css('name', 'h1.title-product::text')
l.add_css('main_image_url', 'div.pics a img.zoom::attr(src)')
l.add_css('initial_price', 'ul.precos li.preco_normal::text')
l.add_css('initial_price', 'ul.promocao li.preco_promocao::text')
return l.load_item()
except Exception as e:
print self.log("#1 ERRO: %s" % e), response.url
Run Code Online (Sandbox Code Playgroud)
我想用Loader做它而不需要用我自己的Selector创建(避免两次处理项目).我想我可以将它们放到管道中,但可能不是最好的方法,因为这些项目无效.
我正在提出一个新问题,因为我在 Django 应用程序中遇到了 Scrapy 和 Channels 的问题,如果有人能够指导我正确的方向,我将不胜感激。
我使用通道的原因是因为我想从 Scrapyd API 实时检索抓取状态,而不必一直使用 setIntervals,因为这应该成为一个 SaaS 服务,可能会被许多人使用用户。
如果我运行的话,我已经正确实现了通道:
python manage.py runserver
Run Code Online (Sandbox Code Playgroud)
我可以正确地看到系统现在正在使用 ASGI:
System check identified no issues (0 silenced).
September 01, 2020 - 15:12:33
Django version 3.0.7, using settings 'seotoolkit.settings'
Starting ASGI/Channels version 2.4.0 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Run Code Online (Sandbox Code Playgroud)
此外,客户端和服务器通过 WebSocket 正确连接:
WebSocket HANDSHAKING /crawler/22/ [127.0.0.1:50264]
connected {'type': 'websocket.connect'}
WebSocket CONNECT /crawler/22/ [127.0.0.1:50264]
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,当我通过 Scrapyd-API 运行 scrapy 时出现问题
2020-09-01 15:31:25 [scrapy.core.scraper] ERROR: Error processing {'url': 'https://www.example.com'}
raceback (most …Run Code Online (Sandbox Code Playgroud)