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'