go 파충류 - goquery 가방 과 정규 및 gojquery 의 총 결 사용 사용

6369 단어 go.
1 면 입 니 다.   기어 온 데 이 터 를 로 컬 에 저장 합 니 다.  필터 데이터 없 음   정규 와 goquery 두 가지 방법 을 사 용 했 습 니 다. 
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"strconv"
	"strings"

	// "github.com/antchfx/htmlquery"  // xpath        
	"github.com/PuerkitoBio/goquery"
)

func main() {
	//       ,   
	var start, end int
	fmt.Println("         ")
	fmt.Scan(&start)
	fmt.Println("          ")
	fmt.Scan(&end)
	// working(start, end)  //                                 
	spider(start, end) //                     goquery
}
func working(start, end int) {
	for i := start; i < end; i++ {
		url := "https://tieba.baidu.com/f?kw=%E9%BB%91tfboys&ie=utf-8&pn=" + strconv.Itoa(i*50)
		result, err := httpGet(url)
		if err != nil {
			fmt.Println("  ")
			continue
		}
		f, err := os.Create(" " + strconv.Itoa(i) + " .html")
		if err != nil {
			fmt.Println("create  html error ")
			return
		}
		f.WriteString(result)
		f.Close() //      defer     defer  for       defer                          
	}
}
func spider(start, end int) {
	f, err := os.OpenFile("sao2015.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println("create file fail")
		return
	}
	for m := 1; m < 13; m++ {
		for i := start; i < end; i++ {
			fmt.Println(i)
			url := "https://www.054gan.com/video/2015-" + strconv.Itoa(m) + "/" + strconv.Itoa(i) + ".html"
			result, err := httpGet(url)
			if err != nil {
				fmt.Println("  ")
				continue
			}
			dom, err := goquery.NewDocumentFromReader(strings.NewReader(result))
			if err != nil {
				log.Fatalln(err)
			}

			dom.Find(".cat_pos a font").Each(func(i int, selection *goquery.Selection) {
				fmt.Println("i", i, "select text", selection.Text())
				f.WriteString(selection.Text() + "----" + url + "
") }) } } f.Close() } func httpGet(url string) (result string, err error) { resp, err := http.Get(url) if err != nil { fmt.Println(" ") return } // defer resp.Body.Close() buf := make([]byte, 4096) for { n, err2 := resp.Body.Read(buf) if n == 0 || err2 == io.EOF { // fmt.Println(" ") break // } if err2 != nil && err2 != io.EOF { err = err2 return // } result += string(buf[:n]) } return }

제2판  병발 판
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strconv"
)

func main() {
	//       ,   
	var start, end int
	fmt.Println("         ")
	fmt.Scan(&start)
	fmt.Println("          ")
	fmt.Scan(&end)
	working(start, end)
}
func working(start, end int) {

	page := make(chan int)
	for i := start; i <= end; i++ {
		go spider(i, page)
	}
	//    page                 page                     select                      
	for i := start; i <= end; i++ {
		fmt.Printf(" %d      
",

결론: 병발 은 하나의 통 로 를 추가 한 것 이다.   마지막 감청   채널 마다 작업 이 완료 되면   그러면 이 통로 에서 숫자 가 들 어 오 는 것 과 같다.이 감청 통달 의 순환 이 끝 날 때 까지 실 행 될 수 있다.
goquery  요약: 먼저 작은 예 를 들 어  입문 하 다
func main() {
    html := `
            
                

, 。 , 。

` dom,err:=goquery.NewDocumentFromReader(strings.NewReader(html)) if err!=nil{ log.Fatalln(err) } dom.Find("p").Each(func(i int, selection *goquery.Selection) { fmt.Println(selection.Text()) }) } NewDocumentFromReader() *Document error。Document HTML 。 Find() , x , 。 P, p 。 Each() , , , 2 , , 。 Text()

선택 기: jqery 의 선택 기 는 대부분 goquery 에서 도 사용 할 수 있 습 니 다.  예컨대  
  • HTML Element 요소 기반 선택 기   div  span  p   a
  • ID 선택 기
  • Class 선택 기
  • 속성 선택 기  p[class=content1]  div[my^=zh] div[my~=zh] div[my$=zh]  div[my!=zh] div[my*=zh]
  • parent > childre (부모 요소 에서 모든 하위 요소 와 일치) 
  • parent + brother (인접 한 동급 태그)
  • parent children (부모 요소 의 모든 하위 요소)
  • parent ~ brother (인접 하지 않 은 동급 태그)
  • 필터
  • container ()     p: container ('a') 에서 a 를 포함 하 는 p 태그
  • 를 선별 합 니 다.
    유사 함수 의 위치 조작
  • 유사 함수 의 위치 조작
  • Find (selection) * Selection / / 선택 기 에 따라 노드 집합 찾기
  • Eq(index int) *Selection   //색인 에 따라 노드 집합 가 져 오기
  • First() *Selection             //첫 번 째 키 노드 집합 가 져 오기
  • Last() *Selection              //마지막 하위 노드 집합 가 져 오기
  • Next () * Selection / / 다음 형제 노드 집합 가 져 오기
  • NextAll () * Selection / / 뒤에 있 는 모든 형제 노드 집합 가 져 오기
  • Prev () * Selection / / 이전 형제 노드 집합
  • Get (index int) * html. Node / / 색인 에 따라 노드 를 가 져 옵 니 다
  • Index () int / / 선택 대상 의 첫 번 째 요소 의 위 치 를 되 돌려 줍 니 다
  • Slice (start, end int) * Selection / / 시작 위치 에 따라 하위 노드 집합 가 져 오기
  • 선택 한 노드 를 반복 합 니 다
  • Each (f func (int, * Selection) * Selection / / 옮 겨 다 니 기
  • Each WithBreak (f func (int, * Selection) bool) * Selection / / 스 트 리밍 중단 가능
  • Map (f func (int, * Selection) string) (result [] string) / / 문자열 배열 되 돌려 주기
  • 노드 속성 치 검 측 또는 획득
  • Attr (), RemoveAttr (), SetAttr () / / 획득, 제거, 속성의 값 설정
  • AddClass(), HasClass(), RemoveClass(), ToggleClass()
  • Html () / / 이 노드 의 html 가 져 오기
  • Length () / 이 Selection 의 요소 개 수 를 되 돌려 줍 니 다
  • Text () / 이 노드 의 텍스트 값 가 져 오기
  • 문서 트 리 사 이 를 왔다갔다 (자주 사용 하 는 노드 찾기 방법)
  • Children () / / selection 의 각 노드 아래 의 아이 노드 로 돌아 가기
  • 내용 () / / 현재 노드 아래 의 모든 노드 가 져 오기
  • Find () / 현재 일치 하 는 요 소 를 찾 습 니 다
  • Next () / / 다음 원소
  • Prev () / 이전 요소
  • 고급 용법
    doc.Find("#content-left .article ").Each(func(i int, s *goquery.Selection) {
        url, _ := s.Find("a[class]").Attr("href")
        hash["all_content"] = sub_doc.Find(".content").Text()
    }

    좋은 웹페이지 즐겨찾기