以前に実施したscrapy-splashでの応用編となります。
・CentOS7でscrapy-splashを使ってJavaScriptの解析(Scrapy その3)
https://colabmix.co.jp/tech-blog/scrapy-splash3/
今回はJavascriptでクリックをした後のデータを取得します。
Scrapyからのサンプルファイルの取得(事前確認)
今回、ファイルの取得は以下のサイトから行います。
https://colabmix.co.jp/sample/sample2.html
ファイルの中身は以下のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>sample2</title> <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script> <script> $(function() { var num = 2; $("#add").click(function() { num++; $("ul").append('<li class="li">' + num + '</li>'); }); }); </script> </head> <body> <ul class="ul"> <li class="li">1</li> <li class="li">2</li> </ul> <p> <div class="link" id="link"> <a href="javascript:void(0)" class="add" id="add">add</a> </div> </body> </html> |
表示される画面はこちらです。
JavaScriptで「add」のリンクをクリックするとリストの要素と番号が追加されていきます。
Splashを使ったScrapyの実行
Scrapyで値の取得を試してみます。
以下は「items.py」の設定です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # https://doc.scrapy.org/en/latest/topics/items.html import scrapy class SampleCrawlerItem(scrapy.Item): text = scrapy.Field() |
そして、spider本体である「spiders/devcolla.py」の設定です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# -*- coding: utf-8 -*- import scrapy from scrapy_splash import SplashRequest from sample_crawler.items import SampleCrawlerItem class DevcollaSpider(scrapy.Spider): name = 'devcolla' allowed_domains = ['developer-collaboration.com'] start_urls = ['http://developer-collaboration.com/sample/sample2.html'] script = """ function main(splash) splash.private_mode_enabled = false assert(splash:go(splash.args.url)) assert(splash:wait(1)) for i = 1,15,1 do assert(splash:runjs("$('#link > a:first-child').click()")) assert(splash:wait(0.1)) end return splash:html() end """ def start_requests(self): yield scrapy.Request(self.start_urls[0], self.parse) def parse(self, response): yield SplashRequest(response.url, self.parse_result, meta={ 'splash': { 'args': {'lua_source': self.script}, 'endpoint': 'execute', } }) def parse_result(self, response): for quote in response.css('li.li'): item = SampleCrawlerItem() item['text'] = quote.css('li.li::text').extract_first() yield item |
JavaScriptの実行ではLuaScrirptという言語を利用しています。
最初の「script =」の部分でLuaScrirptの定義をしています。
forループで15回ループを回しています。
for文では「初期値, 終了値, 増加量」の書式で記載します。
また、そのforループの中でクリックを行い、0.1秒待ってから次のループ処理に進んでいます。
こちらで、15回クリックを行なった状態で結果の表示をしています。
それでは、こちらを実行して結果を表示してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# scrapy crawl devcolla -o result.csv # cat result.csv text 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
最初に2つ表示されていて15回追加したので、17までリストの値はあります。
結果は無事取得できました。
最近ではRESTfulなWebサービスも増えており、データの取得にJavaScriptを利用する機会も多くなっています。
scrapy-splashではデータの多様な取得が可能になります。
★関連記事
・CentOS環境の python3.6(pyenv環境)で Scrapy を利用してみる(Scrapy その1)
・Scrapyでデータ取得でクローリングで取得したURLから検索する(Scrapy その2)
・CentOS7でscrapy-splashを使ってJavaScriptの解析(Scrapy その3)
・Scrapyでデータの保存をmongodbにして見る(Scrapy その4)
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。