package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"regexp"
"time"
)
type pachong struct {
reg string //保存正则表达式
url string //保存网址
name string //保存监控的产品名称
}
func (p *pachong) getinfo() { //爬虫结构体的getinfo方法
res, err := http.Get(p.url)
if err != nil {
log.Fatal(err)
}
result, err := ioutil.ReadAll(res.Body)
// err = ioutil.WriteFile("abc.txt", result, 0777) //这里可以输出网页源码看看是否获取到正确的源码
res.Body.Close()
if err != nil {
log.Fatal(err)
}
rep := regexp.MustCompile(p.reg) //匹配正则
finalslice := rep.FindAllString(string(result), -1) //返回字符串切片,-1表示全部,1表示匹配1个,2就匹配2个
var finalstring string
for _, v := range finalslice { //遍历切片
finalstring = finalstring + v[len(v)-11:len(v)]
}
fmt.Println("获取到", len(finalslice), "条信息")
fmt.Println(p.name, finalstring)
}
func main() {
pa1 := &pachong{`(?U:id="product1"[\S\s]+0 Available[\S\s]+product2)`, "https://my.frantech.ca/cart.php", "buyvm的LV RYZEN KVM 512MB:"}
for {
pa1.getinfo()
time.Sleep(6e10)
}
}
正则[\S\s]可以代表任意字符
这里还不够严谨,好像有库存不会显示0 Available
我们加个判断
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"regexp"
"time"
)
type pachong struct {
reg string //保存正则表达式
url string //保存网址
name string //保存监控的产品名称
}
func (p *pachong) getinfo() { //爬虫结构体的getinfo方法
res, err := http.Get(p.url)
if err != nil {
log.Fatal(err)
}
result, err := ioutil.ReadAll(res.Body)
// err = ioutil.WriteFile("abc.txt", result, 0777) //这里可以输出网页源码看看是否获取到正确的源码
res.Body.Close()
if err != nil {
log.Fatal(err)
}
rep := regexp.MustCompile(p.reg) //匹配正则
finalslice := rep.FindAllString(string(result), -1) //返回字符串切片,-1表示全部,1表示匹配1个,2就匹配2个
var finalstring string
for _, v := range finalslice { //遍历切片
finalstring = finalstring + v
}
fmt.Println("获取到", len(finalslice), "条信息")
if len(finalslice) > 0 {
fmt.Println(p.name, "0 available")
} else {
fmt.Println(p.name, "好像有库存啦!")
}
}
func main() {
pa1 := &pachong{`(?U:id="product1"[\S\s]+0 Available[\S\s]+product2)`, "https://my.frantech.ca/cart.php", "buyvm的LV RYZEN KVM 512MB:"}
pa2 := &pachong{`(?U:id="product2"[\S\s]+0 Available[\S\s]+product3)`, "https://my.frantech.ca/cart.php", "buyvm的LV RYZEN KVM 1GB:"}
for {
pa1.getinfo()
pa2.getinfo()
time.Sleep(6e10)
}
}
能匹配到0 available就说明没有库存,匹配不到就是有库存
这样两个爬虫请求相同页面两次不太好,可以在修改下同一个页面,可以匹配多个正则然后输出结果,这样就只用请求一次了,有空再改