【C#】爬取百度貼吧帖子 通過貼吧名和搜索關鍵詞

背景:最近喜歡看百度貼吧,因爲其內容大多都是吧友的真實想法表達等等原因。但是通過網頁去瀏覽貼吧,始終覺得不夠簡介,瀏覽帖子的效率不高,自己就萌發了通過自己爬取貼吧感興趣的關鍵字內容,自己寫了個winform客戶端,目前大致能瀏覽帖子了。
成果簡陋:

 

總結:
這個我做的十分的簡陋,沒啥說的,我自己感覺,就解析dom節點比較費時,要觀察網頁,不同的貼吧名,搜索結果的展示dom節點是不一樣的,所以要找到合適的xpath去解析想要的信息,用的庫就是 HtmlAgilityPack,這個沒有那種使用瀏覽器內核的庫複雜,完成這種值爬取文字信息的我認爲對我來講是夠用的了。
說起xpath的使用,其語法 分爲單斜槓、雙斜槓、中括號屬性名查找。比如說:
/div[1]/div[2]就是從根開始匹配第一個div下面的第二個div子節點。用單斜槓我的理解是隻能向dom一級一級的匹配。而雙斜槓能從任意未知匹配,比如:
//div[@id="postContent_123"]表示查找dom節點中任意id爲雙引號內容的節點。使用時注意,如果時在某個自己點調用查找單個節點時,比如:
node.GetSingalNode("//div[@class=\"p_post\"]"),這個不會從node這個節點下面去找,依然是全文的dom查找。
 
獲取html文檔,可以使用這個包自帶的HtmlWeb類,也可以自己寫RequestHelper封裝一下,注意網頁編碼,目前貼吧搜索頁是gbk,帖子內容是utf-8。
這裏還有個坑,帖子樓層下得回覆消息是異步得,那麼從獲取html網頁的方式獲取不到這些回覆,只會得到一張img的標籤dom,但是通過F12查看,發現所有的回覆都是一個請求返回的json,樓層的pid和json的回覆對應。
newtownsoft.json 也有根xpath類似的語法,比較好定位某個屬性的值。因爲這個回覆json有的關鍵屬性是數字,所以我沒有設計類去接收json字符,而是使用jsonobject。
 
這個貼吧有反爬機制,有圖片驗證,目前我還不能一次性永久解決,但短暫的辦法,我的是加上cookie和userAgent,可以試試,在瀏覽器出現需要驗證的情況去看看cookie,用排除法去找到關鍵的cookie。這個用上了,不久後又會需要驗證,在更換哈cookie的值或者useragent的值就好了。如果用htmlWeb就沒這麼靈活了,用自己的請求類我覺得還是比較好點。
 
做的時候,爲了調試方便,寫單元測試是個不錯的方法,不需要界面操作,可以提高效率。核心方法直接封裝成一個類,直接調用方法就行,因爲這個簡單沒啥界面的複雜交互,所以寫單測也好寫。
 
做界面設計渲染的時候,使用了自定義控件,flowlayoutpanel比panel要方便。主要是測試前,可以提前序列化一批真實的帖子數據,測試界面時,就使用序列化的靜態數據,這樣降低了觸發驗證的風險,也能加快效率。
 
最後這個做的很簡陋,心頭其實是害怕自己沒能力再把這個程序做得更好,所以就沒有再繼續嘗試優化了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章