У меня есть скребок Scrapy Splash со скриптом Lua. В настоящее время сценарий Lua только инициирует прокрутку страницы для загрузки дополнительных результатов на страницу поиска. Со страницы поиска я перехожу к страницам с подробностями, которые я очищаю. Однако на странице сведений карусель фотографий еще не присутствует в модели DOM, она загружается динамически, когда пользователь щелкает элемент #showphotos
.
После щелчка по этому элементу загружается следующий HTML-код фотокарусели:
<div id="slider">
<div class="slider-inner">
<div class="item active">
<img src="https://www.example.com/images/1.jpg">
</div>
<div class="item">
<img src="https://www.example.com/images/2.jpg">
</div>
</div>
</div>
Итак, я попытался написать сценарий:
click_script = """
function main(splash, args)
btn = splash:select_all('#showphotos')[0]
btn:mouse_click()
assert(splash:wait(0.5))
return {
num = #splash:select_all('#slider div.slider-inner'),
html = splash:html()
}
end
"""
Поскольку я новичок в Splash и Lua, я не знаю, куда добавить этот код или откуда его вызвать.
Я создал страницу с подробными сведениями о тесте, здесь.
Мой текущий код:
myscraper.py
import json
import re
import scrapy
import time
from scrapy_splash import SplashRequest
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
from myresults.items import MyResultItem
class Spider(scrapy.Spider):
name = 'myscraper'
allowed_domains = ['example.com']
start_urls = ['https://www.example.com/results']
def start_requests(self):
# lua script for scroll to bottom while all objects appeared
lua_script = """
function main(splash, args)
local object_count = 0
local url = splash.args.url
splash:go(url)
splash:wait(0.5)
local get_object_count = splash:jsfunc([[
function (){
var objects = document.getElementsByClassName("object-adres");
return objects.length;
}
]])
temp_object_count = get_object_count()
local retry = 3
while object_count ~= temp_object_count do
splash:evaljs('window.scrollTo(0, document.body.scrollHeight);')
splash:wait(0.5)
object_count = temp_object_count
temp_object_count = get_object_count()
end
return splash:html()
end
"""
# yield first splash request with lua script and parse it from parse def
yield SplashRequest(
self.start_urls[0], self.parse,
endpoint='execute',
args={'lua_source': lua_script},
)
def parse(self, response):
# get all properties from first page which was generated with lua script
# get all adreslink from a tag
object_links = response.css('a.adreslink::attr(href)').getall()
for link in object_links:
# send request with each link and parse it from parse_object def
yield scrapy.Request(link, self.parse_object)
def parse_object(self, response):
# create new MyResultItem which will saved to json file
item = MyResultItem()
item['url'] = response.url # get url
yield item
items.py
import scrapy
class RentalItem(scrapy.Item):
id = scrapy.Field()
photos = scrapy.Field()
url = scrapy.Field()
pass