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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

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

Scrapy

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

Q&A

0回答

460閲覧

ScrapyでRedirecting (301) を回避し、jsonファイルを作成したい

Koz1

総合スコア10

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

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

Scrapy

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

0グッド

0クリップ

投稿2018/08/04 20:06

###やりたいこと
ScrapyでWebスクレイピングをして、jsonファイルを作りたい。
現在「PythonとJavaScriptではじめるデータビジュアライゼーション」で学習しています。jsonファイルを作ろうとすると、失敗してしまいます。原因は「Redirecting (301)」だと思うのですが、どのように処理すればいいのか分かりません。

###ディレクトリ構成

nobel_winners scrapy.cfg data /nobel_winners: __init__.py items.py pipelines.py spiders __pycache__ middlewares.py settings.py /nobel_winners/spiders: __init__.py __pycache__ nwinners_list_spider.py

###作業工程/コード
/nobel_winners/spiders にある nwinners_list_spider.py の中に以下のコードを入力。

Python

1#encoding:utf-8 2 3import scrapy, re 4BASE_URL = 'http://en.wikipedia.org' 5 6class NWinnerItem(scrapy.Item): 7 name = scrapy.Field() 8 link = scrapy.Field() 9 year = scrapy.Field() 10 category = scrapy.Field() 11 country = scrapy.Field() 12 gender = scrapy.Field() 13 born_in = scrapy.Field() 14 date_of_birth = scrapy.Field() 15 date_of_death = scrapy.Field() 16 place_of_birth = scrapy.Field() 17 place_of_death = scrapy.Field() 18 text = scrapy.Field() 19 20class NWinnerSpider(scrapy.Spider): 21 name = 'nwinners_full' 22 allowed_domains = ['en.wikipedia.org'] 23 start_urls = ["https://en.wikipedia.org/wiki/List_of_Nobel_laureates_by_country"] 24 25 def parse(self, response): 26 filename = response.url.split('/')[-1] 27 28 h2s = response.xpath('//h2') 29 h2s = h2s[3:] 30 31 for h2 in list(h2s)[:2]: 32 country = h2.xpath('span[@class="mw-headline"]/text()').extract() 33 if country: 34 winners = h2.xpath('following-sibling::ol[1]') 35 for w in winners.xpath('li'): 36 wdata = process_winner_li(w, country[0]) 37 request = scrapy.Request( 38 wdata['link'],callback = self.parse_bio,dont_filter = True) 39 request.meta['item'] = NWinnerItem(**wdata) 40 yield request 41 42 def parse_bio(self, response): 43 44 item = response.meta['item'] 45 href = response.xpath("//li[@id='t-wikibase']/a/@href").extract() 46 if href: 47 request = scrapy.Request(href[0],callback = self.parse_wikidata,dont_filter = True) 48 request.meta['item'] = item 49 yield request 50 51 def parse_wikidata(self, response): 52 item = response.meta['item'] 53 property_codes = [ 54 {'name':'date_of_birth','code':'P569'}, 55 {'name':'date_of_death','code':'P570'}, 56 {'name':'place_of_birth','code':'P19','link':True}, 57 {'name':'place_of_death','code':'P20','link':True}, 58 {'name':'gender','code':'P21','link':True} 59 ] 60 61 p_template = '//*[@id="{code}"]/div[2]/div/div/div[2]/div[1]/div/div[2]/div[2]{link_html}/text()' 62 63 for prop in property_codes: 64 65 link_html = '' 66 if prop.get('link'): 67 link_html = '/a' 68 sel = response.xpath(p_template.format(code=prop['code'], link_html=link_html)) 69 if sel: 70 item[prop['name']] = sel[0].extract() 71 72 yield item 73 74def process_winner_li(w, country=None): 75 76 wdata = {} 77 78 wdata['link'] = BASE_URL + w.xpath('a/@href').extract()[0] 79 80 text = ''.join(w.xpath('descendant-or-self::text()').extract()) 81 82 wdata['name'] = text.split(',')[0].strip() 83 84 year = re.findall('\d{4}', text) 85 if year: 86 wdata['year'] = int(year[0]) 87 else: 88 wdata['year'] = 0 89 print('おっと、年無し in ', text) 90 91 category = re.findall('Physics|Chemistry|Physiology or Medicine|Literature|Peace|Economics', text) 92 if category: 93 wdata['category'] = category[0] 94 else: 95 wdata['category'] = '' 96 print('おっと、カテゴリー無し in ', text) 97 98 if country: 99 if text.find('*') != -1: 100 wdata['country'] = '' 101 wdata['born_in'] = country 102 else: 103 wdata['country'] = country 104 wdata['born_in'] = '' 105 106 wdata['text'] = text 107 return wdata 108

rootディレクトリで以下のコードを入力。

scrapy crawl nwinners_full -o data/nwinners_full.json

###エラー
以下のような表示が出て、jsonファイルには何もデータが入らない。

2018-08-05 04:37:35 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://en.wikipedia.org/wiki/List_of_Nobel_laureates_by_country> (referer: None) ['cached'] 2018-08-05 04:37:35 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://en.wikipedia.org/wiki/C%C3%A9sar_Milstein> from <GET http://en.wikipedia.org/wiki/C%C3%A9sar_Milstein>

###試したこと/考えたこと
1.関数が問題かと考えて、ひとつひとつの関数の動きを確かめた。ひとつひとつの関数自体は問題なく動作した。

2.Redirecting (301) が原因かと考えて調べ、settings.pyを変更しようとは試みた。しかし、どのような処理を具体的にすればいいか、分からなかった。

すみませんが、どうぞよろしくお願いいたします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問