てっとり早くスクレイピングしたかってん
この記事で書くこと
どんなことが問題になったか?
簡単に問題になったことを紹介する。
- スクレイピング結果が文字化けしてるんやけど
- requestパッケージの設定を少しいじると解決
- beautifulsoupでxpath検索できないんやけど
- lxmlでxpath検索
- lxmlでうまくテキスト取得できないんやけど
- Beautifulsoupでdom解析
最速でスクレイピングしたいんや
次の条件を満たしてるなら、けっこう簡単にできる
- スクレイピング対象は認証不要のページ
- HTML構造が定型化してる
- 取得対象のデータがJavascriptで取得・・・みたいな感じではない
- 取得対象のURL一覧がすでにわかってる
次の手順で最速スクレイピングを目指す
- Google Chromeのdeveloper consoleを開く。
- 目的の情報の上で右クリック -> inspectをしてもOK。むしろ、こちらの方が早い
- 対象Domのxpathをコピーする
- Pythonスクリプトを書く
ちなみにPythonスクリプトでの構成はこんな感じ
- HTML取得
- request
- HTML解析
- lxmlとBeautifulsoup
- 解析結果の保存と中断&再開管理
- Sqlite3とSqlalchemy
スクレイピング結果が文字化けしてるんやけど
Qiitaの記事に解決策があった。こうする。
rはrequest.get()の結果オブジェクト
1 |
r.encoding = r.apparent_encoding |
これで、だいたいのケースで文字化けは直る。
(まれに文字化けが直らないケースもあるが、頻度は低い)
Beautifulsoupでxpath検索できないんやけど
そもそもBeautifulsoupはxpath検索できない。Stackoverflowでそう回答されてる。
そこで、lxmlを使う。
1 2 |
root_dom = html.fromstring(html_doc) target_dom = root_dom.xpath('ここにxpathをコピペ') |
lxmlでうまくテキスト取得できないんやけど
lxmlでxpathでアクセスした後に、Domを表示する。
DomをBeautifulsoupに解析されてテキストを得る。
1 2 3 |
from lxml import etree target_dom_soup = BeautifulSoup(etree.tostring(target_dom[0]).decode('utf-8'), "html.parser") target_text = target_dom_soup.text |
おしまい!
ディスカッション
コメント一覧
まだ、コメントがありません