Я создаю скрапа-паука, который проверяет, есть ли запасы некоторых продуктов в онлайн-магазине.
Идея состоит в том, чтобы вызвать этого паука из кода PHP / Delphi, передав список продуктов (3500 ссылок). Затем паук возвращает другой список с информацией об акциях.
Это мой паук:
import scrapy
from scrapy.crawler import CrawlerProcessclass 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. Кроме того, я знаю, что вы можете вызвать скрипт Python из PHP, используя:
<?php
$command = escapeshellcmd('/home/myscript.py');
$output = shell_exec($command);
echo $output;
?>
Но я не знаю, как объединить все эти методы …
Заранее спасибо.
Вы должны использовать некоторое хранилище данных для передачи ваших данных.
Так в вашем Другой языком программирования вы сохраняете данные, которые у вас есть, в каком-то файле или базе данных, например CSV или JSON, а затем вы передаете имя файла своему пауку Scrapy через аргумент команды. Наконец, в вашем пауке вы можете перебирать содержимое файла для генерации запросов.
Например, если у нас есть этот 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'])
Других решений пока нет …