【发布时间】:2015-10-15 13:21:47
【问题描述】:
我需要使用 Scrapy(http://example.com/itemview) 从网站上抓取每个项目的数据。我有一个 itemID 列表,我需要在 example.com 中以表格形式传递它。 每个项目都没有 url 更改。因此,对于我的蜘蛛中的每个请求,url 总是相同的。但内容会有所不同。
我不想使用 for 循环来处理每个请求。所以我按照下面提到的步骤。
- 使用上述网址启动蜘蛛
- 添加了 item_scraped 和 spider_close 信号
- 通过了几个函数
- 将抓取的数据传递到管道
- 触发了 item_scraped 信号
之后它会自动调用 spider_close 信号。但我希望继续执行上述步骤,直到完成整个 itemID。
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
itemIDs = [11111,22222,33333]
current_item_num = 0
def __init__(self, itemids=None, *args, **kwargs):
super(ExampleSpider, self).__init__(*args, **kwargs)
dispatcher.connect(self.item_scraped, signals.item_scraped)
dispatcher.connect(self.spider_closed, signals.spider_closed)
def spider_closed(self, spider):
self.driver.quit()
def start_requests(self):
request = self.make_requests_from_url('http://example.com/itemview')
yield request
def parse(self,response):
self.driver = webdriver.PhantomJS()
self.driver.get(response.url)
first_data = self.driver.find_element_by_xpath('//div[@id="itemview"]').text.strip()
yield Request(response.url,meta={'first_data':first_data},callback=self.processDetails,dont_filter=True)
def processDetails(self,response):
itemID = self.itemIDs[self.current_item_num]
..form submission with the current itemID goes here...
...the content of the page is updated with the given itemID...
yield Request(response.url,meta={'first_data':response.meta['first_data']},callback=self.processData,dont_filter=True)
def processData(self,response):
...some more scraping goes here...
item = ExamplecrawlerItem()
item['first_data'] = response.meta['first_data']
yield item
def item_scraped(self,item,response,spider):
self.current_item_num += 1
#i need to call the processDetails function here for the next itemID
#and the process needs to contine till the itemID finishes
self.parse(response)
我的管道:
class ExampleDBPipeline(object):
def process_item(self, item, spider):
MYCOLLECTION.insert(dict(item))
return
【问题讨论】:
标签: python-2.7 phantomjs scrapy-spider