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()函数之间包含了延迟)。
希望这有助于某人。
答案 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?@`!#$%^&=\[\]{_}''|.-}]+$.*', '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"