TODO: 解决编码问题
This commit is contained in:
@@ -1,73 +1,219 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/gob"
|
||||
"net/http"
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"intimate"
|
||||
"log"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/474420502/hunter"
|
||||
"github.com/474420502/requests"
|
||||
"github.com/tidwall/gjson"
|
||||
)
|
||||
|
||||
func preNUm(data byte) int {
|
||||
var mask byte = 0x80
|
||||
var num int = 0
|
||||
//8bit中首个0bit前有多少个1bits
|
||||
for i := 0; i < 8; i++ {
|
||||
if (data & mask) == mask {
|
||||
num++
|
||||
mask = mask >> 1
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return num
|
||||
}
|
||||
func isUtf8(data []byte) bool {
|
||||
i := 0
|
||||
for i < len(data) {
|
||||
if (data[i] & 0x80) == 0x00 {
|
||||
// 0XXX_XXXX
|
||||
i++
|
||||
continue
|
||||
} else if num := preNUm(data[i]); num > 2 {
|
||||
// 110X_XXXX 10XX_XXXX
|
||||
// 1110_XXXX 10XX_XXXX 10XX_XXXX
|
||||
// 1111_0XXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
|
||||
// 1111_10XX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
|
||||
// 1111_110X 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
|
||||
// preNUm() 返回首个字节的8个bits中首个0bit前面1bit的个数,该数量也是该字符所使用的字节数
|
||||
i++
|
||||
for j := 0; j < num-1; j++ {
|
||||
//判断后面的 num - 1 个字节是不是都是10开头
|
||||
if (data[i] & 0xc0) != 0x80 {
|
||||
return false
|
||||
}
|
||||
i++
|
||||
}
|
||||
} else {
|
||||
//其他情况说明不是utf-8
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func isGBK(data []byte) bool {
|
||||
length := len(data)
|
||||
var i int = 0
|
||||
for i < length {
|
||||
if data[i] <= 0x7f {
|
||||
//编码0~127,只有一个字节的编码,兼容ASCII码
|
||||
i++
|
||||
continue
|
||||
} else {
|
||||
//大于127的使用双字节编码,落在gbk编码范围内的字符
|
||||
if data[i] >= 0x81 &&
|
||||
data[i] <= 0xfe &&
|
||||
data[i+1] >= 0x40 &&
|
||||
data[i+1] <= 0xfe &&
|
||||
data[i+1] != 0xf7 {
|
||||
i += 2
|
||||
continue
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func TestExtractor(t *testing.T) {
|
||||
|
||||
ses := requests.NewSession()
|
||||
wf := ses.Get("https://www.openrec.tv/user/Riowh/supporters")
|
||||
wf.Execute()
|
||||
tp := ses.Get("https://www.openrec.tv/user/Riowh/supporters")
|
||||
tp.Execute()
|
||||
|
||||
// t.Error(ses.GetCookies(wf.GetParsedURL()))
|
||||
|
||||
buf := bytes.Buffer{}
|
||||
encoder := gob.NewEncoder(&buf)
|
||||
encoder.Encode(ses.GetCookies(wf.GetParsedURL()))
|
||||
|
||||
var cookies []*http.Cookie
|
||||
decoder := gob.NewDecoder(&buf)
|
||||
t.Error(decoder.Decode(&cookies))
|
||||
t.Error(cookies)
|
||||
|
||||
// collect := intimate.NewExtractorStore()
|
||||
// store := intimate.NewSourceStore("source_openrec")
|
||||
// source, err := store.Pop(string(intimate.TTOpenrecRanking), 100)
|
||||
collect := intimate.NewExtractorStore()
|
||||
store := intimate.NewSourceStore("source_openrec")
|
||||
source, err := store.Pop(string(intimate.TTOpenrecRanking), 100)
|
||||
// if source != nil {
|
||||
// defer store.Restore(source)
|
||||
// }
|
||||
// if err != nil {
|
||||
// t.Error(err)
|
||||
// }
|
||||
// sdata := source.GetExt().([]byte)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
sdata := source.GetExt().([]byte)
|
||||
|
||||
// if gjson.ValidBytes(sdata) {
|
||||
// result := gjson.ParseBytes(sdata)
|
||||
// m := result.Map()
|
||||
if gjson.ValidBytes(sdata) {
|
||||
result := gjson.ParseBytes(sdata)
|
||||
m := result.Map()
|
||||
|
||||
// user := m["user"]
|
||||
user := m["user"]
|
||||
|
||||
// ai := &intimate.CollectLog{}
|
||||
// extractor := hunter.NewExtractor([]byte(user.Str))
|
||||
// xp, err := extractor.XPathResult("//p[@class='c-global__user__count__row__right js-userCountFollowers']/text()")
|
||||
// if err != nil {
|
||||
// t.Error(err)
|
||||
// }
|
||||
// if !xp.NodeIter().Next() {
|
||||
// t.Error("不存在粉丝数")
|
||||
// }
|
||||
ai := &intimate.CollectLog{}
|
||||
extractor := hunter.NewExtractor([]byte(user.Str))
|
||||
xp, err := extractor.XPathResult("//p[@class='c-global__user__count__row__right js-userCountFollowers']/text()")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if !xp.NodeIter().Next() {
|
||||
t.Error("不存在粉丝数")
|
||||
}
|
||||
|
||||
// followers := strings.ReplaceAll(xp.String(), ",", "")
|
||||
followers := strings.ReplaceAll(xp.String(), ",", "")
|
||||
|
||||
// followersInt, err := strconv.Atoi(followers)
|
||||
// if err != nil {
|
||||
// t.Error(err)
|
||||
// }
|
||||
followersInt, err := strconv.ParseInt(followers, 10, 64)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
// ai.SetPlatform(string(intimate.Popenrec))
|
||||
// ai.SetFollowers(sql.NullInt32{Int32: int32(followersInt), Valid: true})
|
||||
// ai.SetAnchorId(source.GetSource().String)
|
||||
var anchorName string
|
||||
xp, err = extractor.XPathResult("//p[@class='c-global__user__profile__list__name__text official-icon--after']/text()")
|
||||
if xp.NodeIter().Next() {
|
||||
anchorName = xp.String()
|
||||
} else {
|
||||
t.Error(err)
|
||||
}
|
||||
t.Error(anchorName)
|
||||
|
||||
// collect.InsertCollectLog(ai)
|
||||
// c-contents
|
||||
xp, err = extractor.XPathResult("//ul[@class='c-contents']//p[@class='c-thumbnailVideo__footer__liveCount']/text()")
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
if xp.NodeIter().Next() {
|
||||
views := regexp.MustCompile(`[0-9,]+`).FindString(xp.String())
|
||||
views = strings.ReplaceAll(views, ",", "")
|
||||
viewsint, err := strconv.Atoi(views)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
// } else {
|
||||
// t.Error("data is not json:\n", string(sdata))
|
||||
// }
|
||||
ai.SetViews(sql.NullInt64{Int64: int64(viewsint), Valid: true})
|
||||
ai.SetIsShowing(1)
|
||||
}
|
||||
|
||||
var givers []interface{}
|
||||
var gratuity int64 = 0
|
||||
giverjson := m["supporters"]
|
||||
for _, v := range giverjson.Array() {
|
||||
giverSource := gjson.Parse(v.String())
|
||||
for _, item := range giverSource.Get("data.items").Array() {
|
||||
givers = append(givers, item.Map())
|
||||
gratuity += item.Get("total_yells").Int()
|
||||
}
|
||||
}
|
||||
|
||||
giversbytes, err := json.Marshal(givers)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
ai.SetErrorMsg(sql.NullString{String: err.Error(), Valid: true})
|
||||
} else {
|
||||
ai.SetGiver(giversbytes)
|
||||
}
|
||||
|
||||
// MovieToolbar__Views-g5e6ic-13 iDRGyA
|
||||
livejson := m["user_live"]
|
||||
|
||||
f, err := os.OpenFile("./test.html", os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
f.WriteString(livejson.String())
|
||||
t.Error(livejson)
|
||||
extractor = hunter.NewExtractor([]byte(livejson.Str))
|
||||
xr, err := extractor.XPathResult("//h1[ contains(@class, 'MovieTitle__Title')]")
|
||||
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
t.Error(xr)
|
||||
iter := xr.NodeIter()
|
||||
if iter.Next() {
|
||||
t.Error(iter.Node().TextContent())
|
||||
ai.SetShowTitle(sql.NullString{String: iter.Node().TextContent(), Valid: true})
|
||||
|
||||
content, err := extractor.XPathResult("//meta[@itemprop='uploadDate']/@content")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if content.NodeIter().Next() {
|
||||
t.Error(content.String())
|
||||
}
|
||||
}
|
||||
t.Error(xr.String(), xr.NodeIter().Next(), xr.String())
|
||||
|
||||
ai.SetGratuity(sql.NullInt64{Int64: gratuity, Valid: true})
|
||||
ai.SetPlatform(string(intimate.Popenrec))
|
||||
ai.SetFollowers(sql.NullInt64{Int64: int64(followersInt), Valid: true})
|
||||
ai.SetAnchorId(source.GetSource().String)
|
||||
ai.SetUpdateTime(source.GetUpdateTime())
|
||||
|
||||
collect.InsertCollectLog(ai)
|
||||
|
||||
} else {
|
||||
t.Error("data is not json:\n", string(sdata))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user