Diary

Diary

日々学んだことをアウトプットする場として初めてみました

特定のサイトからスクレイピングできない

症状

golang で http リクエストを投げてスクレイピングしたい時、特定のサイトでは全く情報が取れない時がありました。

解決策

Header 情報に Agent の情報を入れてあげると解決しました。

req.Header.Add("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1")

全体のコード

package main

import (
    "net/http"
    "fmt"

    "github.com/PuerkitoBio/goquery"
)

const (
    BaseUrl = "https://www.xxx/xxx_yyy"
)

func main() {
    // リクエストを作る
    req, err := http.NewRequest("GET", BaseUrl, nil)
    if err != nil {
        panic(err)
    }
    req.Header.Add("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1")

    // リスエスト投げてレスポンスを得る
    client := &http.Client{}
    resp, err := client.Do(req)

    fmt.Println(resp)

    // レスポンスをNewDocumentFromResponseに渡してドキュメントを得る
    doc, err := goquery.NewDocumentFromResponse(resp)
    if err != nil {
        panic(err)
    }
    fmt.Println(doc)

    doc.Find("span.sub").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text())
        fmt.Println(s)
    })
}

おわりに

golang によらず、スクレイピングできない時は Agent 情報を追加してあげるとうまくいくかもよ?って話でした