用go语言爬取珍爱网 | 第一回
2024-09-01 11:16:07
我们来用go语言爬取“珍爱网”用户信息。
首先分析到请求url为:
http://www.zhenai.com/zhenghun
接下来用go请求该url,代码如下:
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
//返送请求获取返回结果
resp, err := http.Get("http://www.zhenai.com/zhenghun")
if err != nil {
panic(fmt.Errorf("Error: http Get, err is %v\n", err))
}
//关闭response body
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Println("Error: statuscode is ", resp.StatusCode)
return
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error read body, error is ", err)
}
//打印返回值
fmt.Println("body is ", string(body))
}
运行后会发现返回体里有很多乱码:
在返回体里可以找到 即编码为gbk,而go默认编码为utf-8,所以就会出现乱码。接下来用第三方库将其编码格式转为utf-8。
由于访问golang.org/x/text需要梯子,不然报错:
所以在github上下载:
mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/text.git
然后将gbk编码转换为utf-8,需要修改代码如下:
utf8Reader := transform.NewReader(resp.Body, simplifiedchinese.GBK.NewDecoder())
body, err := ioutil.ReadAll(utf8Reader)
考虑到通用性,返回的编码格式不一定是gbk,所以需要对实际编码做判断,然后将判断结果转为utf-8,需要用到第三方库golang.org/x/net/html,同样的在github上下载:
mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/net
那么代码就变成这样:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"golang.org/x/text/transform"
//"golang.org/x/text/encoding/simplifiedchinese"
"io"
"golang.org/x/text/encoding"
"bufio"
"golang.org/x/net/html/charset"
)
func main() {
//返送请求获取返回结果
resp, err := http.Get("http://www.zhenai.com/zhenghun")
if err != nil {
panic(fmt.Errorf("Error: http Get, err is %v\n", err))
}
//关闭response body
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Println("Error: statuscode is ", resp.StatusCode)
return
}
//utf8Reader := transform.NewReader(resp.Body, simplifiedchinese.GBK.NewDecoder())
utf8Reader := transform.NewReader(resp.Body, determinEncoding(resp.Body).NewDecoder())
body, err := ioutil.ReadAll(utf8Reader)
if err != nil {
fmt.Println("Error read body, error is ", err)
}
//打印返回值
fmt.Println("body is ", string(body))
}
func determinEncoding(r io.Reader) encoding.Encoding {
//这里的r读取完得保证resp.Body还可读
body, err := bufio.NewReader(r).Peek(1024)
if err != nil {
fmt.Println("Error: peek 1024 byte of body err is ", err)
}
//这里简化,不取是否确认
e, _, _ := charset.DetermineEncoding(body, "")
return e
}
运行后就看不到乱码了:
今天先爬到这里,明天将提取返回体中的地址URL和城市,下一节见。
本公众号免费提供csdn下载服务,海量IT学习资源,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。
扫码关注,精彩内容第一时间推给你
最新文章
- iOS 小知识点(持续更新)
- 【转载】Log4j详细使用教程
- chrome浏览器调用 ajax 提示net::ERR_INCOMPLETE_CHUNKED_ENCODING问题解决方案,以及 Response.Close 和 Response.End 的一些问题。
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
- PaintCode调研
- Oracle EBS中查询Profile的各种SQL【转载】
- 【数据结构与算法分析——C语言描述】第二章总结 算法分析
- 用 const 限定类的成员函数
- Fox-H 函数
- 重学C语言 -- printf,scanf
- ant来历
- 【转】android移植之request_suspend_state: wakeup &; init: untracked pid xx exited问题的解决
- windows media player 中播放pls的方法
- Swift - 产生不重复数字的随机数生成器
- 在O(1)时间删除指定链表结点
- cronlog分割tomcat catalina.out日志
- Swift基础之Swift调用OC语言文件使用步骤
- 一张图看懂AR至GL数据流
- 微服务与Spring Cloud资料
- Rolling in the Deep (Learning)
热门文章
- lambda表达式与匿名内部类与双冒号(::)
- Markdown 直接转换公众号文章,不再为排版花时间
- JSP获取网络IP地址
- C++11新增容器以及元组
- Fragment的创建与通信
- Linux、Windows 和 Mac 中的换行符对比
- 12 (OC)* AFNetworking
- App引流增长技术:Deeplink(深度链接)技术
- [LeetCode] 由 “分形"; 所想
- 【linux】【sonarqube】安装sonarqube7.9