通过引用列表从PHP/Delphi调用scrapy

通过引用列表从PHP/Delphi调用scrapy,php,python,scrapy,Php,Python,Scrapy,我正在构建一个“刮擦蜘蛛”,它可以检查在线网店中是否有某些产品的库存 我们的想法是从PHP/Delphi代码中调用这个spider,传递一个产品列表(3500个参考)。然后,爬行器返回另一个包含股票信息的列表 这是我的蜘蛛: import scrapy from scrapy.crawler import CrawlerProcess class Spider(scrapy.Spider): name = "Spider" start_urls = ['https://www

我正在构建一个“刮擦蜘蛛”,它可以检查在线网店中是否有某些产品的库存

我们的想法是从PHP/Delphi代码中调用这个spider,传递一个产品列表(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())
所以。。。正确的方法是什么?我知道您可以使用以下方法将参数传递给spider:

def __init__(self, product=None, *args, **kwargs):
        super(Spider, self).__init__(*args, **kwargs)
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'])
我知道您可以使用CrawlerProcess从另一个python脚本执行spider。另外,我知道您可以使用以下方法从PHP调用python脚本:

<?php 

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

?>

但我不知道如何合并所有这些方法


提前感谢。

您必须使用一些数据存储来传输数据。
因此,在其他编程语言中,您可以将数据保存在某个文件或数据库中,例如csv或json,然后通过命令参数将文件名传递给scrapy spider。最后,在spider中,您可以迭代文件内容以生成请求

例如,如果我们有这个json:

{ "items": [
    { "url": "http://example1.com" },
    { "url": "http://example2.com" } 
]}
我们将使用类似于:

def __init__(self, product=None, *args, **kwargs):
        super(Spider, self).__init__(*args, **kwargs)
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'])

谢谢你的回答。我喜欢这个主意。我还有一个问题,也许你知道答案:)谢谢!