Published Date : 2019年4月14日20:44
ありました。
pip install Scrapy
conda install -c conda-forge scrapy
mkdir Scrapy_Crawl
cd Scrapy_Crawl
scrapy startproject morningblog
1期(初代) | 中澤裕子 | 安倍なつみ | 飯田圭織 | 石黒彩 | 福田明日香 |
---|---|---|---|---|---|
2期 | 矢口真里 | 保田圭 | 市井紗耶香 | ||
3期 | 後藤真希 | ||||
4期 | 吉澤ひとみ | 石川梨華 | 辻希美 | 加護亜依 | |
5期 | 高橋愛 | 小川麻琴 | 新垣里沙 | 紺野あさ美 | |
6期 | 藤本美貴 | 道重さゆみ | 田中れいな | 亀井絵里 | |
7期 | 久住小春 | ||||
8期 | ジュンジュン | リンリン | 光井愛佳 | ||
9期 | 譜久村聖 | 生田衣梨奈 | 鞘師里保 | 鈴木香音 | |
10期 | 飯窪春菜 | 佐藤優樹 | 石田亜佑美 | 工藤遥 | |
11期 | 小田さくら | ||||
12期 | 牧野真莉愛 | 野中美希 | 羽賀朱音 | 尾形春水 | |
13期 | 横山玲奈 | 加賀楓 | |||
14期 | 森戸知沙希 |
cd morningblog scrapy genspider getblog 某ブログさいと.jp
Created spider 'getblog' using template 'basic' in module: morningblog.spiders.getblog
# -*- coding: utf-8 -*- import scrapy class GetblogSpider(scrapy.Spider): name = 'getblog' allowed_domains = ['某ブログサイト.jp'] start_urls = [ 'http://某ブログサイト.jp/morningmusume-9ki/', 'http://某ブログサイト.jp/morningmusume-10ki/', 'http://某ブログサイト.jp/mm-12ki/', 'http://某ブログサイト.jp/morningm-13ki/' ] def parse(self, response): print(response.url)
scrapy list 成功すると、実行ファイルの名前が返される。 -> getblog
scrapy crawl getblog
[scrapy.core.engine] DEBUG: Crawled (200) <GET https://某ブログサイト.jp/morningmusume-9ki/> (referer: https://某ブログサイト.jp/morningmusume-9ki/) [scrapy.core.scraper] DEBUG: Scraped from <200 https://某ブログサイト.jp/morningmusume-9ki/> https://某ブログサイト.jp/morningmusume-9ki/ <-- ここがprint()部分。
author = scrapy.Field() title = scrapy.Field() date = scrapy.Field() article = scrapy.Field()
# クラスファイルからインスタンスオブジェクトを作成。 item = MorningblogItem() # 辞書のキーを指定するみたいにデータを入れる。 item['author'] = response.xpath('//a/text()').get() # yield文は今までの処理を一旦中断して、 # 値を関数の外へ返す。 # 値を返した後、また次の行から処理を繰り返す。 # 簡単にいうとメモリの節約。 yield item
print(item) # 疑似的にitemを表現してみる。 -> {'author':'記事を書いた人。'}ということで、一旦 このクラスファイルを 保存して閉じる。
# morningblogの中にある、 # items.pyから、 # MorningblogItemクラスファイルを呼び込む。 from morningblog.items import MorningblogItem
def parse(self, response): # クラスからオブジェクトを作成 item=MorningblogItem() # 作者の名前が書いてあるHTML要素までのXPATHから、テキスト情報を抜き出す。 item["author"]=response.xpath('//dl[@class="skin-entryThemes"]/dd/a/text()').get() # タイトルが書いてあるHTML要素までのXPATHから、テキスト情報を抜き出す。 item["title"]=response.xpath('//article/@data-unique-entry-title').get() # 記事作成日が書いてあるHTML要素までのXPATHから、テキスト情報を抜き出す。 item["date"]=response.xpath('//time[@class="skin-textQuiet"]/@datetime').get() # 記事要の本文が書いてあるHTML要素までのXPATHから、テキスト情報を抜き出す。 text_list=response.xpath('//div[@class="skin-entryBody"]//text()') # 不要な改行や文字を取り除いて、 # 'article'のキーに、記事のリストを格納する。 item['article']=[text.get().strip() for text in text_list if text.get()!='\n' and text.get()!='\xa0'] # 一つの記事情報が入っているitemをyieldで返す。 yield item
# 次へボタンがあるHTML要素までのXPATHから、aタグ要素を取得。 next_page_top=response.xpath('//a[@class="skin-pagingNext skin-btnPaging ga-pagingTopNextTop"]') # 次へボタンが存在している場合。 # つまり、次のページがあるなら、以下の処理をする。 if next_page_top: # response.urljoinでベースとなるURLと、 # aタグのhrefから取ってきたURLをくっつける。 next_page_url=response.urljoin(next_page_top.xpath('@href').get()) # scrapy.Requestを使って、 # 次のページのURLへ飛ぶ。 # callbackにparseメソッド自身を指定して、 # グルグルとループさせるように記事を取り出していく。 # dont_filterは、scrapyが # 同じURLに対してクロールを行わないようにする為のフィルター。 # Trueにすると、フィルターを行わないようにできる。 yield scrapy.Request(next_page_url,callback=self.parse,dont_filter=True)
以下のコメントアウトを外します。 ROBOTSTXT_OBEY = TURE robots.txtに従う。 robots.txtとは取られたくない情報を クロールされないように制限するファイルです。 これがあるにも関わらず、 無理やりクロールしようとするのを避けるためにTrueにします。
以下のコメントアウトを外します。 DOWNLOAD_DELAY = 3 ページの情報をダウンロードしたあとに、 3秒間待つようにする設定。 サーバーへの負担を軽くするために、 2〜3秒は待機時間を設けるのがマナーとされている。
以下のコメントアウトを外します。 HTTPCACHE_ENABLED = True キャッシュ機能を有効にする。 キャッシュは前回行った作業を記録するような機能。 次回から同じことする時、作業が速くなる。 こちらはデフォルトで書いていないので、 新たに加える。 FEED_EXPORT_ENCODING='utf-8' これが無いと、取ってきたデータの 日本語が上手く反映されない。
scrapy list 正常にことが進めば以下が表示される。 -> getblog
scrapy crawl getblog -o morningblog.json crawl はクロールを開始させるという意味。 次に実行ファイル名を指定する。-> getblog -o は 結果をoutputさせるというオプション。 morningblog.jsonという名前のJSONファイルでoutputする。
2019-04-14 13:35:20 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://某ブログサイト.jp/mm-12ki/page-3051.html> (referer: https://某ブログサイト.jp/mm-12ki/page-3050.html) 2019-04-14 13:35:20 [scrapy.core.scraper] DEBUG: Scraped from <200 https://某ブログサイト.jp/mm-12ki/page-3051.html> {'article': ['こんばんおやきー', '今日はBuono!さんの日本武道館ライブを見に行かせていただきました', 'Buono!さんのパフォーマンスは、', '去年の冬ハローでしか見たことがなかったので……', 'たくさんの曲を生で見れたことがすごく嬉しかったです', 'ロックでかっこいい曲', 'バラード系なゆっくりな曲', '元気でかわいい曲', '色んなBuono!さんを見ることが出来て', 'ほんとにテンションあがりっぱなしでした!', 'いつも、武道館公演を客席から見ていると', '会場全体の一体感って、本当にすごいなぁって思うんです!!', 'ステージから見ててもそう感じるけど、', '客席から見ていても、熱気が伝わってくるコンサート…', 'ほんっとにステキだなぁと思いました', 'そしてすごく楽しかったです', '3時間がすごく早く感じました…', 'またBuono!さんのライブ、見たいですっ', .................................................... .................................................... 省略。 'author': '羽賀朱音', 'date': '2016-08-25', 'title': 'Buono!さんだみょーん。羽賀朱音'}
ここを一つだけにするとかで対応可能。 start_urls = [ 'http://某ブログサイト.jp/morningmusume-9ki/', 'http://某ブログサイト.jp/morningmusume-10ki/', 'http://某ブログサイト.jp/mm-12ki/', 'http://某ブログサイト.jp/morningm-13ki/' ] 例えばこう。 start_urls = [ 'http://某ブログサイト.jp/morningmusume-9ki/' ]
# -*- coding: utf-8 -*- import scrapy from morningblog.items import MorningblogItem class GetblogSpider(scrapy.Spider): name = 'getblog' allowed_domains = ['某ブログサイト.jp'] start_urls = [ 'http://某ブログサイト.jp/morningmusume-9ki/', 'http://某ブログサイト.jp/morningmusume-10ki/', 'http://某ブログサイト.jp/mm-12ki/', 'http://某ブログサイト.jp/morningm-13ki/' ] def parse(self, response): item=MorningblogItem() item["author"]=response.xpath('//dl[@class="skin-entryThemes"]/dd/a/text()').get() item["title"]=response.xpath('//article/@data-unique-entry-title').get() item["date"]=response.xpath('//time[@class="skin-textQuiet"]/@datetime').get() text_list=response.xpath('//div[@class="skin-entryBody"]//text()') item['article']=[text.get().strip() for text in text_list if text.get()!='\n' and text.get()!='\xa0'] yield item next_page_top=response.xpath('//a[@class="skin-pagingNext skin-btnPaging ga-pagingTopNextTop"]') if next_page_top: next_page_url=response.urljoin(next_page_top.xpath('@href').get()) yield scrapy.Request(next_page_url,callback=self.parse,dont_filter=True)
import scrapy class MorningblogItem(scrapy.Item): author = scrapy.Field() title = scrapy.Field() date = scrapy.Field() article = scrapy.Field()
ROBOTSTXT_OBEY = True DOWNLOAD_DELAY = 3 HTTPCACHE_ENABLED = True FEED_EXPORT_ENCODING='utf-8'