簡體   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