Inf*_*oll 11 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
Run Code Online (Sandbox Code Playgroud)
而不是刻意写出表格输入我想要的表格输入,即"20"和"25:
formdata={"lowage": "20", "highage": "25}
Run Code Online (Sandbox Code Playgroud)
我用的是"自我".+变量名称:
formdata={"lowage": self.lowage, "highage": self.highage}
Run Code Online (Sandbox Code Playgroud)
然后,这允许您使用所需的参数从命令行调用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))
Run Code Online (Sandbox Code Playgroud)
因此,而不是花费数小时试图装配一个复杂的单个蜘蛛,连续爬行每个形式(在我的情况下不同的游泳笔画),这是一个非常轻松的方式来"同时"运行许多蜘蛛(我确实包括延迟每个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()
Run Code Online (Sandbox Code Playgroud)
并运行它。就是这样!
是的,有一个名为 scrapyd 的 scrapy 优秀伴侣,它正在做您正在寻找的事情,除了许多其他好处之外,您还可以通过它启动蜘蛛,如下所示:
$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2
{"status": "ok", "jobid": "26d1b1a6d6f111e0be5c001e648c57f8"}
Run Code Online (Sandbox Code Playgroud)
您也可以使用添加自定义参数-d param=123
顺便说一句,蜘蛛正在运行scheduled,而不是launched导致 scrapyd 管理一个具有(可配置)并行运行蜘蛛最大数量的队列