Я недавно пытался интегрировать скрапбукинг, чтобы сделать некоторую чистку для моей веб-страницы и сравнить результаты с содержимым моей базы данных. В настоящее время я знакомлюсь с основами scrapy и, поскольку целевые URL имеют файлы javascript для интерпретации, я также установил сервер spla sh.
Использование моего кода с командой scrapy crawl <spidername>
работает как Ожидается: я получаю весь DOM для страницы. Но так как я хочу вызвать паука из задач сельдерея, а также использовать конвейер scrapy для обновления моей модели, я хочу выполнить код из сценария следующим образом:
runner = CrawlerProcess()
runner.crawl(emdoku_spider)
runner.start(stop_after_crawl=True)
Пока он просто находится в одиночном скрипте для целей тестирования и пишет DOM только в текстовом файле для меня, чтобы проверить результат. (Конечно, я мог бы начать новый процесс с python, сохранить результаты и затем обработать эти файлы, но я хотел бы иметь чистое решение). Выполнение кода, показанного в приведенном ниже коде, из IDE (spyder) не работает. Ответ - это просто заголовок, тело и имя javascript файлов, которые нужно открыть.
Весь скрипт выглядит следующим образом и следует коду из учебников по scrapy (используя SplashRequest):
import scrapy
from scrapy import Request, Spider
from scrapy.spiders import CrawlSpider, Rule
from scrapy.crawler import CrawlerProcess
import scrapy_splash
from scrapy_splash import SplashRequest
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from twisted.internet import reactor
from urllib.parse import urlencode
class emdoku_spider(Spider):
name=<spider name>
def start_requests(self):
urls = self.generate_start_urls(<head url>)
for url in urls:
yield SplashRequest(url, self.parse,
args={
'wait': 5,
'html': 1,
},
endpoint='render.html', # optional; default is render.html
magic_response=True,
dont_process_response=True,
dont_send_headers=True,
)
def generate_start_urls(self, base_url):
urls = []
for i in range(2):
if i > 0: #page 0 is just a strange test page
urls.append("".join([base_url, str(i)]))
return urls
def parse(self, response):
f = open(<file destnination>, 'w')
f.write(str(response.css('body').getall()))
f.close()
pass
runner = CrawlerProcess()
runner.crawl(emdoku_spider)
runner.start(stop_after_crawl=True)