背景

新居住的地方在离上海市的杨浦图书馆很近。杨浦图书馆由民国时期的旧上海图书馆修缮扩建而成。进入其中,学习氛围与历史气息合而为一,是我周末最喜欢待的地方。不过图书馆占地面积过小,楼层也只有两层,美则美矣,周末想占个位置还是很难的。

根据之前的观察,馆内人数在300人左右时,就很难再找一个合适的位置了。图书馆的公众号上提供了馆内目前的人数和当日的流量数据,我便抽个时间做了一个爬取图书馆在馆人数的网页,作为参考可以为我提供入馆的最佳时机。

步骤

抓包

手机连上电脑端运行的 fiddler,打开公众号,抓包。

抓包

将请求导出为curl

导出curl

使用 go 语言重写请求流程。如果想快速完成的话,可以在 curl-to-go快速生成go代码。 示例如下:

curl -X POST https://api.easypost.com/v2/shipments \
     -u API_KEY: \
     -d 'shipment[to_address][id]=adr_HrBKVA85' \
     -d 'shipment[from_address][id]=adr_VtuTOj7o' \
     -d 'shipment[parcel][id]=prcl_WDv2VzHp' \
     -d 'shipment[is_return]=true' \
     -d 'shipment[customs_info][id]=cstinfo_bl5sE20Y'
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// Generated by curl-to-Go: https://mholt.github.io/curl-to-go

body := strings.NewReader(`shipment[to_address][id]=adr_HrBKVA85&shipment[from_address][id]=adr_VtuTOj7o&shipment[parcel][id]=prcl_WDv2VzHp&shipment[is_return]=true&shipment[customs_info][id]=cstinfo_bl5sE20Y`)
req, err := http.NewRequest("POST", "https://api.easypost.com/v2/shipments", body)
if err != nil {
	// handle err
}
req.SetBasicAuth("API_KEY", "")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

resp, err := http.DefaultClient.Do(req)
if err != nil {
	// handle err
}
defer resp.Body.Close()

解析HTML

使用github.com/PuerkitoBio/goquery库将抓包抓取到的 HTML 解析出来。并将解析出来的数据同当前的时间存入到csv文件中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
doc, err := goquery.NewDocumentFromReader(resp.Body)
	if err != nil {
		log.Println(err)
		return
	}

	doc.Each(func(i int, selection *goquery.Selection) {
		currentNum := selection.Find("body > p:nth-child(1) > span").Text()
		totalNum := selection.Find("body > p:nth-child(3) > span").Text()

		csvFile, err := csvFile()
		if err != nil {
			log.Println(err)
			return
		}

		writer := csv.NewWriter(csvFile)
		defer writer.Flush()

		if err := writer.Write([]string{fmt.Sprintf("%d", time.Now().Unix()), currentNum, totalNum}); err != nil {
			log.Println(err)
			return
		}
	})

	if err := GenChart(time.Now()); err != nil {
		log.Println(err)
	}

展示

调研了几个库,发现使用百度的 echarts 展示效果是最好的,那么就使用 github.com/go-echarts/go-echarts/charts库来生成趋势图。

效果如下:

效果图

访问地址:访问地址

完整代码:https://github.com/kunpengdai/yplibrary

后记

新冠疫情肆虐,图书馆还没开放,目前的抓包结果只能看到工作人员的活动。相较以往,现在是最希望看到流量达到300以上的一次了。