13

Scrapy 非常酷,但是我发现文档非常简单,一些简单的问题很难回答。在将各种 stackoverflow 中的各种技术组合在一起后,我终于想出了一种简单且不太技术化的方法来运行多个 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}

然后,这允许您使用所需的参数从命令行调用蜘蛛(见下文)。使用 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))

因此,与其花费数小时尝试安装一个复杂的单蜘蛛,它可以连续爬行每种形式(在我的情况下是不同的游泳泳姿),这是一种“一次”运行许多蜘蛛的非常轻松的方式(我确实包括了延迟在使用 sleep() 函数的每个scrapy调用之间)。

希望这可以帮助某人。

4

3 回答 3

5

这是简单的方法。您需要将此代码保存在与 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()

并运行它。而已!

于 2017-05-12T15:47:25.303 回答
3

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

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

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

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

于 2014-01-25T02:52:04.727 回答
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"
于 2017-03-22T03:17:16.470 回答