【发布时间】:2019-08-24 21:40:58
【问题描述】:
我正在使用 Scrapy 和 splash 来提取数据。我正在寻找一种方法来跟踪由 javascript 提供支持的分页。 URL 不会改变,无论你在哪个页面,它总是一样的。
<li class="btn-next"><a href="javascript:ctrl.set_pageReload(2)">Next</a></li>
我尝试过使用 lua 脚本和 splash 来点击元素,但这不起作用:
"""function main(splash)
local url = splash.args.url
assert(splash:go(url))
assert(splash:wait(1))
assert(splash:runjs('document.getElementsByClassName("btn-next")[0].click()'))
assert(splash:wait(0.75))
-- return result as a JSON object
return {html = splash:html()}
end """
def parse(self, response):
section = response.css('li.li-result')
for item in section:
yield{
'manufacturer' : item.css('span.brand::text').extract_first(),
'model' : item.css('span.sub-title::text').extract_first(),
'engine_size' : item.css('span.nowrap::text').extract_first(),
'model_type' : item.css('span span.nowrap::text').extract_first(),
'old_price' : item.css('li.li-result p.old-prix span::text').extract_first(),
'price' : item.css('li.li-result p.prix::text').extract_first(),
'consumption' : item.css('li.li-result div.desc::text').extract_first(),
'date' : item.css('p.btn-publication::text').extract_first(),
'fuel_type' : item.css('div.bc-info div.upper::text').extract_first(),
'mileage' : item.css('li.li-result div.bc-info ul div::text')[1].extract(),
'year' : item.css('li.li-result div.bc-info ul div::text')[2].extract(),
'transmission_type' : item.css('li.li-result div.bc-info ul div::text')[3].extract(),
'add_number' : item.css('li.li-result div.bc-info ul div::text')[4].extract(),
}
next_page = response.css('li.btn-next').extract_first() #pagination
if next_page != 0:
print(response)
yield(SplashRequest(next_page, self.parse,
endpoint='execute',
cache_args=['lua_source'],
args={'lua_source': script},
))
甚至有可能以这种方式做到这一点吗?感谢帮助。
【问题讨论】:
-
你能告诉我们是什么网站吗?你可能不需要渲染 JS。
-
@ThePyGuy 原来是我向here提出问题的同一个网站
标签: python scrapy scrapy-splash