Script splash da lua para fazer vários cliques e visitas
Estou tentando rastejarResultados da pesquisa do Google Scholar e obtenha todo o formato BiBTeX de cada resultado correspondente à pesquisa. No momento, tenho um rastreador Scrapy no Splash. Eu tenho um script lua que clicará no link "Citar" e carregará a janela modal antes de obter ohref
do formato BibTeX da citação. Mas, como existem vários resultados de pesquisa e, portanto, vários links "Citar", preciso clicar em todos eles e carregar as páginas individuais do BibTeX.
Aqui está o que eu tenho:
import scrapy
from scrapy_splash import SplashRequest
class CiteSpider(scrapy.Spider):
name = "cite"
allowed_domains = ["scholar.google.com", "scholar.google.ae"]
start_urls = [
'https://scholar.google.ae/scholar?q="thermodynamics"&hl=en'
]
script = """
function main(splash)
local url = splash.args.url
assert(splash:go(url))
assert(splash:wait(0.5))
splash:runjs('document.querySelectorAll("a.gs_nph[aria-controls=gs_cit]")[0].click()')
splash:wait(3)
local href = splash:evaljs('document.querySelectorAll(".gs_citi")[0].href')
assert(splash:go(href))
return {
html = splash:html(),
png = splash:png(),
href=href,
}
end
"""
def parse(self, response):
yield SplashRequest(self.start_urls[0], self.parse_bib,
endpoint="execute",
args={"lua_source": self.script})
def parse_bib(self, response):
filename = response.url.split("/")[-2] + '.html'
with open(filename, 'wb') as f:
f.write(response.css("body > pre::text").extract()[0])
Estou pensando em passar o índice do link "Citar" para o script lua quando executar oquerySelectorAll
chamar, mas não consigo encontrar uma maneira de passar outra variável para a função. Também suponho que vou ter que fazer algum javascript sujohistory.back()
para retornar à página de resultados original depois de obter o BibTeX, mas sinto que há uma maneira mais elegante de lidar com isso.