繁体   English   中英

运行多个Scrapy Spiders(简单方法)Python

[英]Running Multiple Scrapy Spiders (the easy way) Python

Scrapy非常酷,但我发现文档非常简单,一些简单的问题很难回答。 在汇总各种堆栈溢出的各种技术之后,我终于提出了一种简单而不过分技术的方法来运行多个scrapy蜘蛛。 我认为它的技术性不如试图实现scrapyd等:

所以这里有一只蜘蛛可以很好地完成这项工作,它可以在表单请求之后抓取一些数据:

from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from scrapy.http import Request
from scrapy.http import FormRequest
from swim.items import SwimItem

class MySpider(BaseSpider):
    name = "swimspider"
    start_urls = ["swimming website"]

    def parse(self, response):
        return [FormRequest.from_response(response,formname="AForm",
                    formdata={"lowage": "20, "highage": "25"}
                    ,callback=self.parse1,dont_click=True)]

    def parse1(self, response):       
        #open_in_browser(response)
        hxs = Selector(response)
        rows = hxs.xpath(".//tr")
        items = []

        for rows in rows[4:54]:
            item = SwimItem()
            item["names"] = rows.xpath(".//td[2]/text()").extract()
            item["age"] = rows.xpath(".//td[3]/text()").extract()
            item["swimtime"] = rows.xpath(".//td[4]/text()").extract()
            item["team"] = rows.xpath(".//td[6]/text()").extract()
            items.append(item)           
        return items

而不是故意用表格输入写出形式数据,我想要的是“20”和“25:

formdata={"lowage": "20", "highage": "25}

我用的是“自我”。 +变量名称:

formdata={"lowage": self.lowage, "highage": self.highage}

然后,这允许您使用所需的参数从命令行调用spider(请参见下文)。 使用python subprocess call()函数可以轻松地一个接一个地调用这些命令行。 这意味着我可以转到我的命令行,输入“python scrapymanager.py”并让我的所有蜘蛛都做他们的事情,每个蜘蛛都在他们的命令行传递不同的参数,并将他们的数据下载到正确的位置:

#scrapymanager

from random import randint
from time import sleep
from subprocess import call

#free
call(["scrapy crawl swimspider -a lowage='20' -a highage='25' -a sex='W' -a StrkDist='10025' -o free.json -t json"], shell=True)
sleep(randint(15,45))

#breast
call(["scrapy crawl swimspider -a lowage='20' -a highage='25' -a sex='W' -a StrkDist='30025' -o breast.json -t json"], shell=True)
sleep(randint(15,45))

#back
call(["scrapy crawl swimspider -a lowage='20' -a highage='25' -a sex='W' -a StrkDist='20025' -o back.json -t json"], shell=True)
sleep(randint(15,45))

#fly
call(["scrapy crawl swimspider -a lowage='20' -a highage='25' -a sex='W' -a StrkDist='40025' -o fly.json -t json"], shell=True)
sleep(randint(15,45))

因此,而不是花费数小时试图装配一个复杂的单个蜘蛛,连续爬行每个形式(在我的情况下不同的游泳笔画),这是一个非常轻松的方式来“同时”运行许多蜘蛛(我确实包括延迟每个scrapy调用与sleep()函数之间)。

希望这有助于某人。

这是一个简单的方法。 你需要使用scrapy.cfg将此代码保存在同一目录中(我的scrapy版本是1.3.3):

from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess

setting = get_project_settings()
process = CrawlerProcess(setting)

for spider_name in process.spiders.list():
    print ("Running spider %s" % (spider_name))
    process.crawl(spider_name,query="dvh") #query dvh is custom argument used in your scrapy

process.start()

并运行它。 而已!

是的,有一个名为scrapyd的scrapy的优秀伴侣正在做你正在寻找的东西,在许多其他好东西中,你也可以通过它启动蜘蛛,如下所示:

$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2
{"status": "ok", "jobid": "26d1b1a6d6f111e0be5c001e648c57f8"}

您也可以使用-d param=123添加自定义参数

顺便说一句,蜘蛛正在scheduled而没有launched导致scrapyd管理一个队列,其中(可配置)并行运行的蜘蛛最大数量

对于Scrapy的主要原则,你的方法使得程序变得缓慢。 为了使它像往常一样异步,您可以尝试使用CrawlerProcess

from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess

from myproject.spiders import spider1, spider2

1Spider = spider1.1Spider()
2Spider = spider2.2Spider()
process = CrawlerProcess(get_project_settings())
process.crawl(1Spider)
process.crawl(2Spider)
process.start()

如果要查看爬网的完整日志,请在settings.py设置LOG_FILE

LOG_FILE = "logs/mylog.log"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM