Scrapy довольно круто, однако я нашел документацию очень голыми костями, и некоторые простые вопросы были трудными ответить. После того, как я собрал различные методы из разных stackoverflows, я, наконец, придумал простой и не слишком технический способ запуска нескольких пауков-спайдеров. Я бы предположил, что он менее техничен, чем пытается реализовать scrapyd и т.д.:
Итак, вот один паук, который хорошо работает при выполнении одной работы по очистке некоторых данных после formrequest:
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
Вместо того, чтобы преднамеренно выписывать formdata с входами формы, которые я хотел, т.е. "20" и "25:
formdata={"lowage": "20", "highage": "25}
Я использовал "я". + имя переменной:
formdata={"lowage": self.lowage, "highage": self.highage}
Это позволяет вам вызывать паука из командной строки с необходимыми аргументами (см. ниже). Используйте функцию подпроцесса python() для вызова этих очень командных строк один за другим, легко. Это означает, что я могу перейти в свою командную строку, введите "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()).
Надеюсь, это поможет кому-то.