golang爬虫下载的代码:
下载程序的借鉴内容:
这个是关于gbk,utf8等相互转换的包
github.com/axgle/mahonia"
一、标准下载代码
1.1标准1
package downloader
import (
"log"
"net/http"
"io"
"github.com/axgle/mahonia"
"github.com/go-crawler/car-prices/fake"
)
func Get(url string) io.Reader {
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Printf("http.NewRequest err: %v", err)
}
req.Header.Add("User-Agent", fake.GetUserAgent())
req.Header.Add("Referer", "https://car.autohome.com.cn")
resp, err := client.Do(req)
if err != nil {
log.Printf("client.Do err: %v", err)
}
mah := mahonia.NewDecoder("gbk")
return mah.NewReader(resp.Body)
}
1.2标准2,chatgpt生成的
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
//url := "https://example.com"
url := "https://baidu.com"
headers := make(map[string]string)
headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
//headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
//headers["Accept-Encoding"] = "gzip, deflate, sdch"
//headers["Accept-Language"] = "en-US,en;q=0.8"
//headers["Cache-Control"] = "max-age=0"
//headers["Connection"] = "keep-alive"
client := &http.Client{}
request, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("Failed to create request:", err)
return
}
// 设置请求头部信息
for key, value := range headers {
request.Header.Set(key, value)
}
response, err := client.Do(request)
if err != nil {
fmt.Println("Failed to send request:", err)
return
}
defer response.Body.Close()
// 读取响应内容
body, err := ioutil.ReadAll(response.Body)
if err != nil {
fmt.Println("Failed to read response:", err)
return
}
// 打印响应内容
fmt.Println(string(body))
}
二、补充内容
客户端在发送请求时,可以通过设定请求头中的多项参数规范请求的特性,例如字符编码集、语言等等,详细信息大家可以参照:这里 下面简单列举几个。
Accept::浏览器可接受的数据类型;
Accept-Charset:浏览器可接受的字符编码集;
Accept-Encoding:浏览器可接受的编码方法;
Accept-Language:浏览器可接受的语言;
Connection:是否为持久连接,默认长连接keep-alive,由于网页数据很多,所以浏览器可能是连续多次请求服务器数据的,此时多次访问只有首次完成tcp3次握手,减少消耗;而tcp中的keep-alive是tcp连接的有效时长,一般比http的keep-alive的时间长。
Cookie:Cookie值;
Content-Lenght:请求内容的长度,过长和果断将导致请求内容截断;如果不知道可以不设置,交由底层完成;
Host:访问的服务器地址;
User-Agent:用户信息。
2.1经常添加的上述头文件内容代码,可以根据实际情况进行添加;
client := &http.Client{}
url := "http://www.baidu.com"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Add("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
req.Header.Add("Accept-Charset","utf-8")
//req.Header.Add("Accept-Encoding","br, gzip, deflate")
req.Header.Add("Accept-Language","zh-cn")
req.Header.Add("Connection","keep-alive")
//req.Header.Add("Cookie","xxxxxxxxxxxxxxx")
//req.Header.Add("Content-Lenght",xxx)
req.Header.Add("Host","www.baidu.com")
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")
rep, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
data, err := ioutil.ReadAll(rep.Body)
rep.Body.Close()
if err != nil {
log.Fatal(err)
}
log.Printf("%s", data)
2.2post方法向服务器提交
func main() {
client := &http.Client{}
req_data := `{"name":"ali", "age":"18"}`
url := "http://www.baidu.com"
req, err := http.NewRequest("POST", url, strings.NewReader(req_data))
if err != nil {
log.Fatal(err)
}
//Content-Type很重要,下文解释
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
//req.Header.Set("Content-Type", "application/json")
//req.Header.Set("Content-Type", "multipart/form-data")
rep, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
data, err := ioutil.ReadAll(rep.Body)
rep.Body.Close()
if err != nil {
log.Fatal(err)
}
log.Printf("%s", data)
}
上面的代码意在向百度提交name和age数据,由于百度服务器并不识别name和age,所以无法返回正确的数据,但流程上是正确的。其中有必要说一下Content-Type,它是用于规定提交数据的类型,常见的有application/x-www-form-urlencoded、application/form-data和application/json等,下面分别说明一下:application/x-www-form-urlencoded:最常见的类型之一,表示将数据转化为键值对后提交,例如name=ali&age=18.但是如果有本身数据中有&字符就可能造成歧义,例如二进制文件等。
application/form-data:表示以表格数据上报,即将多组数据以一串复杂的boundary数据分隔,而非&符;因此这种数据类型可以用于上传文件或有&符的数据。文章来源:https://www.toymoban.com/news/detail-626807.html
application/json:表示将提交的数据转化成json格式。
文章来源地址https://www.toymoban.com/news/detail-626807.html
2.3小示例
package main
import (
"io/ioutil"
"log"
"net/http"
"sync"
)
var wc sync.WaitGroup
func HelloClient(client *http.Client, url string){
defer wc.Done()
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
rep, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
data, err := ioutil.ReadAll(rep.Body)
rep.Body.Close()
if err != nil {
log.Fatal(err)
}
log.Printf("%s", data)
}
func main() {
client := &http.Client{}
url := "http://127.0.0.1:8000"
wc.Add(10)
for i := 0; i < 10; i++{
go HelloClient(client, url)
}
wc.Wait()
}
到了这里,关于4-golang爬虫下载的代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!