Golang 파충류 시리즈 goquery

15768 단어
원문https://www.jianshu.com/p/ae172d60c431
주로 goquery 를 연습 하고 싶 은 데, 먼저 실천 을 해 보 는 거 예요.  goquery 로 콩짜개 영화 top 250
원문 마지막 에서 컴 파일 하여 실행 합 니 다.err 한 무더기 입력
디 버 깅 을 해 봤 는데 Http 오류 코드 418 로 돌 아 왔 습 니 다. 파충류 인 것 같 습 니 다.
좋아, 우 리 는 서버 의 부담 을 증가 시 켜 서 는 안 되 지만, 매번 우리 의 눈 으로 보 게 해 서 는 안 된다. 프로그램 으로 웹 페이지 를 읽 으 면 어 때!
그래서 프로그램의 순환 을 없 애고 첫 페이지 만 읽 고 요청 헤드 를 추가 해 보 세 요.
package main

import (
    "fmt"
    "net/http"

    "github.com/PuerkitoBio/goquery"
)

func GetMovie(url string) {
    fmt.Println(url)
    //new    request,    header
    req, _ := http.NewRequest("GET", url, nil)
    //   
    req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,like GeCKO) Chrome/45.0.2454.85 Safari/537.36 115Broswer/6.0.3")
    req.Header.Set("Referer", "https://movie.douban.com/")
    req.Header.Set("Connection", "keep-alive")
    resp, err := (&http.Client{}).Do(req)
    if err != nil {
        panic(err)
    }
    //bodyString, err := ioutil.ReadAll(resp.Body)
    //fmt.Println(string(bodyString))
    if resp.StatusCode != 200 {
        fmt.Println("err")
    }

    doc, err := goquery.NewDocumentFromReader(resp.Body)
    if err != nil {
        panic(err)
    }

    //

    doc.Find("#content h1").Each(func(i int, s *goquery.Selection) {
        // name
        fmt.Println("name:" + s.ChildrenFiltered(`[property="v:itemreviewed"]`).Text())
        // year
        fmt.Println("year:" + s.ChildrenFiltered(`.year`).Text())
    })

    // #info > span:nth-child(1) > span.attrs
    director := ""
    doc.Find("#info span:nth-child(1) span.attrs").Each(func(i int, s *goquery.Selection) {
        //   
        director += s.Text()
        //fmt.Println(s.Text())
    })
    fmt.Println("  :" + director)
    //fmt.Println("
")
pl := "" doc.Find("#info span:nth-child(3) span.attrs").Each(func(i int, s *goquery.Selection) { pl += s.Text() }) fmt.Println(" :" + pl) charactor := "" doc.Find("#info span.actor span.attrs").Each(func(i int, s *goquery.Selection) { charactor += s.Text() }) fmt.Println(" :" + charactor) typeStr := "" doc.Find("#info > span:nth-child(8)").Each(func(i int, s *goquery.Selection) { typeStr += s.Text() }) fmt.Println(" :" + typeStr) } func GetToplist(url string) []string { var urls []string //new request, header req, _ := http.NewRequest("GET", url, nil) // req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,like GeCKO) Chrome/45.0.2454.85 Safari/537.36 115Broswer/6.0.3") req.Header.Set("Referer", "https://movie.douban.com/") req.Header.Set("Connection", "keep-alive") resp, err := (&http.Client{}).Do(req) if err != nil { panic(err) } fmt.Println("===============================================================", resp.StatusCode) //bodyString, err := ioutil.ReadAll(resp.Body) //fmt.Println(string(bodyString)) if resp.StatusCode != 200 { fmt.Println("//////////////////////////////////////", resp.StatusCode) } doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { panic(err) } doc.Find("#content div div.article ol li div div.info div.hd a"). Each(func(i int, s *goquery.Selection) { // year fmt.Printf("%v", s) herf, _ := s.Attr("href") urls = append(urls, herf) }) return urls } func main() { url := "https://movie.douban.com/top250?start=0" var urls []string urls = GetToplist(url) fmt.Println("%v", urls) for _, url := range urls { GetMovie(url) } }

열 린 콩잎 에 감 사 드 립 니 다. 폐쇄 된 인터넷 패권 을 증오 합 니 다!필요 한 정 보 를 성공 적 으로 읽 었 습 니 다!
다음은 본 격 적 으로 goquery 본론 으로 들 어 갑 니 다. 이 부분 은 주로 참고 하 겠 습 니 다.https://www.flysnow.org/2018/01/20/golang-goquery-examples-selector.html
1. HTML Element 요소 기반 선택 기
이것 은 비교적 간단 하 다. 바로 a, p 등 HTML 의 기본 요 소 를 바탕 으로 선택 하 는 것 이다. 이런 것 은 Element 이름 을 선택 기로 직접 사용 하면 된다.예 를 들 면 dom.Find("div").
func main() {
    html := `

                
DIV1
DIV2
SPAN ` dom,err:=goquery.NewDocumentFromReader(strings.NewReader(html)) if err!=nil{ log.Fatalln(err) } dom.Find("div").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) }) }

 상기 예 를 들 어 div 요 소 를 선별 할 수 있 지만 body, span 는 선별 되 지 않 습 니 다.
 2. ID 선택 기
이것 은 사용 빈도 가 가장 많은 것 으로 위의 예 와 비슷 하 다. 두 개의 div 요소 가 있 는데 사실은 우 리 는 그 중의 하나 만 필요 하 다. 그러면 우 리 는 이 표시 에 유일한 id 만 표시 하면 된다. 그러면 우 리 는 id 선택 기 를 사용 하여 정확 한 포 지 셔 닝 을 할 수 있다.
func main() {
    html := `

                
"div1">DIV1
DIV2
SPAN ` dom,err:=goquery.NewDocumentFromReader(strings.NewReader(html)) if err!=nil{ log.Fatalln(err) } dom.Find("#div1").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) }) }
id 선택 기 는 # 로 시작 하여 요소 id 의 값 을 따 르 고 문법 dom.Find(#id) 을 사용 합 니 다. 뒤의 예 는 제 가 간략하게 Find(#id) 로 쓰 겠 습 니 다. 이것 은 goquery 선택 기 를 대표 하 는 것 임 을 알 고 있 으 면 됩 니 다.
3. Element ID 선택 기
같은 ID 가 있 는데 각각 다른 HTML 요소 에 속 하면 어떻게 합 니까?좋 은 방법 이 있 습 니 다. Element 와 결합 하 세 요.예 를 들 어 우리 가 선별 한 요 소 는 div 이 고 iddiv1 의 요소 이 므 로 Find(div#div1) 와 같은 선택 기 를 사용 하여 선별 할 수 있다.
그래서 이런 필터 의 문법 은 Find(element#id) 인 데 이것 은 자주 사용 하 는 조합 방법 이다. 예 를 들 어 뒤에 말 한 필터 도 이런 방식 으로 조합 해서 사용 할 수 있다.
다른 선택 기 는 쓰 고 싶 지 않 으 니 원문 을 참고 하 세 요.chromer 개발 도구 에서 직접 copy 할 수 있 을 것 같 습 니 다. 상응하는 selector
 
 
 
기타 참고:
https://www.cnblogs.com/winterbear/p/12263886.html
https://www.cnblogs.com/mingbai/p/goHttpReq.html

좋은 웹페이지 즐겨찾기