相談フォーム信頼の「飲んだくれマーク」をご確認下さい。2017年2月26日なんとなく分かってきたのでまとめる。Framework上記リンクに書いてある通り、スクレイピングとクローリングを行うフレームワークで、Pythonで動きます。スクレイピングとクローリングスクレイピングとは、HTMLドキュメントから情報を取得することです。クローリングはHTMLなどのWebコンテンツを収集する処理のことです。スクレイピングとクローリングはごっちゃにされて語られることが多いのですが、厳密に言えばそのような分け方になります。最初にお約束スクレイピングやクロールはWebサーバにすごく負荷をかけるかもしれない処理です。Scrapyのデフォルト設定ではそこまで負荷がかかるような設定にはなっていない筈ですが、リクエストを短期間に送れるだけ送るみたいな処理は慎みましょう。以下の例では当ブログをスクレイピングするようなコードを載せていますが、実際に試すときは自分のブログ等でやってくださいね。scrapy基本scrapyはscrapyのお作法に則ったディレクトリ構成・ソースコードから構成されています。実行するときはscrapyコマンドを利用します。scrapyとタイプするととりあえず使い方が表示されます。シェルを使ってみましょう。['partial']クロールするときは必ず内部でrobots.txtを読み取ってよしなに従ってくれます。後述しますが、robots.txtに書いてあるsitemapがあればそれにしたがってクロールすることも可能です。スクレイピングするためにBeautifulSoupとlxmlを使っています。CSSセレクタかXPathを使うことができます。'投稿ナビゲーション']プロジェクトを作成するさて、大体shellで使い方を覚えたら今度はプロジェクトを作ってみましょう。scrapy.cfgするとこんな感じのプロジェクトが出てきます。ここで、Scrapy独自の要素があるので簡単に説明します。spiderクローラとスクレイパーが合体したような単位。どのようにクロールしてどのようにデータを取り出すかを規定するitems取り出したデータを表すオブジェクト。spiderによって生成される。pipelines取り出したitemオブジェクトを処理していくパイプライン。前処理をやってデータベースに保存して...みたいな。middlewares便利なミドルウェア。URLのフィルタなど。settings設定。データの流れとしては、まずspiderで最初に読み取るURLを指定し、そのspiderがスクレイピングしたitemをpipelineに従って処理していく、みたいなイメージです。SpiderではまずSpiderを定義します。Spiderを作るのもscrapyコマンドから実施します。passという感じになってます。この、parseというメソッドが肝です。parseはresponseを受け取ってそこからデータ(Itemのサブクラス、辞書オブジェクトなど)と次に見るべきURL(Requestオブジェクト)をyieldで返していきます。リンクを総なめしてタイトルとURLを取得するなら以下のような感じですね。url...とあるあたりは、当ブログがhttpとhttpsの両方に対応している関係上、スキームを厳密に指定していない表記をしているためです。Itemをちゃんと定義する先の例ではItemを定義するのが面倒なので辞書オブジェくトを返却しました。Itemを定義してItemを返すならば次のページを参照してください。spiders.などと書かれていますが、んなこと言うんだったらそもそもPythonなんか使わずに静的型付け言語使えや、って感じなんで私個人としてはItemをわざわざ定義するメリットって無いかなという気がします。生成された直後のソースはこんな感じになってます。process_itemでitemを受け取ってデータを整形したりデータベースに保存したりして、また次のパイプラインに渡すためのitemを返却します。itemここは好きなように書いてくださいって感じなので詳しくは省略。DBにぶっこむサンプルなどが書いてありますので見てください。作成したパイプラインをどのように実行させていくかは、settings.pyに以下のように書きます。800,}ここに書いた整数値が小さいものから大きなものに向かって順に実行させていくようになるそうです。Cloudを使うとか、Scrapydというデーモンを使うとかになります。そこまで大規模なことをしないのであれば、cronで叩くとかでも十分な気が。その他Tipsなどフィルタスクレイピングするなら、同じURLは1回だけアクセスしたいとかありますよね。いう処理を実現するのがフィルタです。settings.pyでDUPEFILTER_CLASSを設定すると使用でき、デフォルトは'scrapy.dupefilters.RFPDupeFilter'が設定されるみたいです。こいつはプロセスが終了したらスクレイピングしたページも忘れるような実装になっています。URLが同じだけど内容は毎回更新される、みたいなサイトをスクレイピングするときはこの実装で良いと思いますが、スクレイピングした結果はファイルやDBに保存して二回目以降であっても一回訪れたページはスクレイピングさせたくないということでしたら、これを独自実装する必要があります。passのようにRFPDupeFilterを継承してrequest_seenをオーバーライドします。作ったCustomFilterをDUPEFILTER_CLASSに設定します。xmlのサイトマップを使ってスクレイピング私はこれが使いたくてScrapyを選びました。passこれだけでOKです。すると、robots.txtに書かれたsitemapを読み取ってうまいこと処理してくれます。sitemap.xmlから別のxmlをさらに呼び出していたりとか、gzip圧縮されてたりとか、そういう場合でも全て裏側で対処してくれます。XPathでnamespaceが指定されてるXMLを処理するこのあたりを参照してください。responseこういうのが面倒くさいからXMLって好きじゃないんだよな。RSSフィードからスクレイピングこのあたりを参照してください。XMLFeedSpiderソースコードを見ると分かりますが、大したことはやってません。実際使い始めるとこれじゃ対処できないパターンもたくさん出てくると思うので、このソースを参考にしつつBasicSpiderから構成していった方が良い気がします。Request時に独自の属性や値を設定しておきたいRequestを作るときには分かるんだけど、RequestからRepsponseを作ってからでは分からない、つまりリンク元に記載されてある情報をなんか取得したいみたいな場合は、Requestに何とかして属性を入れ込んでおきます。すると、parseメソッドでresponseを受け取った時、response.requestから辿って取得できます。Requestを継承して追加のパラメータを設定できるようにするなど。まとめScrapyは、scrapyコマンドの使い方とかitem/spider/pipeline/filterあたりの概念を理解するとかで少し戸惑ってしまうかもしれませんが、理解できてしまえばあとは色々応用できそうです。投稿ナビゲーション【質問#101】おウィッシュリスト「SIerはクズだから辞めるわ」では解決にならないanopara作者:withpop昼はサラリーマン。頑張れば何でも出来る。...最近の人気記事2019年の振り返り「エンジニアになってリモートワーク🌟✨」みたいなやつプログラミングスクールについて思うこと【質問#168】35歳システム経験2年。