[英]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.