Golang 파충류 시리즈 goquery
주로 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
이 고 id
는 div1
의 요소 이 므 로 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.