Ich versuche, Google Scholar search results zu kriechen und erhalten alle BiBTeX-Format jedes Ergebnis mit der Suche übereinstimmen. Im Moment habe ich einen Scrapy Crawler mit Splash. Ich habe ein Lua-Skript, das auf den Link "Cite" klickt und das modale Fenster lädt, bevor das href
des BibTeX-Formats des Zitats abgerufen wird. Da jedoch mehrere Suchergebnisse und somit mehrere "Cite" -Links vorhanden sind, muss ich auf alle klicken und die einzelnen BibTeX-Seiten laden.Splash Lua-Skript, um mehrere Klicks und Besuche zu tun
Hier ist, was ich habe:
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])
Ich denke, ich sollte den Index der „Cité“ Link in das Lua Script übergeben, wenn ich den querySelectorAll
Anruf durchführen, aber ich kann nicht scheinen zu finden, Möglichkeit, eine andere Variable an die Funktion zu übergeben. Auch ich nehme an, dass ich etwas schmutziges Javascript history.back()
tun muss, um zurück zu der ursprünglichen Resultatseite zurückzukommen, nachdem ich das BibTeX besorgte, aber ich fühle, dass es eine elegantere Weise gibt, damit umzugehen.
FYI: Sie können "n" -Argument in 'SplashRequest (..., args = {" lua_source ": script," n ": n})' übergeben und dann von einem Skript als 'splash.args 'darauf zugreifen .n'. Auf diese Weise wird die Formatierung von Zeichenfolgen nicht benötigt. String Formatierung hat mehrere Nachteile - es ist mehr Code, Sie müssen Werte als gültige Lua (n/a für Integer-Variablen) zu entkommen, und es spielt nicht gut mit Caching (Splash kann Skripte cachen, so dass es keine Notwendigkeit gibt um bei jeder Anfrage ein Skript zu senden). –