爬蟲功能介紹
此項目主要用于爬取BOSS直聘網(wǎng)的職位,薪資,學歷,任職要求,爬取的內(nèi)容用myql存儲
可以輸入爬取職位,爬取頁數(shù),爬取一頁的時間大概需要2秒
利用了多個useraget和cookie做測試,測試反扒策略
1、分析頁面url
https://www.zhipin.com/c100010000/?query=Java&page=2
請求的url= https://www.zhipin.com/c100010000/
請求的參數(shù)=query=Java&page=2
頁面跳轉(zhuǎn)為 page+1
單頁最大page = 10 //未登錄的情況下
2、根據(jù)你要獲取的信息發(fā)送請求
package main
import (
"fmt"
"github.com/PuerkitoBio/goquery"
"github.com/garyburd/redigo/redis"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"io/ioutil"
"log"
"math/rand"
"net/http"
"os"
"strconv"
"time"
)
// 公司介紹
type CompanyStruct struct{
JobLind string `db:"招聘者"`
CompanyInfo string `db:"公司信息"`
JobType string `db:"工作類型"`
ForCompany string `db:"招聘公司"`
InLand string `db:"在何地招聘"`
Mania string `db:"薪資范疇"`
}
var (
//__zp_stoken__="9a3dBF3MCmyPZ4Zs9eRYGXGUR-Ugs3h8Pz03%2FrBtAtNgB67REb52tBBbLpjxcmw7ZppohumsjJF79M4BFI5NcaRf4uw%3D%3D";
//__zp_stoken__="9a3dBF3MCmyPZ4Zs9eRYGXGUR-Qbi93bx3nbc%2Beassyi2tITP4L7hUXliwMp6lk%2BvoQ%2FvUQqVi9TOpzj7WVQNCviT1g%3D%3D"
Url = `https://www.zhipin.com/c100010000/?query=web&page=1`
Cookies = `Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a="1571451828";Hm_lvt_194df3105ad7148dcf2b98a91b5e727a="1571459326,1571405292";__zp_stoken__="9a3dBF3MCmyPZ4Zs9eRYGXGURUgs3h8Pz03%2FrBtAtNgB67REb52tBBbLpjxcmw7ZppohumsjJF79M4BFI5NcaRf4uw%3D%3D";__a="87719411.1571405292.1571405292.1571451826.31.2.13.31";__l="l=%2Fwww.zhipin.com%2Fweb%2Fcommon%2Fsecurity-check.html%3Fseed%3Dhh1Zsbm2A%252F%252BeXJf4gqJS9CbEi5ue7LIi93osZZEXcbQ%253D%26name%3D9205702c%26ts%3D1571451825250%26callbackUrl%3D%252Fc101010100%252F%253Fquery%253Dweb%2525E5%252589%25258D%2525E7%2525AB%2525AF%2526industry%253D%2526position%253D%2526ka%253Dhot-position-4%26srcReferer%3D&r=&friend_source=0&friend_source=0";__c="1571451826";__g="-";lastCity="101010100";`
PyCookie = `__a=87719411.1571405292.1571571431.1571573191.78.4.13.78;__c=1571573191;__g=-;__l=l=%2Fwww.zhipin.com%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0;__zp_stoken__=ab17gAKyCiVPXoKZouYVWxVmXuy2kQJQJ%2F6uuhUOaDa%2BRZ9ZvxqNAl4vkQlWuQeuD8AI2%2BFzigw0Rn8u8aG0SRQwTQ%3D%3D;Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1571573763;Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1571400558,1571451828,1571571431,1571573191;lastCity=101010100;`
WebCookie = `__a=87719411.1571405292.1571571431.1571573191.96.4.31.96;__c=1571573191;__g=-;__l=l=%2Fwww.zhipin.com%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0;__zp_stoken__=ab17gAKyCiVPXoKZouYVWxVmXs0qmerbaXOj2SvOTZ3F0nykSLMt6yXjKQvmT6cRx9D0lX6rj9G1mFFcm7bmxmRuzA%3D%3D;Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1571581244;Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1571400558,1571451828,1571571431,1571573191;lastCity=101010100;`
Dir = "C:/Users/12161/Desktop/env_m/go/src/apiserver/GOspider/BossZhiPin/"
UserAgentList = []string{"Mozilla/5.0 (compatible, MSIE 10.0, Windows NT, DigExt)",
"Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, 360SE)",
"Mozilla/4.0 (compatible, MSIE 8.0, Windows NT 6.0, Trident/4.0)",
"Mozilla/5.0 (compatible, MSIE 9.0, Windows NT 6.1, Trident/5.0,",
"Opera/9.80 (Windows NT 6.1, U, en) Presto/2.8.131 Version/11.11",
"Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, TencentTraveler 4.0)",
"Mozilla/5.0 (Windows, U, Windows NT 6.1, en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Macintosh, Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh, U, Intel Mac OS X 10_6_8, en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Mozilla/5.0 (Linux, U, Android 3.0, en-us, Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
"Mozilla/5.0 (iPad, U, CPU OS 4_3_3 like Mac OS X, en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, Trident/4.0, SE 2.X MetaSr 1.0, SE 2.X MetaSr 1.0, .NET CLR 2.0.50727, SE 2.X MetaSr 1.0)",
"Mozilla/5.0 (iPhone, U, CPU iPhone OS 4_3_3 like Mac OS X, en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
"MQQBrowser/26 Mozilla/5.0 (Linux, U, Android 2.3.7, zh-cn, MB200 Build/GRJ22, CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"}
)
//從上面列表中獲取一個User-Agent
func GetRandomUserAgent() string {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
return UserAgentList[r.Intn(len(UserAgentList))]
}
// 下載基礎的html
func GetBaseHtml(url string, dir string ,cookies string) (err error) {
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Cookie", cookies)
req.Header.Add("User-Agent", GetRandomUserAgent())
req.Header.Add("Accept", "*/*")
req.Header.Add("Cache-Control", "no-cache")
req.Header.Add("Postman-Token", "6de4691b-9ff1-49f1-b702-e1af878a8941,33aac300-f20d-4e5c-b3f2-99977fc88286")
req.Header.Add("Host", "www.zhipin.com")
req.Header.Add("Accept-Encoding", "text/html")
req.Header.Add("Connection", "keep-alive")
req.Header.Add("cache-control", "no-cache")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
err = ioutil.WriteFile(dir, body, 0644)
<-time.After(time.Second*2)
return err
}
// 得到一批html文件
func mainGetBaseHtml(n int ,cookies string){
for i:=1;i<n+1; i++{
url := Url + strconv.Itoa(i)
dir_info := Dir + strconv.Itoa(1000+i)+".html"
err := GetBaseHtml(url, dir_info,cookies)
if err !=nil{
log.Fatal(err)
}
fmt.Println("di --- " ,i)
}
}
3、根據(jù)返回的數(shù)據(jù)進行數(shù)據(jù)處理
...
// 獲取頁面信息切片 這里分析頁面了html結(jié)構(gòu),根據(jù)標簽class選擇關鍵字
func GetHtmlSlice(Dir string) (Ctt []CompanyStruct) {
f, err := os.Open(Dir)
if err != nil {
log.Fatal(err)
}
defer f.Close()
doc, err := goquery.NewDocumentFromReader(f)
if err != nil {
log.Fatal(err)
}
// use the goquery document...
doc.Find(".job-primary").Each(func(i int, cs *goquery.Selection) {
companyStruct := CompanyStruct{}
cs.Find(".info-primary").Each(func(i1 int, cs1 *goquery.Selection){
text := cs1.Find(".job-title").Text()
companyStruct.JobType=text
s := cs1.Find(".red").Text()
companyStruct.Mania=s
i2 := cs1.Find("p").Text()
companyStruct.InLand=i2
})
cs.Find(".info-company").Each(func(i1 int, cs1 *goquery.Selection){
company1 := cs1.Find("h3 a").Text()
i2 := cs1.Find("p").Text()
companyStruct.ForCompany=company1
companyStruct.CompanyInfo=i2
})
cs.Find(".info-publis").Each(func(i1 int, cs1 *goquery.Selection){
text := cs1.Find("h3").Text()
companyStruct.JobLind=text
})
structs := append(Ctt, companyStruct)
Ctt = structs
})
return Ctt
}
4、數(shù)據(jù)處理后存儲
...
//解析切片數(shù)據(jù)存入redis 省略
//解析切片存入mysql
func mainSetMysql(n int){
db, err := sqlx.Open("mysql", "root:123123@tcp(192.168.1.196:3306)/Spider")
if err !=nil{
db.Close()
log.Fatal(`sqlx.Open("mysql", "root:123123@tcp(192.168.1.196:3306)/Spider")`)}
for i:=1;i<n+1; i++ {
dir_info := Dir + strconv.Itoa(1000+i) + ".html"
Ctt := GetHtmlSlice(dir_info)
for _,v:= range Ctt{
var(joblind = v.JobLind
cominfo = v.CompanyInfo
jobtype=v.JobType
forcompany=v.ForCompany
inland=v.InLand
mania=v.Mania)
result, err := db.Exec("insert into Spider.boosszhipin(招聘者, 公司信息, 工作類型, 招聘公司, 在何地招聘, 薪資范疇) values (?,?,?,?,?,?)", joblind, cominfo, jobtype, forcompany, inland, mania)
if err!=nil{ log.Fatal(`"db.Exec("insert into Spider.boosszhipin(招聘者, 公司信息, 工作類型, 招聘公司, 在何地..."`,err)}
fmt.Println(result.LastInsertId())
}
}
}
func main(){
//mainGetBaseHtml(10,WebCookie)
//mainSetRidsData(5)
mainSetMysql(12)
}
5、數(shù)據(jù)展示
...
*************************** 206. row ***************************
id: 206
招聘者: 任先生招聘者
公司信息: 計算機服務不需要融資0-20人
工作類型: web前端
招聘公司: 馳宇科技
在何地招聘: 石家莊 經(jīng)驗不限大專
薪資范疇: 2-5K
*************************** 207. row ***************************
id: 207
招聘者: 林先生招聘者
公司信息: 互聯(lián)網(wǎng)已上市10000人以上
工作類型: web 前端開發(fā)工程師
招聘公司: 好未來
在何地招聘: 深圳 南山區(qū) 科技園3-5年本科
薪資范疇: 15-30K
*************************** 208. row ***************************
id: 208
招聘者: 梁先生人事
公司信息: 互聯(lián)網(wǎng)天使輪20-99人
工作類型: Web前端
招聘公司: 安徽九廣全景科技
在何地招聘: 合肥 1-3年大專
薪資范疇: 7-8K
*************************** 209. row ***************************
id: 209
招聘者: 劉先生IT技術架構(gòu)
公司信息: 通信/網(wǎng)絡設備已上市10000人以上
工作類型: Web前端工程師
招聘公司: 中興通訊股份有限公司
在何地招聘: 長沙 岳麓區(qū) 麓谷西3-5年本科
薪資范疇: 9-14K·14薪
209 rows in set (0.00 sec)
MariaDB [Spider]>
MariaDB [Spider]> select 招聘者,在何地招聘,工作類型,薪資范疇 from boosszhipin;
+---------------------------------------------+----------------------------------------------------+-----------------------------------------+---------------+
| 招聘者 | 在何地招聘 | 工作類型 | 薪資范疇 |
+---------------------------------------------+----------------------------------------------------+-----------------------------------------+---------------+
| 常先生高級軟件工程師 | 西安 3-5年本科 | Python | 15-30K |
| 郭女士招聘者 | 東莞 1-3年本科 | Python | 8-13K |
| 謝先生招聘專員 | 東莞 經(jīng)驗不限本科 | Python | 9-13K |
| 付女士人事 | 長沙 岳麓區(qū) 麓谷3-5年大專 | python | 10-15K |
| 高女士HR | 杭州 濱江區(qū) 長河1-3年本科 | Python | 10-15K |
| 李女士HR | 西安 長安區(qū) 王寺3-5年本科 | Python | 9-14K |
| 楊先生招聘者 | 成都 金牛區(qū) 中海國際3-5年大專 | Python導師 | 15-30K |
| 李女士招聘主管 | 北京 東城區(qū) 磁器口5-10年本科 | Python講師 | 15-30K |
| 侯女士招聘 經(jīng)理 | 天津 東麗區(qū) 軍糧城5-10年本科 | python | 10-15K |
| 開發(fā) | 武漢 江夏區(qū) 光谷東3-5年本科 | Python | 15-30K·14薪 |
| 鞏先生運維經(jīng)理 | 南京 雨花臺區(qū) 寧南3-5年本科 | Python | 15-30K |
總結(jié)
反扒策略不止于此,不解決反扒策略考慮多協(xié)程也沒用。