This commit is contained in:
eson 2020-09-10 17:33:52 +08:00
parent 0b8a6fd810
commit c4d0140b42
5 changed files with 101 additions and 27 deletions

View File

@ -28,7 +28,7 @@ type LiveInfo struct {
} }
func Execute() { func Execute() {
wd := intimate.GetChromeDriver(3030) wd := intimate.GetChromeDriver()
count := 0 count := 0
countlimit := 200 countlimit := 200
@ -120,7 +120,7 @@ func Execute() {
count = 0 count = 0
wd.Close() wd.Close()
wd.Quit() wd.Quit()
wd = intimate.GetChromeDriver(3030) wd = intimate.GetChromeDriver()
} }
} }
} }

View File

@ -34,13 +34,17 @@ func main() {
ps := intimate.NewPerfectShutdown() ps := intimate.NewPerfectShutdown()
ses := requests.NewSession() ses := requests.NewSession()
streamerQueue := intimate.TStreamer.Queue(intimate.Streamer{}, intimate.ConditionDefault(intimate.Ptwitcasting)) streamerQueue := intimate.TStreamer.Queue(intimate.Streamer{}, intimate.ConditionDefault(intimate.Ptwitcasting))
var lasterr error
for !ps.IsClose() { for !ps.IsClose() {
// streamer, err := estore.Pop(intimate.Ptwitcasting) // streamer, err := estore.Pop(intimate.Ptwitcasting)
isteamer, err := streamerQueue.Pop() isteamer, err := streamerQueue.Pop()
if err != nil { if err != nil {
log.Println(err, isteamer) if lasterr != err {
lasterr = err
log.Println(err)
}
time.Sleep(time.Minute)
continue continue
} }

View File

@ -20,22 +20,36 @@ import (
// var estore *intimate.StoreExtractor = intimate.NewStoreExtractor() // var estore *intimate.StoreExtractor = intimate.NewStoreExtractor()
func main() { func main() {
wd := intimate.GetChromeDriver(3040)
adriver := intimate.GetChromeDriver()
defer func() {
adriver.Close()
}()
ps := intimate.NewPerfectShutdown() ps := intimate.NewPerfectShutdown()
queue := intimate.TStreamerList.Queue(intimate.StreamerList{}, intimate.ConditionDefault(intimate.Ptwitch)) queue := intimate.TStreamerList.Queue(intimate.StreamerList{}, intimate.ConditionDefault(intimate.Ptwitch))
var count = 0 var count = 0
var countlimt = 200 var countlimt = 1
var recreate = time.Now()
// var lasterr error = nil var lasterr error = nil
// var err error // var err error
for !ps.IsClose() { for !ps.IsClose() {
wd := adriver.Webdriver
// sourceChannel, err := sstore.Pop(intimate.TTwitchChannel) // sourceChannel, err := sstore.Pop(intimate.TTwitchChannel)
isl, err := queue.Pop() isl, err := queue.Pop()
if err != nil { if err != nil {
panic(err) if lasterr != err {
lasterr = err
log.Println(err)
}
time.Sleep(time.Minute)
continue
} }
streamerlist := isl.(*intimate.StreamerList) streamerlist := isl.(*intimate.StreamerList)
weburl := streamerlist.Url + "?sort=VIEWER_COUNT" weburl := streamerlist.Url + "?sort=VIEWER_COUNT"
@ -169,15 +183,19 @@ func main() {
} }
count++ count++
if count >= countlimt { if count >= countlimt || time.Now().Sub(recreate) >= time.Minute*120 {
count = 0 count = 0
wd = intimate.GetChromeDriver(3031) countlimt = 3
adriver = intimate.GetChromeDriver()
recreate = time.Now()
}
if count >= 2 {
break
} }
} }
wd.Close()
wd.Quit()
} }
func Extractor(wd selenium.WebDriver, streamer *intimate.Streamer) { func Extractor(wd selenium.WebDriver, streamer *intimate.Streamer) {

View File

@ -22,8 +22,10 @@ func Execute() {
ps := intimate.NewPerfectShutdown() ps := intimate.NewPerfectShutdown()
for !ps.IsClose() { for !ps.IsClose() {
var err error var err error
wd := intimate.GetChromeDriver(3030) adriver := intimate.GetChromeDriver()
wd := adriver.Webdriver
weburl := "https://www.twitch.tv/directory?sort=VIEWER_COUNT" weburl := "https://www.twitch.tv/directory?sort=VIEWER_COUNT"
err = wd.Get(weburl) err = wd.Get(weburl)
@ -119,9 +121,8 @@ func Execute() {
log.Println("hrefs len:", len(hrefs)) log.Println("hrefs len:", len(hrefs))
// sstore.Deduplicate(intimate.TTwitchChannel, "source") // sstore.Deduplicate(intimate.TTwitchChannel, "source")
// wd.Close()
wd.Close() // wd.Quit()
wd.Quit()
time.Sleep(time.Minute * 30) time.Sleep(time.Minute * 30)
} }
} }

View File

@ -5,9 +5,10 @@ import (
"database/sql" "database/sql"
"fmt" "fmt"
"log" "log"
"net"
"os" "os"
"os/exec"
"os/signal" "os/signal"
"runtime"
"strconv" "strconv"
"strings" "strings"
"sync/atomic" "sync/atomic"
@ -93,7 +94,27 @@ func ParseDuration(dt string) (time.Duration, error) {
return tdt.Sub(zeroTime), nil return tdt.Sub(zeroTime), nil
} }
func GetChromeDriver(port int) selenium.WebDriver { type AutoCloseDriver struct {
Webdriver selenium.WebDriver
Port int
}
func (adriver *AutoCloseDriver) Close() {
killshell := fmt.Sprintf("pkill -P `pgrep -f 'port=%d '` && pkill -f 'port=%d '", adriver.Port, adriver.Port)
log.Println(killshell)
// log.Printf(fmt.Sprintf("kill -9 $(lsof -t -i:%d)", port))
cmd := exec.Command("sh", "-c", killshell)
err := cmd.Run()
if err != nil {
log.Println(err)
}
}
func GetChromeDriver() *AutoCloseDriver {
port := GetFreePort()
var err error var err error
caps := selenium.Capabilities{"browserName": "chrome"} caps := selenium.Capabilities{"browserName": "chrome"}
@ -131,28 +152,44 @@ func GetChromeDriver(port int) selenium.WebDriver {
chromecaps.ExcludeSwitches = append(chromecaps.ExcludeSwitches, "enable-automation") chromecaps.ExcludeSwitches = append(chromecaps.ExcludeSwitches, "enable-automation")
caps.AddChrome(chromecaps) caps.AddChrome(chromecaps)
_, err = selenium.NewChromeDriverService("/usr/bin/chromedriver", port) _, err = selenium.NewChromeDriverService("/usr/bin/chromedriver", port)
if err != nil { if err != nil {
panic(err) panic(err)
} }
wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port)) wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
if err != nil { if err != nil {
panic(err) panic(err)
} }
runtime.SetFinalizer(wd, func(obj interface{}) {
if err := obj.(selenium.WebDriver).Close(); err != nil { adriver := &AutoCloseDriver{}
log.Println(err) adriver.Port = port
} adriver.Webdriver = wd
if err := obj.(selenium.WebDriver).Quit(); err != nil {
log.Println(err) // runtime.SetFinalizer(adriver, func(obj interface{}) {
}
}) // adriver := obj.(*AutoCloseDriver)
// adriver.Webdriver.Close()
// adriver.Webdriver.Quit()
// killshell := fmt.Sprintf("pkill -P `pgrep -f 'port=%d '` && pkill -f 'port=%d '", port, port)
// log.Println(killshell)
// // log.Printf(fmt.Sprintf("kill -9 $(lsof -t -i:%d)", port))
// // cmd := exec.Command("sh", "-c", killshell)
// // err = cmd.Run()
// // if err != nil {
// // log.Println(err)
// // }
// })
wd.ExecuteScript("windows.navigator.webdriver = undefined", nil) wd.ExecuteScript("windows.navigator.webdriver = undefined", nil)
if err != nil { if err != nil {
panic(err) panic(err)
} }
return wd return adriver
} }
// PerfectShutdown 完美关闭程序 // PerfectShutdown 完美关闭程序
@ -305,3 +342,17 @@ func (wf *WaitFor) WaitWithTimeout(xpath string, timeout time.Duration, do func(
}, timeout) }, timeout)
} }
func GetFreePort() int {
addr, err := net.ResolveTCPAddr("tcp", "localhost:0")
if err != nil {
panic(err)
}
l, err := net.ListenTCP("tcp", addr)
if err != nil {
panic(err)
}
defer l.Close()
return l.Addr().(*net.TCPAddr).Port
}