Я пытаюсь использовать scrapy и spla sh для извлечения персонала, названий должностей и электронных писем со страницы персонала определенного веб-сайта. https://www.kennedaleisd.net/Page/3884. Я использую spla sh с docker, поскольку электронные письма скрыты за кодом Dynami c javascript.
Паук работает на первой странице персонала, но я не могу заставить его работать на 2-й или 3-й странице. Я открыл инструменты разработчика и скопировал запрос, который отправляется, когда вы нажимаете одну из ссылок на страницы, а затем пытаетесь повторить этот запрос в пауке. Кажется, у меня проблема в том, что ответ на этот запрос возвращает только подмножество кода для всей страницы (только персонал для этой страницы), а не все как в javascript. Поэтому, когда он передается в spla sh, он не имеет необходимого сценария для создания динамического c кода. Я также заметил, что запрос, по-видимому, имеет запись повара ie RedirectTo, которая возвращается на родительскую страницу. Я пытался включить этого повара ie в запросы или передавать файлы cookie из первого запроса на страницы, разбитые на страницы, но, похоже, это не сработало. Я также попытался выполнить некоторые сценарии lua в запросе spla sh, но, похоже, это также не дало мне того, чего я хотел. Ниже я включил паука, как он есть сейчас.
Я не уверен, есть ли какой-нибудь способ повторно использовать javascript с последующими запросами или для пользователя, который каким-либо образом повторно вызывает команду cook ie, чтобы получить остальную часть необходимого кода. Любая помощь будет оценена. Я понимаю, что разбиение на страницы, вероятно, не является правильным способом для l oop просмотра страниц, но я решил, что смогу поработать над этим, как только получу считанные данные.
import scrapy
from scrapy_splash import SplashRequest
class TestSpider(scrapy.Spider):
name = 'TestSpider'
start_urls = ['https://www.kennedaleisd.net/Page/3884']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, self.parse, meta={
'splash': {
'endpoint': 'render.html',
'args': {'wait': 0.5}
}
})
def parse(self, response):
for item in response.css('div.staff'):
name = item.css('li.staffname::text').get()
title = item.css('li.staffjob::attr(data-value)').get()
email = item.css('li.staffemail a::attr(href)').get()
staffURL = response.request.url
yield {
'name': name,
'title': title,
'email': email,
'staffURL': staffURL
}
if response.css('a.ui-page-number-current-span::text').get() == '1':
pagination_results = response.css(
'li.ui-page-number a:not([class^="ui-page-number-current-span"])::text').getall()
base_url = 'https://www.kennedaleisd.net//cms/UserControls/ModuleView/ModuleViewRendererWrapper.aspx?DomainID=2042&PageID=3884&ModuleInstanceID=6755&PageModuleInstanceID=7911&Tag=&PageNumber='
# backend_url = '&RenderLoc=0&FromRenderLoc=0&IsMoreExpandedView=false&EnableQuirksMode=0&Filter=&ScreenWidth=922&ViewID=00000000-0000-0000-0000-000000000000&_=1584114139549'
for i in pagination_results:
next_page = base_url + str(i) # + backend_url
yield response.follow(next_page, callback=self.parse, meta={
'splash': {
'endpoint': 'render.html',
'args': {'wait': 3}
}
})