LoginSignup
1
0

More than 3 years have passed since last update.

Swiftでスマホ / PC用ページのスクレイピング切り替え

Posted at

したいこと

「SwiftからHTMLをリクエストするときに、スマホ用ページとPC用ページを切り替えたい」

同じURLのサイトでもPCでみた時と、スマホでみた時はレイアウトが変わっている。
スマホ版は情報を少なくするため、PC用のHTMLだと一発で取れた値でも、スマホ版では隠されていることがある。
場合によって、PC版とスマホ版のアクセスを切り替える。

PC版とスマホ版は何が違う?

URLをリクエストするときにヘッダに User-Agent という情報を付加して、どちらのHTMLを要求するかを決めている。
なので、スマホ版のHTMLが欲しければスマホのUser-Agentを、PC版のHTMLが欲しければPCのUser-Agentを付加しなければいけない。

User-Agentに関してはこちらを参照した。
https://qiita.com/kapiecii/items/093ffd6f0b09ad775250

方法

  • URLリクエストにはAlamofireを使用した。
  • HTMLのparseには、Kannaを使用した。
import Alamofire
import Kanna
override func viewDidLoad() {
    let url = "https://qiita.com/"
    let parameters: Parameters = [:]

    // PC版
    let headers: HTTPHeaders = ["User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"]

    // スマホ版
    // let headers: HTTPHeaders = ["User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1"]

    AF.request(url,
            method: .get,
            parameters: parameters,
            encoding: URLEncoding(destination: .queryString),
            headers: headers
    ).responseData(completionHandler: { (data) in
        if let d = data.data {
            self.parse(data: d)
        }
    })
}

func parse(data: Data) {
    do {
        let articles = try HTML(html: data, encoding: .utf8).css("article")
        for article in articles {
            if let h2 = article.css("h2").first?.text {
                print(h2)
            }
        }
    } catch {
        print("error while parsing")
        print("data:", data)
    }
}

感想

Alamofire.request じゃなくて AF.request なのにちょっとつまづいた。
あまり記事がなかったので、最近の変更?

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0