為何抵觸爬蟲?

這幾天刷知乎,發現關於爬蟲的教程和實戰如雨後春筍一樣瘋狂湧現。但據我了解,首先爬蟲這個技術是幾年前甚至更早以前就已經出現了,而且爬蟲本身的技術天花板並沒有多高把,但是為何最近開始這麼熱門?同時又有一些知乎大V和技術大V的回答和專欄中對爬蟲的評價並不友好,是厭惡爬蟲還是厭惡這種技術被捧到風口浪尖?題主也有過一些簡單操作爬蟲的經驗,看到爬蟲在風口浪尖上,想到這樣的行為會不會使互聯網公司開始加大反爬蟲的力度,有沒有可能做到徹底的禁止爬蟲行為呢?

希望大家可以不吝賜教,非常感謝。

-------------------------------------

看了大家的答案,先要對每一個答題者說一聲謝謝。其中大部分的答案都是對爬蟲變成熱門這種現象的個人見解,題主也算一個會寫一些小爬蟲的pythoner(比入門教程稍好一點點)(?_?),所以我很好奇為什麼爬蟲熱門了,但是進階的教程卻非常少呢?既然那麼多人吐槽入門爬蟲水,為何極少有人去寫不水的爬蟲教程呢?


因為他們寫的並不算 「爬蟲」 啊。我以前也很煩那些 Pythoner 寫的那些玩意,分享出來的文章。

後來明白了,他們只是作為一個初學者寫出了感覺稍微實用點的東西,恨不得把所有網站數據都定向抓取一遍。

雖然,那些都是毫無抽象,純粹重複調度類庫 API 的,類似資料庫 CRUD 的無意義代碼。

你要知道,在知乎上通過 Python 入門編程的人多得嚇人。所以那些文章仍然會層出不窮,不斷的會有新手把後來的新手帶歪。

真正能稱得上 「爬蟲」 該有的元素:常見數據結構(網站自身是典型的圖、 基於 URL 隊列的抓取策略)、並行(多線程、多進程、它們之間的通信)、常見演算法(遍歷圖、去重複、去噪音)、代理池、數據持久化、錯誤恢復等等就不提了。

原本爬蟲的架構設計是一件很有價值很有意義的事情,很多演算法也是公認的科學界難題。但是他們是這樣寫的(偽代碼):

initPage = 1000;
maxPage = 2000;
for i = initPage; i &<= maxPage; i++ { resp = fetch "http://getdata.com/page/${i}" items = resp.select("#list") items.forEach { item -&>
println("抓到數據:${item.text}")
}
}

硬生生的炒雞簡單的輪循 HTTP 請求程序被冠以爬蟲的大名!

————

寫那麼多重複代碼厭倦不厭倦?我給的建議是:

抽象和封裝一下代碼,基於表達式或者配置文件做簡單的定向抓取,容易並且有價值得多。

————— UPDATE

有個評論說得太對了,就是這個意思:「可是這其實是requests或者urllib教程,而不是爬蟲呀。」


雖然我不是這些爬蟲教程的受眾,一直以來對這些教程本著不求無功,但求無過的心態。我玩我的岡布奧,他們割他們的韭菜。

直到昨天,我看到一篇 @吃面崩掉牙 的 《python與redis的初次碰撞--把玩redis資料庫的一點心得 - 知乎專欄》,然後在下面噴了他,然後被刪評論之後。我決定掛一掛這種「誤人子弟,殺人放火」的所謂教程。


跳過教人 kill -9 這種「小」問題了,直接進入正題。在教程裡面教人 bind 0.0.0.0 還關閉 `protected-mode` 是什麼鬼?!redis 為了防這種人,專門給搞了個雙保險,然後在教程里就全給你關掉了!

而這種門洞大開的 redis,不僅僅是數據被清空這麼簡單; 它會輕易地讓機器被入侵 A few things about Redis security 。所以我評論這種教程是「殺人放火」並不為過。

看此作者的另一篇文章《Python入門--針對零基礎學習者的資料推薦 - 知乎專欄》,這種針對零基礎讀者的專欄,我不評論它給這些零基礎的讀者帶來的價值,如此沒有安全常識的操作步驟,只會讓他們養成非常不好的安全習慣。


對於初學者,建議還是閱讀官方的教程,它們雖然不一定是項目維護者所編寫,至少也會 review 過。這些教程除了最基本的正確性之外,有些還會闡述這麼做的理由,例如 Redis Security - Redis ,這些是很好的延伸閱讀材料。當然,我不是在反對 python 大量的「爬蟲教程」,但是,當你看到配置文件中的 WARNING 的時候,想清楚自己到底在幹什麼;就算你非要這麼做,行行好,別寫在教程里,別「誤人子弟」。


假設在知乎關注了廚藝話題和相關大V,一堆掛著米其林星級大廚title的大V在教你怎麼泡速食麵,一大堆廚藝小白都在請教怎麼泡速食麵,信息流里每天都刷出一大堆怎麼泡華豐/康師傅/統一/進口速食麵的問題和解答,偶爾有個教你泡港式出前一丁加午餐肉加蛋圖文並茂一點的就能刷個千贊...

身為一個真的想學點廚藝的人,你也會很抓狂的。


不厭惡爬蟲,也很感謝那些寫教程的人。但是現在的問題是爬蟲的文章重複性太多了,而且大多不成系統(如果有大神講企業級爬蟲系統我會很開心),沒有細緻的以一個比較好的教程序列去弄。
天天都是發車。搞得大家一說Python 就是爬蟲,但是Python裡面爬蟲只是一個方面,其他諸如數據分析,web,機器學習等等卻沒有多少文章 ( 很高興最近一段時間多起來了)
爬蟲不是討厭,只是他的低門檻導致各種文章太多。我們希望看到的是新世界,一個百花齊放的世界,而不是一個只有爬蟲的世界。


不論從技術還是道德方面這都不是一個適合擺在檯面上講的事情。

反爬蟲也不是什麼新鮮事兒,反爬蟲的力度通常不取決於爬蟲,而是SEO、產品等部門的糾結。


任務分發控制,數據清洗,爬取策略,反扒,分析前端渲染過程,驗證碼突破,分散式數據一致性,代理策略,大數據存儲.…反正我沒看到天花板,不知道是不是霧霾太大了,沒有看到盡頭


玩具和工業化產品有很大區別。解析頁面只是爬蟲最無聊又不可避免的一部,導致很多人覺得很low。沒有業務場景只是玩玩確實如此,猶如寫個helloword,似乎站在了編程語言的巔峰。

講真我不太喜歡寫爬蟲,因為需求總是智障的讓你增加數據源,框架成型後,繼續就是解析頁面,毫無意義。你心裡想的是並發,分散式,服務。但沒有人關心,他們會覺得這麼low的東西你還能整啥,和題主感受很像。每天幾千萬條數據來的時候,你心裡可不是這麼想的。幾十台機器上有問題了,每天要維護。寫了半年多的正式項目了,感受最深的是頁面解析及數據清洗非常浪費時間,很多站點前端很不規範,模版很多很雜,需要一定測試時間。工作中更傾向於後台服務,所以精力基本在後台上。

幾行代碼下點數據寫多了沒有動力,以前經常得意的爬點小東西,還覺得很有意思。寫多了,成體系了,也覺得沒意思了。爬蟲涉及很多後台還有演算法的東西,如果對其它的方向感興趣可以深挖,不用執著於頁面解析上。

數據本來是公開的,扛不住就反爬唄,有什麼抵制的。你需要別人的數據,別人也需要你的,你攔截別人的,別人也不會放過你的請求吧。爬蟲不會盯著毫無意義的數據,浪費資源。

爬蟲只是手段,數據隱藏的價值才是目的,所以多關注數據,做點脫離低級趣味的東西。或者研究點後台的東西。


我看到的很多教程都沒有提及網站robots.txt(維基中文: robots.txt(統一小寫)是一種存放於網站根目錄下的ASCII編碼的文本文件,它通常告訴網路搜索引擎的漫遊器(又稱網路蜘蛛),此網站中的哪些內容是不應被搜索引擎的漫遊器獲取的,哪些是可以被漫遊器獲取的)。有的還會在裡面限定爬取速度。
我認為爬取網頁時應當參考robots.txt,如若不然,則會給網站所有者帶來超出承受範圍的損失。(答主未系統查閱以及深入思考)


201710號更新。

我們來玩知乎吧: https://www.github.com/hunterhug/GoZhihu

滑稽

---

這就像某人說的一樣,看起來是篇宣

傳,因為回答問題總要講故事,舉例子。所以還是匿名了,開源了代碼,還是希望有些人能夠用上吧。

前言

我覺得爬蟲和搜索引擎本是同根,如果進階,要寫就寫大一點有策略的爬蟲,不要天天獲取一些不可持續的數據。


而且python寫大型分散式爬蟲,分分鐘你會吐血。寫爬蟲,計算機網路要過關,而且資料庫要過關,大家都以為寫爬蟲就得到數據就好。可是有些行業需要快速得到處理好的大量數據,這時需要利用多台機器來進行爬取。


我現在從事雲計算平台的開發,mesos和rabbitmq還有redis,pg很多東西,我覺得在爬蟲同樣都適用。因為爬蟲寫好後,你就可以去喝咖啡了,它自動化進行爬。

為何抵觸爬蟲?

1. 很暴力看到想吐的Python爬蟲

因為一些學而不精的人在知乎很暴力的宣傳Python爬蟲,搞得好像Python就只能搞爬蟲一樣,滑稽。而且,都是一些機械化代碼片段。比如,啥的要帶頭部,啥的要怎麼F12找JSON,怎麼加CooKie,怎麼加代理。

我曾經也這麼做過,就是寫了一個Python爬取淘寶天貓搜索框商品和圖片的命令行工具,還寫了很仔細的文章在博客園:簡單的抓取淘寶關鍵字信息、圖片的Python爬蟲|Python3中級玩家:淘寶天貓商品搜索爬蟲自動化工具(第一篇) - 一隻尼瑪 - 博客園


markdown版本的在Python3中級玩家:淘寶天貓商品搜索爬蟲自動化工具(第一篇)


工具在Github 上:hunterhug/taobaoscrapy 竟然star好多星,現在沒維護,應該是沒法用,這個工具不是我心血來潮寫的,而是我在大型國內電商公司實習,專門寫的工具。是有用的!


你仔細看一下我的文章,你會發現我啥都說了,而且還很詳細,然而這不是重要。

人們要看的是結果,看這個工具有多牛逼,做到的東西是不是很好看,比如妹紙圖。

大家都樂於看到啥種子爬蟲,妹紙爬蟲,好玩的東西,並不關心爬蟲是什麼東西,所以你只能以最簡單,最除暴的方式來寫教程,這就是我現在為什麼不寫的原因。要寫爬蟲,就要推薦學語言,語言就只能是Python,滑稽。


因為檔次不同,知乎這個Python爬蟲風我覺得不應該抵觸,畢竟大家都不是專業出身,大家只是興趣。

只要有興趣,知乎Python爬蟲並不辣眼

2.低區趣味的爬蟲

Golang語言2009年第一版開始,現在很火,是谷歌的兒子,它是一門雲計算計算機語言,其實就是一門計算機語言,可以取代Python,滑稽,這裡是專指爬蟲哈,不要打我。學這門語言本人覺得對計算機專業的人很簡單,畢竟你學過C,知道指針的概念就很容易學會。


我根據Python的尿性,封了一個庫:hunterhug/GoSpider 超級覺得弱智,不是我弱智,而是原理離不開知乎的那些爬蟲們。


我仿照了大家喜歡的爬蟲:


煎蛋的妹紙圖,我寫了半個小時,優化了兩個小時:hunterhug/GoSpiderExample 做出來的結果是這樣的:

只要一點擊就一直抓圖片,所以只要是抓圖片的爬蟲,都是最簡單的爬蟲。所以,知乎上各種爬圖片的教程,是多麼的辣雞,可是我們還是要感謝他們為我們洗了眼。


人民群眾的內心是不在乎啥是分散式,所以我之前為了改變這一狀態,寫了一個利用簡單Redis抓文章的爬蟲的:hunterhug/GoSpiderExample 可是Redis這麼高級的東西,普通人是不懂的。


所以,知乎上的爬蟲家,我還是很敬佩的,你抵觸個毛,你有種就寫多點教程來改變,看起來我的代碼好弱智,可是大家看了後,也覺得弱智,這就是知乎的作用:娛樂

低級趣味也是一種娛樂

3. 可能違法爬蟲

我來講個故事。學爬蟲有的人是為了找工作,有的是為了興趣,我之前一段時間做過數據挖掘工程師,一個任務就是寫大型亞馬遜電子商務爬蟲:


開發過程很艱辛,因為老闆一直要求快快快,而且催得你要吐血,然而機器就那麼幾台,怎麼可能把整個亞馬遜爬下來。這段時間,幾乎想吐血,內心很譴責,爬蟲當工作,不好受的。

hunterhug/AmazonBigSpider

寫爬蟲,為了興趣可以,但是抵觸他的原因就是因為:

可能會違法!

違法的事不能幹,學習一下技術就行了。

4.代碼區

其實爬蟲和對接微博微信API的原理一模一樣,只不過不帶cookie,每次POST/GET還要需要進行驗證獲取token。


我抽象出一個核心包,然後有了一套完整的流程。所以微信開發的人也可以學爬蟲,可以參考我的庫:hunterhug/GoSpider 裡面有一個API對象叫NewAPI()

大家可以開下眼,爬蟲代碼是什麼樣的。


登錄知乎的代碼就這樣,對於有一定代碼功底的人是很簡單的:

package main

import (
// 第一步:引入庫
"flag"
"fmt"
boss "github.com/hunterhug/GoSpider/spider"
"github.com/hunterhug/GoSpider/util"
"strings"
)

// go run loginzhihu.go -email=122233 -password=44646
var (
password = flag.String("password", "", "zhihu password you must set")
email = flag.String("email", "", "zhihu email you must set")
)

func init() {
flag.Parse()
if *password == "" || *email == "" {
pw, e := util.ReadfromFile(util.CurDir() + "/data/password.txt")
if e != nil {
fmt.Println("命令行為空,且文件也出錯" + e.Error())
panic(0)
}
zhihupw := strings.Split(string(pw), ",")
if len(zhihupw) != 2 {
fmt.Println("文件中必須有email,password")
panic(0)
}
*password = strings.TrimSpace(zhihupw[1])
*email = strings.TrimSpace(zhihupw[0])
}
fmt.Printf("賬號:%s,密碼:%s
", *email, *password)
}
func main() {
// 第一步:可選設置全局
boss.SetLogLevel("debug") // 設置全局爬蟲日誌,可不設置,設置debug可列印出http請求軌跡
boss.SetGlobalTimeout(3) // 爬蟲超時時間,可不設置,默認超長時間
log := boss.Log() // 爬蟲為你提供的日誌工具,可不用

// 第二步: 新建一個爬蟲對象,nil表示不使用代理IP,可選代理
spiders, err := boss.NewSpider(nil) // 也可以使用boss.New(nil),同名函數

if err != nil {
panic(err)
}

// 第三步:設置頭部
spiders.SetMethod(boss.POST).SetUrl("https://www.zhihu.com/login/email").SetUa(boss.RandomUa())
spiders.SetHost("www.zhihu.com").SetRefer("https://www.zhihu.com")
spiders.SetFormParm("email", *email).SetFormParm("password", *password)

// 第四步:開始爬
body, err := spiders.Post()
if err != nil {
log.Error(err.Error())
} else {
log.Info(spiders.ToString()) // 列印獲取的數據,也可以string(body)
// 待處理,json數據帶有\u
context,_ := util.JsonEncode2(body)
// 登陸成功
log.Info(string(context))
}
}

而妹紙圖的代碼也是利用這個核心庫的,看:

package main

import (
"fmt"
"github.com/PuerkitoBio/goquery"
"github.com/hunterhug/GoSpider/query"
"github.com/hunterhug/GoSpider/spider"
"github.com/hunterhug/GoSpider/util"
"strings"
)

var (
types = map[int]string{
1: "ooxx", // 妹子圖
2: "pic", // 無聊圖
}

// 要抓哪一種
Which = 1

url = "http://jandan.net/" + types[Which]
urlpage = "http://jandan.net/" + types[Which] + "/page-%d"

// 保存在統一文件
saveroot = false
// 根據頁數保存在很多文件夾下
savehash = true

// 保存的地方
rootdir = "D:\jiandan\jiandansum" + types[Which]
// 根據頁數分圖片保存,不然圖片太大了,我簡稱它hash(之前版本不是用page分而是hash)!
// 圖片太大硬碟會爆!
hashdir = "D:\jiandan\jiandanpage" + types[Which]
)

func init() {
if savehash == false saveroot == false {
fmt.Println("這種是不行的:savehash==false saveroot==false!必須有一個為true")
}
// 設置日誌和超時時間
spider.SetLogLevel("info")
// 有些圖片好大!
spider.SetGlobalTimeout(100)
// 圖片集中地大本營
util.MakeDir(rootdir)
}

// 單只爬蟲,請耐心爬取好嗎
func main() {
// 初始化爬蟲
client, _ := spider.NewSpider(nil)
// 隨機UA
client.SetUa(spider.RandomUa())

// 開始抓取
client.SetUrl(url)
data, e := client.Go()

// 首頁都抓出錯,直接結束
if e != nil {
spider.Log().Panic(e.Error())
}

// 保存在本地看看
//util.SaveToFile(util.CurDir()+"/index.html", data)

// 解析查看頁數
doc, _ := query.QueryBytes(data)
temp := doc.Find(".current-comment-page").Text()
pagenum := strings.Replace(strings.Split(temp, "]")[0], "[", "", -1)
spider.Log().Info(pagenum)

num, e := util.SI(pagenum)
if e != nil {
spider.Log().Panic(e.Error())
}

// 頁數知道後,建文件夾!!
for i := num; i &>= 1; i-- {
util.MakeDir(hashdir + "/" + util.IS(i))
}

// 循環抓取開始
for i := num; i &>= 1; i-- {
index := fmt.Sprintf(urlpage, i)
client.SetUrl(index)
data, e = client.Go()
if e != nil {
spider.Log().Errorf("列表頁 %s 抓取出錯:%s", index, e.Error())
continue
}
spider.Log().Infof("列表頁 %s 完成!", index)
//util.SaveToFile(rootdir+"/"+util.ValidFileName(index)+".html", data)
doc, _ = query.QueryBytes(data)
doc.Find(".view_img_link").Each(func(num int, node *goquery.Selection) {
imgurl, ok := node.Attr("href")
if !ok {
return
}
//spider.Log().Infof("img:%s", imgurl)

// 去重 處理
temp := strings.Split(imgurl, ".")
tempnum := len(temp)
if tempnum &<= 1 { return } // 後綴 houzui := temp[tempnum-1] // 文件名 filename := util.Md5(imgurl) + "." + houzui // 大本營文件路徑 filedir := rootdir + "/" + filename // 頁數分圖 hashfiledir := hashdir + "/" + util.IS(i) + "/" + filename // 下面每次都會去掃描 // 大本營存在? exist := util.FileExist(filedir) // hash存在? exist2 := util.FileExist(hashfiledir) // 不保存hash且大本營存在 if !savehash exist { return } // 如果要保存hash if savehash { // hash不存在,大本營存在 if !exist2 exist { if !exist2 { // 讀出來 temp, e := util.ReadfromFile(filedir) // 出錯不管 if e != nil { return } // 寫,出錯不管 util.SaveToFile(hashfiledir, temp) return } // spider.Log().Infof("image file %s exist", filedir) return } // hash存在 if exist2 { return } } // 補充img url if strings.HasPrefix(imgurl, "//") { imgurl = "http:" + imgurl } // 抓取開始 client.SetUrl(imgurl).SetRefer(index) data, e = client.Go() if e != nil { spider.Log().Errorf("抓取圖片:%s 出錯:%s", imgurl, e.Error()) return } spider.Log().Infof("抓取圖片:%s 成功", imgurl) // 大本營保存 if saveroot { e = util.SaveToFile(filedir, data) if e != nil { spider.Log().Errorf("圖片保存: %s 出錯:%s", filedir, e.Error()) } else { spider.Log().Infof("圖片保存: %s", filedir) } } if savehash { e = util.SaveToFile(hashfiledir, data) if e != nil { spider.Log().Errorf("圖片保存: %s 出錯:%s", hashfiledir, e.Error()) } else { spider.Log().Infof("圖片保存: %s", hashfiledir) } } }) } }

總結

寫了這麼多,為何抵觸爬蟲,抵觸的不是爬蟲,而是那些很暴力,很暴力的,天天重複換網址爬,但是代碼都是片段式拷貝,導致你技能漲不起來的爬蟲教程。


還有,我們要抵觸違法的爬蟲,比如刷票!wo de 火車票被別人刷完了,我擦。。。還有,阿里搶月餅我們也要抵觸,ddos分散式攻擊我們也要抵觸,一些擦邊的。。。。。注意身體呀,少年。。。

推薦

我的好基友正在寫Python爬蟲教程,你可以看看:百哥么么噠|個人網站

我已經不寫教程了,雖然你也可以上來看看:搬磚の陳大師|一隻尼瑪技術博客

關於語言

---

爬蟲這種東西,我看過有老程序猿用C++寫,也有一些北大青鳥出來的PHP老手用PHP寫,因為就會PHP,其他沒心思去學。然後全民Python寫,Java也有一撥人寫。R語言和Matlab語言也可以寫。只要有符合HTTP協議的網路包,都可以寫。


我是用Golang寫的,畢竟我是Golang開發。

我推薦還是學Python寫吧,哈哈,畢竟全民。


回答一下最後一個問題

題主也算一個會寫一些小爬蟲的pythoner(比入門教程稍好一點點)(?_?),所以我很好奇為什麼爬蟲熱門了,但是進階的教程卻非常少呢?既然那麼多人吐槽入門爬蟲水,為何極少有人去寫不水的爬蟲教程呢?

若不是因為工作是寫爬蟲,則非常不值得深入研究,因為你會發現 80% 的時間都花在處理那些之占 1% 的 corner case 上,實際上對你提升有限。

知乎的 Python 初級爬蟲教程多,人的原因是最主要的。說得刻薄點,因為這些人視野狹窄,除了爬蟲根本不知道還有啥別的可做。而且他們寫文章也不是想教你技術,而是吸引小白眼球,開班收稅。


我不反對爬蟲,本身我就是個寫爬蟲用python的技術low逼。但是,那些整天分享一堆怎麼爬妹紙圖的,連個翻頁都寫不6,更別說增量爬取了,反爬?那更不用想了。
再回到一個很世俗的問題來,你爬的這數據能變現么?有價值么?
雖然我寫的爬蟲又難看,技術又low,但是還是有客戶買嘛,畢竟有200多部熱播劇在各視頻,社交站用戶數據。
數據拿回來才是個開始,清洗就是個大工作,各類格式各類來源清洗方式都不一樣,得統一了吧,從豆瓣的標註性數據做個情感分析模型,勉強也為能公司節省了不少成本嘛,現在做topic model,深挖點信息給客戶,再展開一些數據的趨勢,不同數據維度聯動,會發展一些數據展現有意思信息,跟著就這些信息提出feature又能做不少事了,只是想說能做的事很多,謝謝


我覺得如果學統計做出來的爬蟲並不需要那麼複雜的系統,有時候爬取的數據量並不大都不會觸發到反爬取系統。知乎上面的簡單爬蟲就夠了。
他們本身就不是企業級開發的需求,你們說的那麼複雜幹嘛。。。

舉個例子去nba官網爬數據做分析,滿打滿算能有多少數據。我記得一年的球員加起來就幾百個,十年二十年也就幾千個。鏈家的數據我也爬過,自己還確認過,一個城市2000個小區,幾萬個成交信息。在另一個知乎回答,我看到有人說鏈家很多數據,如果沒有得到授權是不允許公布到網上的,所以數據量也沒那麼大。

做統計爬蟲只是第一步,而剩下來的分析則是更重要的。

我覺得知乎上的爬蟲只有爬取數據這一塊,而很少涉及分析,這個不太好


  更新一下,有人在評論區問是不是為了寫一個能用的爬蟲就需要補幾個月的基礎。這個問題是顯而易見的。這就好比你突然想吃一頓炸雞,但是你自己不會。你就去了K記買了吃。但是如果你有一些烹飪基礎你覺得自己可以做,然後嘗試著按照各種支離破碎的帖子拼拼湊湊弄了一個方子做了一份炸雞,可是味道就是不好吃,然後你去問你的廚師朋友為什麼你做出來的不好吃,廚師問你怎麼做,你拿出一份東拼西湊弄出來的方子給廚師看,方子裡面有很多邏輯不通的地方,廚師告訴你,你還是先知道每樣調料是幹什麼用的再說吧。你問廚師,我就為了吃個炸雞,難道還要去認幾個月的調料?

  顯然是一樣的道理,你不去自己做炸雞因為你認為自己做不好,你自己去寫爬蟲是因為你認為自己能寫的好,不要太低估專業的力量,那些職業的碼農為了現在能輕輕鬆鬆寫好這個東西,為了可以應對各種形形色色的意料之外的情況,在此之前已經學習了可能數年,你指望用幾天時間搞定人家幾年學的東西當然不現實,更何況,在對於一個知識理解不深的情況下就去斷定一個東西的天花板也是不合適的。

  如果不想花太多時間,那麼不如就去找一個寫爬蟲的朋友,如果項目很小,請人家吃頓飯讓人家幫你寫,項目大就支付一些報酬,這樣節約時間,質量也有保障。如果堅持覺得自己可以做好,那就請從相關的基礎知識開始了解一下再寫吧。

=====分割線=====

  並不是對寫爬蟲的人不友好,很多所謂寫爬蟲的人連GET和post都分不清,天天拿著一段半殘的代碼神神秘秘問你錯在哪了。每次看到這樣的我都會咬著牙告訴他,你需要的是去補補基礎知識,而不是照著網上那些零散的教程去寫什麼勞什子爬蟲。不成體系的知識結構真的很蛋疼。


無端給網路增加無用流量著實討厭。這種行為和早高峰無意義的老人卡出行是一樣性質


你們python還好只是爬蟲,我們前端全都是培訓的…


我寫過兩篇關於爬蟲進階的文章,但是都沒發布到知乎上。打算等時間充裕了,可能會再寫部分爬蟲進階的文章。爬蟲入門的文章實在是太多了,所以我並沒有寫比較基礎的文章。但是我覺得題主說的『抵觸爬蟲』,還是過了一些。爬蟲這種東西,說實話,真的比較好上手。入門編程的同學,需要的就是一些可以不是很費力就做得出、看得見的成就,而爬蟲就是滿足這個條件的一個選擇。一個初學者看到自己寫的程序可以嗖嗖的從網上拿到數據,那將會是一個非常大的正向鼓勵。所以說爬蟲技術會很熱門,因為那些教程的受眾是初學者。

另外,題主說的『一些知乎大V和技術大V的回答和專欄中對爬蟲的評價並不友好』,我覺得大V們並不是真的抵觸爬蟲技術,大家抵觸的應該是打著教爬蟲技術的名號搞營銷的營銷號,這類號發的爬蟲文章質量參差不齊,很可能會誤導初學者。此外,我覺得寫爬蟲的人,會很容易走入一個舒適區,成天爬一些沒啥難度的web頁面,或者反爬蟲機制很弱甚至幾乎沒有的網站。在舒適區里,人的進步就會很慢,也不會去想怎樣才能取得長足的進步。這個應該也是技術大V們看到那麼多入門級的爬蟲文章而痛心的原因之一(痛心可能重了點,不過反感甚至厭惡肯定是有的)。

爬蟲技術確實是容易看到天花板,但是也不像有的同學說的真的是那麼簡單,深入研究下去你也會發現有很多東西可以學到,因為爬蟲技術需要攻克的是對方的反爬蟲機制,這是人與人之間的較量了。舉個例子來說吧,以前我做過一個特別棘手的網站爬蟲,其實就是幫乙方測試它們的反爬蟲系統。它們的反爬蟲系統包括了動態RSA生成token和JS代碼混淆,你連怎麼生成下一個url都很難想到。如果用selenium等自動化工具的話,那好,人家也做了檢測自動化工具的工作,你用selenium驅動瀏覽器根本就打不開對方的網頁。我覺得這個難度應該是不小了吧,也是能學到一些東西的。不過要見效快嘛,要能吸引小白嘛,誰靜得下心來做難度這麼大的數據抓取呢,更別說經驗分享了。所以說出現了各種『老司機』,一直爬些妹子圖,我覺得這個真的只是噱頭,能給讀者的乾貨不多。第一個爬妹子圖並分享經驗的我覺得是創造力,但是第二個甚至第一萬個嘛,爬是可以,要是成天分享這些的話,我覺得真的是太low了,明顯也是誤導初學者嘛。成天爬知乎和豆瓣的同學我覺得也是,該走出舒適區了。如果不是以數據分析為目的,而單純是想練習爬蟲的話,我建議可以爬爬微博試試,你會遇到很多問題,尤其是PC端的微博。它的複雜程度絕對比爬知乎和豆瓣要高很多。


所以,這裡奉勸一些以爬蟲入門的小白,一定不要只滿足於你可以抓數據,成天做些難度很小的爬蟲。在熟悉爬蟲是個什麼東西過後,需要突破舒適區,去尋找下一個可以提升的點。比如研究微博或者QQ空間的模擬登陸啊,研究如何構建一個分散式爬蟲啊,研究如何自己實現一個爬蟲框架或者閱讀優秀的爬蟲框架源碼啊。完成這些真的比一直滿足於做些小爬蟲提升要快得多。這些經驗分享出來,別人也不會覺得很low,而是乾貨滿滿。


----

這是我寫的兩篇關於模擬登陸的文章,分析了微博和百度雲的模擬登陸,有興趣的同學可以看看

超詳細的Python實現新浪微博模擬登陸(小白都能懂) 超詳細的Python實現百度雲盤模擬登陸(模擬登陸進階)

還有一個分散式微博爬蟲,這個還在開發中,你能想到的關於微博的數據抓取我都已經實現了,下一步將是如何進行大規模採集。這個項目的難點就在於頁面模塊解析(包括各個不同的模版的異常處理)和微博反爬蟲策略上。

ResolveWang/WeiboSpider


不說抵觸爬蟲,就說一點,麻煩寫爬蟲的人把代碼寫對再說,一個介面你爬了無數次,伺服器返回了無數次錯誤,麻煩你,解析的時候也把返回的錯誤解析一下,儘管你那個不會給後台造成啥壓力啥的,但是我從後台看監控就是莫名的尷尬啊~~~~~

還有,敢不敢換個語言寫爬蟲,現在一提Python就是爬蟲,一說爬蟲就是Python,膩不膩啊


不不不,我不抵觸爬蟲,我抵觸的是把去麥當勞買了包薯條說自己學會做炸雞的


正經的爬蟲架構涉及到Web方方面面,天花板確實不高但不失為入門的好練手項目。

問題是這些個教程講的東西基本都是自己隨便翻翻資料一下午搞完的東西,一遍又一遍翻出來重複重複又重複,不嫌煩嗎?受眾如此大,難道大家都不會自己找資料只有被動餵食嗎?


回復一下

我新搭了個網站,讓師傅們試一試能不能打到我伺服器的許可權

娛樂而已23333,主要是在掃我目錄


=========


不請自來

主要是我手賤,加了句


&

然後一覺起來

看了下時間也就集中在一兩個小時

在回答這個問題的幾分鐘又加了幾百條

一個劣質爬蟲和這個差不多

伺服器配置低的直接就掛了


鄙視鏈而已,都不是小孩子了,又不是第一次見

有人扯什麼企業級,想裝逼直說,這屬於還沒爬到井口就鄙視同井的井友了,不厚道


推薦閱讀:

如何高效學習python的某一個包?
請問scrapy源碼的入口是哪個?

TAG:Python | 編程 | 爬蟲計算機網路 | scrapy | Python教程 |