天天看點

golang筆記14--go 語言爬蟲實戰項目介紹

golang筆記14--go 語言爬蟲實戰項目介紹

  • ​​1 介紹​​
  • ​​2 開始實戰項目​​
  • ​​2.1 爬蟲項目介紹​​
  • ​​2.2 爬蟲的法律風險​​
  • ​​2.3 新爬蟲的選擇​​
  • ​​2.4 總體算法​​
  • ​​3 注意事項​​
  • ​​4 說明​​

1 介紹

本文繼上文 ​​golang筆記13–go語言 http 及其它标準庫​​​, 進一步了解 go 語言爬蟲實戰項目介紹,以及相應注意事項。

具體包括: 爬蟲項目介紹、爬蟲的法律風險、新爬蟲的選擇、總體算法 等内容。

2 開始實戰項目

2.1 爬蟲項目介紹

  1. 選擇爬蟲項目原因

    1)有一定的複雜性;

    2)可以靈活調整項目的複雜性;

    3)需要平衡語言 | 爬蟲之間的比重;

  2. 網絡爬蟲分類

    1)通用爬蟲,例如百度、Google,它們會搜尋網際網路上的所有資料并儲存下來,搜搜的時候直接從存儲的備份裡面找到目标内容,然後再通路實際網站内容;

    2)聚焦爬蟲,從網際網路擷取結構話資料,不儲存所有資料,隻根據一些需要提取需要的資料;

  3. go 語言常見爬蟲庫 | 架構
  • ​​henrylee2cn/pholcus​​​   Pholcus(幽靈蛛)是一款純 Go 語言編寫的支援分布式的高并發爬蟲軟體,僅用于程式設計學習與研究。

    它支援單機、服務端、用戶端三種運作模式,擁有Web、GUI、指令行三種操作界面;規則簡單靈活、批量任務并發、輸出方式豐富(mysql/mongodb/kafka/csv/excel等);另外它還支援橫縱向兩種抓取模式,支援模拟登入和任務暫停、取消等一系列進階功能。

  • ​​gocrawl​​ gocrawl是一個采用Go編寫的微型并發Web爬蟲。
  • ​​colly​​​   Lightning Fast and Elegant Scraping Framework for Gophers.

    Colly provides a clean interface to write any kind of crawler/scraper/spider.

    With Colly you can easily extract structured data from websites, which can be used for a wide range of applications, like data mining, data processing or archiving.

  • ​​hu17889/go_spider​​​   go_spider 基于golang開發,是一個開放的垂直領域的爬蟲架構,架構中将各個功能子產品區分開,友善使用者重新實作子子產品,進而建構自己垂直方方向的爬蟲。
  1. 項目總體結構

    1)選擇目标網絡資源,如珍愛網、愛卡網;

    2)完成分布式爬蟲子產品;

    3)存儲到指定資料庫中;

    4)提供簡單的前端展示;

    本項目為了提高go語言熟練度,不使用現有爬蟲庫,全部手寫;使用ElasticSearch 作為資料存儲;使用go語言标準模闆庫實作 http 資料展示部分;

2.2 爬蟲的法律風險

  1. robots 協定

    一般網站都會增加一個robots.txt 來說明可以爬、不可爬以及不願意被爬的内容。

  2. 技術上:沒有限制力

    如果需要禁止某個agent通路,則需要在安全程式層面加以監測和阻止。

  3. 法律上:作為參考

    一方面,robots 上不允許爬蟲的,一般最好不要爬,以防影響網站的正常業務(可能存在法律風險);

    另一方面,robots協定預設允許所有項;

    除此之外,網站所有者可能沒有關注或者寫錯 robots.txt 相關的資訊;

    是以需要根據常識判斷,不能随意爬、無限速爬(QPS 不能影響對方正常服務),若不确定時候可以咨詢相關人士或者聯系網站管理人員(有些爬蟲資料是有利于你網站方的)。

  以下為 github、zhenai、xcar 等3個常見網站的爬蟲限制文檔;從文檔中可以發現github 有很多子頁面都是不希望被爬取的,珍愛網很多 profile下很多操作也是被希望被爬取的。

1) https://github.com/robots.txt
# If you would like to crawl GitHub contact us via https://support.github.com/contact/
# We also provide an extensive API: https://developer.github.com/
User-agent: baidu
crawl-delay: 1

User-agent: *

Disallow: /*/pulse
Disallow: /*/tree/
Disallow: /*report-abuse?report=*
Disallow: /*tab=*
......
Disallow: /account-login
Disallow: /Explodingstuff/

2) https://www.zhenai.com/robots.txt
User-agent: *

Disallow: /*?*
Disallow: /*jsps*
Disallow: /login/*
Disallow: /register*
Disallow: /profile/addfriend.jsps*
Disallow: /profile/getmemberdata11.jsps*
Disallow: /profile/getmemberdata.jsps*
Disallow: /profile/addfriend.jsps*
Disallow: /profile/sendleer.jsps*
Disallow: /?fromMemberId=*
Disallow: /.asp$
Disallow: /.php$
Disallow: /.action$
Disallow: /plus/
Disallow: /kwsearch/

3) https://www.xcar.com.cn/robots.txt
User-agent: *
Disallow: /bbs/admin/
Disallow: /bbs/api/
......
Disallow: /.js?*
Disallow: /.php?type=cms

sitemap: http://www.xcar.com.cn/sitemap.xml      

2.3 新爬蟲的選擇

爬取網站類别:比較廉價的資料,通路量大的網站;

參考資料類别:金融、體育、新聞、産品等類别的資料;

本項目:

1)爬取愛卡汽車各車型資料;

2)項目的設計使得我們隻需要增量修改;

3)新的解析器,新的配置;

通過本項目可以學習子產品化、任務管理、排程、分布式搭建、接口、函數式程式設計等各類 golang 基礎知識。

2.4 總體算法

想讓程式擷取資料資訊,那麼必須先嘗試人工擷取資訊,然後設定指定爬蟲起始爬蟲位置,再根據規則爬取需要的資料,根據連結爬取更多的資料。

本案例通過檢視 ​​珍愛網​​​ 和 ​​世紀佳緣網​​​ ,發現可以從 ​​珍愛網-征婚​​ 頁面可以找到所有城市資訊,并且能在不登入的情況下檢視對應的使用者資料(當然少量操作需要登入狀态下才能擷取);是以,本案例爬取珍愛網資料。

golang筆記14--go 語言爬蟲實戰項目介紹

算法說明:

本案例中 爬蟲總體算法 和 爬蟲實作步驟如下圖所示:

算法層面,從城市清單 擷取子城市資料,然後進一步擷取使用者資料,并且根據使用者能進一步擷取推薦使用者資料;

實作步驟層面,從單任務版更新到并發版本,再進一步優化為分布式版本;爬蟲總體算法

golang筆記14--go 語言爬蟲實戰項目介紹
golang筆記14--go 語言爬蟲實戰項目介紹

爬蟲實作步驟

golang筆記14--go 語言爬蟲實戰項目介紹

3 注意事項

4 說明

  1. 軟體環境

    go版本:go1.15.8

    作業系統:Ubuntu 20.04 Desktop

    Idea:2020.01.04