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

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

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

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

647閲覧

スクレイピングのコードにおいて、Swift2からSwift4に対応させる方法

ottilab

総合スコア10

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/02/25 02:55

編集2019/02/25 03:30

前提・実現したいこと

お世話になります。

ログインが必要なページでのWebスクレイピングは、Swift4ではどのように実現すれば良いのでしょうか?(例えば、ヤフーのホームページにログインし、ログイン後の情報を取得する方法)

ちなみに、ログインの必要のないページは、Kannaというフレームワークを使ってスクレイピングする事ができています。

どなたかわかる方がいましたら、ご教授いただけないでしょうか?
よろしくお願いいたします。

試したこと

以前同じような質問をした方がいたので、この回答を参考に試しました。
https://teratail.com/questions/35792

しかしながら、この回答は恐らくswift2を前提に回答されていたので、
swiift4で実行するとエラーが出てしまいます。

Xcodeの自動修正機能を使っても修正仕切れない部分があります。

以前の回答(swift2前提)

swift2

1/** クッキーを取得 これだけでWebViewのCookieの取得が可能です*/ 2 let storage = HTTPCookieStorage.shared 3 4 /** クッキーのURL 例えば  http://www.yahoo.co.jp/など  */ 5 let domain = NSURL(string: "スクレイピングしてくるURL") 6 7 // 取得先のURL 8 let scrapingURL = NSURL(string: "該当のページURL") 9 10 // Request 11 let request = NSMutableURLRequest(url: scrapingURL! as URL) 12 13 // Cookieをセットして実際にスクレイピングする 14 if let cookie = storage.cookies(for: domain! as URL){ 15 let header = HTTPCookie.requestHeaderFields(with: cookie) 16 request.allHTTPHeaderFields = header 17 var data = NSURLConnection.sendSynchronousRequest(request, returningResponse:nil, error:nil) 18 }

Xcodeで自動修正後

swift4

1 /** クッキーを取得 これだけでWebViewのCookieの取得が可能です*/ 2 let storage = HTTPCookieStorage.shared 3 4 /** クッキーのURL 例えば  http://www.yahoo.co.jp/など  */ 5 let domain = NSURL(string: "スクレイピングしてくるURL") 6 7 // 取得先のURL 8 let scrapingURL = NSURL(string: "該当のページURL") 9 10 // Request 11 let request = NSMutableURLRequest(url: scrapingURL! as URL) 12 13 // Cookieをセットして実際にスクレイピングする 14 if let cookie = storage.cookies(for: domain! as URL){ 15 let header = HTTPCookie.requestHeaderFields(with: cookie) 16 request.allHTTPHeaderFields = header 17 var data = NSURLConnection.sendSynchronousRequest(request, returningResponse:nil, error:nil) 18 }

よろしくお願いします。

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

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

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

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

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

fuzzball

2019/02/25 03:47 編集

>>修正仕切れない部分 どのように修正しきれないのでしょうか? また、スクレイピングがどうこうではなく、Swift2→Swift4の変換に関する質問でしたら、そのようにタイトルを修正して下さい。
ottilab

2019/02/25 03:22

ご指摘ありがとうございます。タイトルは修正いたします。 また、上記に記載したXcodeで自動修正後のコードにおいて、 var data = NSURLConnection.sendSynchronousRequest(request, returningResponse:nil, error:nil) の部分でエラーが出ています。
guest

回答1

0

引数やエラー処理が変わっているので、そのエラー自体は、

swift

1NSURLConnection.sendSynchronousRequest(request, returning:nil)

で直りますが、NSURLConnection.sendSynchronousRequest(_:returning:)はdeperecated(非推奨)になっているので、URLSession.dataTask(with:completionHandler:)を使った方法に書き換えて下さい。

投稿2019/02/25 04:09

fuzzball

総合スコア16731

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

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

ottilab

2019/02/25 06:45 編集

ありがとうござます。 URLSession.dataTask(with:completionHandler:)を使った方法でエラーが消えました。 実際にスクレイピングを試みるために以下のように修正しました。 ```swift /** クッキーを取得 これだけでWebViewのCookieの取得が可能です*/ let storage = HTTPCookieStorage.shared /** クッキーのURL 例えば  http://www.yahoo.co.jp/など  */ let domain = NSURL(string: "http://www.yahoo.co.jp/") // 取得先のURL let scrapingURL = NSURL(string: "http://www.yahoo.co.jp/") // Request var request = URLRequest(url: scrapingURL! as URL) // Cookieをセットして実際にスクレイピングする if let cookie = storage.cookies(for: domain! as URL){ let header = HTTPCookie.requestHeaderFields(with: cookie) request.allHTTPHeaderFields = header let task = URLSession.shared.dataTask(with: request) { (data, response, error) in guard let data = data else { return } do { let object = try JSONSerialization.jsonObject(with: data, options: []) print(object) } catch let e { print(e) } } task.resume() ``` しかしながら、下記のエラーが出ています。 Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.} ヤフーなどのページにログインをしてログイン後の情報を取得することは、この方法ではできないということでしょうか?
fuzzball

2019/02/25 06:57

ログインせずにログイン後の情報を取得したいということでしょうか?
ottilab

2019/02/25 09:49

はい。ログインせずにログイン後の情報を取得したいと考えています。 (例えば、ヤフーのページでしたらログイン後の情報としてTポイントを確認するなど。)
fuzzball

2019/02/25 10:00

そんなこと出来るわけないでしょうに。
ottilab

2019/02/25 10:10

すみません。勘違いしてしまいました。ログイン情報(IDとパワスワード)をどこかで記載してログイン処理をして、ログイン後の情報を取得したいと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問