2017-02-22 54 views
0

我正在構建一個scrapy蜘蛛,用於檢查網上商店中是否有某些產品的庫存。從PHP/Delphi調用scrapy參考​​列表

這個想法是從PHP/Delphi代碼中調用這個蜘蛛,傳遞一個產品列表(3500個參考文獻)。然後,蜘蛛會返回另一個包含股票信息的列表。

這是我的蜘蛛:

import scrapy 
from scrapy.crawler import CrawlerProcess 


class Spider(scrapy.Spider): 
    name = "Spider" 
    start_urls = ['https://www.url.net/Administration/Account/Login'] 

    def parse(self, response): 
     return scrapy.FormRequest.from_response(
      response, 
      formdata={'UserName': 'username', 'Password': 'password'}, 
      callback=self.after_login 
     ) 

    def after_login(self, response): 
     yield scrapy.Request(url="https://www.url.net/Home/Home/ShowPriceDetail?articleNo=" + REFERENCE, callback=self.parse_stock) 

    def parse_stock(self, response): 
     print("STOCK" + response.selector.xpath('//*[@id="priceDetails"]/form/div[8]/div[1]/span/span[2]/text()').extract_first()) 
     print("Date" + response.selector.xpath('//*[@id="priceDetails"]/form/div[8]/div[1]/span/span[1]/i/@style').extract_first()) 

所以...什麼是這樣做的正確方法?我知道,你可以傳遞參數使用類似蜘蛛:

def __init__(self, product=None, *args, **kwargs): 
     super(Spider, self).__init__(*args, **kwargs) 

而且我知道,你可以從另一個Python腳本CrawlerProcess執行蜘蛛。另外,我知道,你可以使用從PHP調用一個python腳本:

<?php 

$command = escapeshellcmd('/home/myscript.py'); 
$output = shell_exec($command); 
echo $output; 

?> 

但我不知道如何合併所有這些方法...提前

感謝。

回答

1

您必須使用一些數據存儲來傳輸數據。
因此,在您的其他編程語言中,您可以將您擁有的數據保存在某個文件或數據庫中,例如csv或json,然後通過命令參數將文件名傳遞給scrapy spider。最後在你的蜘蛛中,你可以迭代文件內容來生成請求。

例如,如果我們有這樣的json:

{ "items": [ 
    { "url": "http://example1.com" }, 
    { "url": "http://example2.com" } 
]} 

我們會使用這樣的:

class MySpider(scrapy.Spider): 
    name = 'myspider' 

    def __init__(self, *args, **kwargs): 
     super(self, *args, **kwargs) 
     self.filename = kwargs.get('filename', None) 

    def start_requests(self): 
     if not self.filename: 
      raise NotImplementedError('missing argument filename') 
     with open(self.filename, 'r') as f: 
      data = json.loads(f.read()) 
     for item in data['items']: 
      yield Request(item['url']) 
+0

謝謝您的回答Granitosaurus。我喜歡這個主意。我有另一個問題,也許你知道答案:) http://stackoverflow.com/questions/42416020/scrapy-performance 謝謝! –