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

时间:2014-01-25 00:47:09

标签: python scrapy scrapyd

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}

我用过#34; self。" +变量名称:

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))

因此,不是花费数小时试图装备一个连续爬行每个形状的复杂单个蜘蛛(在我的情况下是不同的游泳行程),这是一个非常轻松的方式来运行许多蜘蛛"一下子# 34; (我确实在每个scrapy调用与sleep()函数之间包含了延迟)。

希望这有助于某人。

3 个答案:

答案 0 :(得分:3)

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

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

您也可以使用-d param=123

添加自定义参数

btw,蜘蛛正在scheduled而不是launched导致scrapyd管理一个队列,其中(可配置)并行运行的蜘蛛最多数量

答案 1 :(得分:3)

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

<xsl:when test="regexp:test($2q, '.*^[a-z0-9A-Z\s?@`!#$%^&amp;=\[\]{_}'&apos;|.-}]+$.*', 'gi')">

然后运行它。就是这样!

答案 2 :(得分:1)

你的方法使它成为程序性的,这使得它对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()

如果您想查看抓取的完整日志,请在LOG_FILE中设置settings.py

LOG_FILE = "logs/mylog.log"