Я понимаю, что этот вопрос может показаться конкретным 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. Что мне здесь не хватает?
Буду признателен за любые предложения.