Разбор и запуск команд из командного файла в интерактивную оболочку - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь запустить оболочку Scrapy из командного файла, и до сих пор работает инициализация командного файла и интерактивной оболочки. затем я хотел бы иметь возможность анализировать команды в консоли scrapy (командные строки после shelp () ).

мой код:

call C:/Users/<user_name>/Anaconda3/Scripts/activate.bat 
scrapy shell <url>

< printing log stats >

2020-03-09 13:38:33 [asyncio] DEBUG: Using selector: SelectSelector
In [1]:  

# that's where it stops and the command below is what I want to be run

from scrapy.http import FormRequest

Как мне сделать, чтобы он проанализировал и выполнил последнюю команду из командного файла?

1 Ответ

0 голосов
/ 18 марта 2020

Я понимаю, что этот вопрос может показаться конкретным c пользователям scrapy, но найденный ответ должен быть применим к аналогичному случаю, использующему другую интерактивную оболочку, поэтому я и опубликую его здесь.

Решение - обвязка. Я создал один командный файл, который нужно запустить, и один текстовый файл с командами, которые нужно передать в интерактивную оболочку scrapy.

Вот код .bat-файла:

  call C:/Users/<user_name>/Anaconda3/Scripts/activate.bat

  type commands_urls.txt | scrapy shell <fetched_url>

Все просто, верно?

Затем в текстовом файле я сохраняю все команды, такие как загрузка пакетов, выборка URL, сохранение данных из ответа в CSV.

ОДНАКО, это приводит к другому проблема; Выполнение по списку ajax запросов с использованием scrapy работает нормально, но не сохраняет результаты, как предполагается (передача тех же команд в отдельную оболочку (исходный сценарий) работает нормально.

I ' Приведу пример:

import json
import pandas as pd
from bs4 import BeautifulSoup
import time

ajax_URL = <the_ajax_URL>

def preparePayload(number):
    """
    Parameters that will be parsed into the request.
    """
    payload = {
        "search_params[paged]" : number,
        "action" : "search_results",    
    }
    return payload

urls = []
#an exemplary range, the actual number of requests is different
for i in range(1,5):

  print("\nCurrent page number: "+str(i))
  time.sleep(5)
  req = FormRequest(ajax_URL, formdata=preparePayload(str(i)), dont_filter=True)
  fetch(req)

  jsonresponse = json.loads(response.body_as_unicode())

  result = jsonresponse['data']
  soup = BeautifulSoup(result, "html.parser")
  items = soup.select("div[class='item-content']")
  if(len(items)==0):
      print("\n\nEnd of results!\n\n")
      break

  for item in items:
      urls.append(item.select_one("a")['href'])
      print(item.select_one("a")['href'])

urls_df = pd.DataFrame()
urls_df['url'] = urls
urls_df.to_csv("test1.csv",  mode='a', header=False, index=False)

При вставке команд в оболочку scrapy вышеприведенное работает на 100%. Извлечение данных с помощью scrapy для одного запроса также должно работать, однако при анализе в пакетном файле , он просматривает запросы, находит нужные данные, но затем сохраняется только последняя итерация за пределами l oop.

Я попытался выполнить синтаксический анализ данных как в виде ряда, так и списка, оба были неудачными.

Я не смог найти подобную проблему с пакетными файлами на SO. Что мне здесь не хватает?

Буду признателен за любые предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...