#author("2018-11-29T14:50:41+09:00","","")
#author("2018-12-13T15:55:27+09:00","","")
[[小野田]]
bs4の便利なリンク
https://qiita.com/itkr/items/513318a9b5b92bd56185

**基本事項 [#v096f46e]
スクレイピング・クローリングをする前に
[[html,css>https://liginc.co.jp/web/html-css/html/122500]],[[HTTPリクエスト・レスポンス>https://itsakura.com/network-http-get-post]], [[正規表現>http://www.mnet.ne.jp/~nakama/]]の基礎知識が必要なので
ない人は事前に習得しておく必要がある(各用語のリンクレベルの知識で一応OK)

**Unix環境でのスクレイピング [#r384be49]
スクレイピングをやるときに必要なUnixの文字列・ファイル操作系コマンドを示す.

スクレイピングを兎に角やりたい人は後半の具体的な手順へ


***基本の基本 [#nb6e49a6]

unix cat,grep,cut,sed,awkと正規表現で出来る

・ページをダウンロードできる

 wget URL

・ページを出力(ダウンロードではない)

 curl URL

・コマンドをtxtに吐き出す


 (any command) > file.txt

・複数のコマンドをつなげるパイプ

 cat file.txt | grep apple

*ちなみに上はcatでファイルを出力して,その結果からappleという単語をgrepで検索している

1.sed

 sed s/置換ルール/置換文字/
 sed s/dog/cat/
 dog ➡︎ cat

https://msdn.microsoft.com/ja-jp/library/Cc392020.aspx

・抽出要素の行数を出力

 wc -l 

・巨大なデータファイルを分割

head tillコマンドを使う
 head tailコマンドの後に>>filenameでfilenameに出力結果書き込み

・ファイルマージ
a,bに共通な行を抜きだす

 cat a b | sort | uniq -d > common

・textディレクトリ下のwikiと名のファイルをwiki.txtにマージ

 $ find text/ | grep wiki | awk '{system("cat "$0" >> wiki.txt")}'


・aにだけ含まれる行を抜き出す

 cat a b | sort | unit > all
 cat a all | sort | uniq -u > only_in_a

・バイナリ文字列を含むファイルをutf-8でそろえる
 
 nkf -w --overwrite wiki_wakati.txt

・2つのファイルを連結
 
 cat file_a file_b > merge.txt

http://masa-cbl.hatenadiary.jp/entry/20121202/1354456802

***大まかな手順 [#h7aa199a]

・fetch webページのデータ取得

・scrape htmlから正規表現で書籍のデータを抜き取る

・save sqlite等のデータベース保存

***Pythonでやる場合 [#j7e43002]

フレームワーク

・scrapy

htmlパーサー

・BeautifulSoup4

httpライブラリ

・requests	urlにアクセス可

・lxml		urlアクセスライブラリと併用?

・urllib系		今はrequestsが主流?

ヘッドレスブラウザ

プログラムを用いてブラウザ操りたいときに使おう!seleniumとセットで使おう

phantomjs		jsで記述 dom,node.js対応		js組み込みサイトのスクレイピングに有用

ghost		pythonで記述	詳細不明


*具体的な手順 [#gbb2e441]

***必要モジュールのインストール [#b5ab8091]
 pip install beautifulsoup4 (beautifulsoupだけだと旧バージョンになるので注意)
 pip install lxml
 pip install requests

javascriptが入ったページをスクレイピングしたい場合はPhantomJsとseleniumuの組み合わせが必要 
javascriptが入ったページをスクレイピングしたい場合はHeadlessChromeとseleniumuの組み合わせが必要 

基本的なことは[[こちら>http://gci.t.u-tokyo.ac.jp/tutorial/crawling/]]
を見ればわかる

ちなみに上サイトは非効率なやり方で行っているので本格運用する場合は
[[この本>http://gihyo.jp/book/2017/978-4-7741-8367-1]]
もしくは[[この本>https://www.shoeisha.co.jp/book/detail/9784798149127]]

を読むことをオススメする

ちなみにBeautifulSoup4を使う場合内部で使うParserをlxmlに設定すると高速に解析できる

**高速化したい場合 [#r77de9f8]

まずどこでオーバーヘッドが発生しているかで以下の対策が取れる

上のものほどソフトウェア的であり, 下に行くほどハードウェアの問題となる


やり方は各言語によって違うので各々調べるべし
例: JavaであるとThreadクラスを使う, Pythonならthreadingモジュールとmultiproccessingモジュールがある

***IOバウンド [#gfd26a8f]

データをwebから収集するレスポンスが遅い場合は非同期処理により待ち時間を有意義に使うことができる
詳しくは[[こちら>https://vaaaaaanquish.hatenablog.com/entry/2017/06/25/202924)]]

***書き方の問題 [#a854d24e]

Pythonだとfor文の代わりにリスト内包記法を使うなどプログラムの記述によって
処理速度が多少変わる

***言語の問題 [#tf837d5c]

#ref(julia_benchmark.jpeg,,50%);

プログラミング言語により速度が変わるので
-高速化重視ならC(難易度高)
-機能重視ならPython
-バランスならGo


***CPUバウンドの場合 [#y0f4d96c]

プログラム内部の処理を高速化したい場合はマルチスレッド・マルチプロセスに対応させる必要があるマルチスレッドは一つのコアで複数の処理を同時に行うことで
マルチプロセスは複数のコアで並列にプログラムを処理させることである
例えば8コアのCPUの場合で2マルチスレッド, 8マルチプロセスだと
2(プロセスあたりのスレッド数)× 8(コア数) = 16となり
16個並列にプログラムが動いてることになる

***スペックの問題 [#da9ff437]

単純にPCのスペックが低い可能性がある.
指導教員に相談しよう

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS