質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

Q&A

解決済

1回答

574閲覧

scrapyの仕組みがいまいちわかってないので確認&質問

ari1235

総合スコア11

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

0グッド

1クリップ

投稿2018/08/19 07:32

編集2018/08/19 07:49

前提・実現したいこと

pythonのscrapyを使ったクローリングを勉強したくて下記のサイトを参考にチュートリアルを行いました。
しかし、pythonの基本文法も怪しいレベルでいじったため、動くんだけどドユコト?ってなってしまいました。そこでコードの理解が正しいか確認&わからないことの質問をさせてください。
python超初心者がスクレイピングしてみる
Python, Scrapyの使い方(Webクローリング、スクレイピング)

該当のソースコード(自分の解釈をコメントアウトで書いています)

spider

# -*- coding: utf-8 -*- import scrapy from tutorial.items import TutorialItem # この2文によってscrapyのフレームワークと、他の名前空間?(items.py)にある定義をこのファイルでも使えるようにする class QuotesSpider(scrapy.Spider): name = 'quotes' # ここよくわかりません。このnameどこで使ってます? allowed_domains = ['quotes.toscrape.com'] start_urls = ['http://quotes.toscrape.com/page/1/'] # allowed_domeinsでダウンロードするドメインの指定。念のため的な?start_urlsはダウンロードするページ def parse(self, response): # perseという関数の役割がよくわかりません。引数がself??これはページのurlでしょうか?responseはダウンロードしたページの情報が入っているという解釈で良いですか?? for quote in response.css('div.quote'): # response.css()でページの中でもさらに情報を絞ってそれをquoteにlistとして入れてる item = TutorialItem() # itemという空のlistを定義? item['author'] = quote.css('small.author::text').extract_first() item['text'] = quote.css('span.text::text').extract_first() item['tags'] = quote.css('div.tags a.tag::text').extract_first() # cssセレクターによって欲しい情報を入手! yield item # itemを返す # for文でこの動作を繰り返し、ページ上のquoteを全て取得 next_page = response.css('li.next a::attr(href)').extract_first() # ここで次ページのurl(/page/ページ数/)を取得 if next_page is not None: # 次ページが存在しない(最終ページ)の時は処理をやめるための文 next_page = response.urljoin(next_page) # urljoinによってresponseの中の情報のurlと今取得した次ページのurlを合体させてる?? yield scrapy.Request(next_page, callback=self.parse) # scrapy.Requestはどういう関数?ですか?また引数にnext_pageとcallback=self.perseここの引数、上のperseという関数にまた渡してる感じなんでしょうが、いまいちよくわかりません。

item.py

# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # https://doc.scrapy.org/en/latest/topics/items.html import scrapy class TutorialItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() text = scrapy.Field() author = scrapy.Field() tags = scrapy.Field() #ここでスクレイピングで使う変数の定義をしてる

補足情報(FW/ツールのバージョンなど)

python3.5.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

だいたい合ってます。分からないとこだけ。
Request objects

name = 'quotes' #スパイダーの名前。クロールするときに名前を必ず指定します。nameが無いと動きませんので重要です。スパイダーを複数作っておいて名前を指定して動かすスパイダーを決めたり出来ます。 $ scrapy crawl quotes #コマンド+名前でスパイダーを動かします。 def parse(self, response): #responseはこの場合、要求した1ページ分って解釈で大丈夫です。parse=解析ですから、送られてきた1ページ分のresponseの中から抜き出したい情報を決めるために定義している関数です。 for quote in response.css('div.quote'): item = TutorialItem() #空のリストではなくitem.pyで定義したTutorialItem()を入れてます。空のリストを定義する理屈と一緒です。抜き出してきたアイテムを入れたいので器を別のitem.pyから持ってきたイメージでしょうか #空のリストの場合はitem = [] item['author'] = quote.css('small.author::text').extract_first() item['text'] = quote.css('span.text::text').extract_first() item['tags'] = quote.css('div.tags a.tag::text').extract_first() yield item next_page = response.css('li.next a::attr(href)').extract_first() if next_page is not None: next_page = response.urljoin(next_page) yield scrapy.Request(next_page, callback=self.parse) # スscrapy.Requestはスパイダーを起動時に呼び出されます。もう一ページクロールしたいのでもう一回呼び出す必要があるわけです。引数は次のページで同じルールで抽出したいのでself.parseをコールバックしています。 次のページで違うルールで抽出したい場合は、違う関数を書いてcallbackに渡してあげる事で違った動きをします。

投稿2018/08/19 09:13

grilled_python

総合スコア237

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ari1235

2018/08/19 12:06

なるほど!とてもわかりやすく書いていただきありがとうございます!! 次のページは違うルールで抽出とかもできるんですね!勉強になりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問