6

Google Scholar の検索結果をクロールして、検索に一致する各結果のすべての BiBTeX 形式を取得しようとしています。現在、Splash を備えた Scrapy クローラーを使用しています。href引用のBibTeX形式を取得する前に、「引用」リンクをクリックしてモーダルウィンドウをロードするluaスクリプトがあります。しかし、複数の検索結果と複数の「引用」リンクがあることを確認すると、それらすべてをクリックして、個々の BibTeX ページをロードする必要があります。

ここに私が持っているものがあります:

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])

呼び出しを実行するときに「Cite」リンクのインデックスを lua スクリプトに渡す必要があると考えていquerySelectorAllますが、関数に別の変数を渡す方法が見つからないようです。history.back()また、BibTeX を取得した後、元の結果ページに戻るには、汚い JavaScript を実行する必要があると思いますが、これを処理するよりエレガントな方法があると思います。

4

1 に答える 1