记一次企业级爬虫系统升级改造(一)
?
項目緣由:
公司一直有一個半死不活的爬蟲系統(tǒng),在爬取著市面上競爭公司官網(wǎng)的一些活動、文章等內(nèi)容。
由于該系統(tǒng)的開發(fā)人員已離職快兩年,多次經(jīng)手,現(xiàn)已基本失去爬取能力,每周的報表都得靠人工匯總。
在我們這個以移民業(yè)務(wù)為主,IT部門隸屬于后勤服務(wù)的所謂的大企業(yè)的子公司里面,英勇的前任leader滿口答應(yīng)高層可以對這個系統(tǒng)進行重新規(guī)劃改造,來support公司業(yè)務(wù)(主要就是爬取別人家的活動信息,自己的銷售悄悄跑過去搶客戶,順帶爬取別人的優(yōu)秀文章發(fā)在自己的相關(guān)產(chǎn)品里面...等等)。
好吧,這些本就與我無關(guān)。但可憐的我躲角落里還是中槍了,前任leader幾個關(guān)鍵詞一列,會議上隨便一吹,這個偉大而光榮的任務(wù)就落在我頭上了......
最主要是我手上還有其他小矮人(介紹一下:我們這個服務(wù)型IT部門,有“一個白雪公主,10幾個小矮人”的項目需要支持)在進行中。
申請人員,沒有!申請資源,沒有!申請需求,沒有!什么?現(xiàn)有爬蟲項目的交接?能找到源碼就不錯了,要啥交接!...
本就不堪一擊的一件事,偶遇leader在項目啟動前離職(所以叫前任),獨剩我一個人孤苦伶仃。
當(dāng)然,我們出來混程序的,有所為有所不為!抱怨過后,該干還得干,心里還得美滋滋的想著“這是領(lǐng)導(dǎo)們對我能力的一種信任”,都是為了生活啊...
程序員可以讓步,卻不可以退縮,可以羞澀,卻不可以軟弱,總之,程序員必須是勇敢的。
?
現(xiàn)有舊爬蟲系統(tǒng)分析:
時間緊迫,簡單的梳理了現(xiàn)有爬蟲系統(tǒng)代碼:
1.系統(tǒng)整體構(gòu)架是一個權(quán)限管控系統(tǒng),爬蟲相關(guān)功能只占整體的20%不到(具體當(dāng)時的緣由未知)
2.爬蟲功能有兩套方法共存:正則表達式與AngleSharp
3.代碼基本規(guī)范,解析活動數(shù)據(jù)方法較死,冗余在爬取方法里面
貼兩個主要類出來秀一秀,讓它們也見見光,畢竟是以前的工程師花了心血的。
1 /// <summary> 2 /// 抓取詳細頁面 3 /// </summary> 4 /// <param name="Url"></param> 5 /// <param name="titleRule"></param> 6 /// <param name="mainRule"></param> 7 /// <returns></returns> 8 public void GrabPage(string Url, GH_Crawlar_GraspRule gH_Crawlar_GraspRule,string defaultXmlPath, string replaceStrXmlPath, string creator) 9 { 10 try 11 { 12 HttpHelper httpHelper = new HttpHelper(); 13 string result = httpHelper.RequestResult(Url, "GET", EnumHelper.GetEnumDescription((Charset)gH_Crawlar_GraspRule.Charset)); 14 15 gH_Crawlar_GraspRule.TitleRule = gH_Crawlar_GraspRule.TitleRule.Replace("\\", ""); 16 string[] strTemp = gH_Crawlar_GraspRule.TitleRule.Trim().Replace(@"\[", "[").Split('$'); 17 string titleRule = gH_Crawlar_GraspRule.TitleRule.Trim().Replace("$", "(.*?)"); 18 Regex regTilte = new Regex(titleRule.Trim(), RegexOptions.Singleline); 19 20 string titlt = StringHelper.ClearHtml(regTilte.Match(result).Value.ToString()); 21 Regex mainRegex = new Regex(gH_Crawlar_GraspRule.MainRule.Trim(), RegexOptions.Singleline); 22 string _Content = mainRegex.Match(result).Value; 23 24 _Content = StringHelper.Filter(_Content); 25 26 string address = string.Empty; 27 string city = string.Empty; 28 string time = string.Empty; 29 string tel = string.Empty; 30 string didian = string.Empty; 31 string dizhi = string.Empty; 32 //pkid ==1 33 //if (article.Pkid == 1) 34 //{ 35 string titlt2 = StringHelper.ClearHtml(regTilte.Match(_Content).Value.ToString()); 36 37 if (!string.IsNullOrEmpty(titlt2)) 38 { 39 titlt = titlt2; 40 } 41 42 //清理標題規(guī)則字符 43 if (!string.IsNullOrEmpty(titlt)) 44 { 45 foreach (string temp in strTemp) 46 { 47 if (!string.IsNullOrEmpty(temp)) 48 { 49 titlt = titlt.Replace(temp, ""); 50 } 51 } 52 } 53 54 string[] obj = GetFilter(_Content, defaultXmlPath, replaceStrXmlPath); 55 56 address = obj[0]; 57 time = obj[1]; 58 tel = obj[2]; 59 60 //判斷地區(qū) 61 int region = (int)Regional.Other; 62 city = GetArea(titlt, address, out region); 63 64 //新增抓取信息 65 GH_Crawlar_GraspInfo gH_Crawlar_GraspInfo = new GH_Crawlar_GraspInfo(); 66 GH_Crawlar_GraspInfoLogic gH_Crawlar_GraspInfoLogic = new GH_Crawlar_GraspInfoLogic(); 67 68 //時間處理 69 List<string> times = GetTimes(time); 70 gH_Crawlar_GraspInfo.FullTime = time; 71 gH_Crawlar_GraspInfo.StartDay = string.IsNullOrEmpty(times[0]) ? "" : times[0]; 72 gH_Crawlar_GraspInfo.StartTime = string.IsNullOrEmpty(times[1]) ? "" : times[1]; 73 gH_Crawlar_GraspInfo.WeakDate = string.IsNullOrEmpty(times[2]) ? "" : times[2]; 74 gH_Crawlar_GraspInfo.Title = titlt.Trim(); 75 gH_Crawlar_GraspInfo.Url = Url; 76 gH_Crawlar_GraspInfo.Region = region; 77 gH_Crawlar_GraspInfo.Address = string.IsNullOrEmpty(address) ? "暫無" : address; 78 gH_Crawlar_GraspInfo.Area = city; 79 gH_Crawlar_GraspInfo.ArticleType = GetType(titlt.Trim()); 80 gH_Crawlar_GraspInfo.DistributionGroup = GetsSelas(city); 81 gH_Crawlar_GraspInfo.Tel = string.IsNullOrEmpty(tel) ? gH_Crawlar_GraspRule.Telephone : tel; 82 gH_Crawlar_GraspInfo.Creator = creator; 83 gH_Crawlar_GraspInfo.CreateTime = DateTime.Now; 84 gH_Crawlar_GraspInfo.CatalogID = gH_Crawlar_GraspRule.CatalogID; 85 gH_Crawlar_GraspInfo.State = (int)State.Enable; 86 gH_Crawlar_GraspInfo.FullContent = result; 87 gH_Crawlar_GraspInfo.Deleted = false; 88 gH_Crawlar_GraspInfo.RuleID = gH_Crawlar_GraspRule.RuleID; 89 90 //根據(jù)標題和地址時間判斷如果存在不插入 91 if (!string.IsNullOrEmpty(titlt)) 92 { 93 List<GH_Crawlar_GraspInfo> gH_Crawlar_GraspInfos = gH_Crawlar_GraspInfoLogic.GetAll(x => 94 x.RuleID == gH_Crawlar_GraspInfo.RuleID && 95 x.Title == titlt.Trim() && 96 x.Address == gH_Crawlar_GraspInfo.Address && 97 x.FullTime == time && 98 x.Deleted == false).ToList(); 99 if (gH_Crawlar_GraspInfos.Count == 0) 100 { 101 gH_Crawlar_GraspInfoLogic.Add(gH_Crawlar_GraspInfo); 102 } 103 } 104 } 105 catch (Exception ex) 106 { 107 throw ex; 108 } 109 110 111 } View Code
編程是一種單調(diào)的生活,因此程序員比普通人需要更多的關(guān)懷,更多的友情。
?
新爬蟲系統(tǒng)規(guī)劃:
公司懂這一方面的人幾乎沒有,我也僅限于在博客園偶爾看看各位大拿的相關(guān)文章,自己也就給自己的小網(wǎng)站爬過點美女圖片...
要真說到一個企業(yè)級的爬蟲系統(tǒng),我想整體規(guī)劃里面爬蟲相關(guān)占比應(yīng)該不到30%才對。
畢竟,公司做一個爬蟲系統(tǒng)的目的絕不是為了簡單的爬取一些數(shù)據(jù)。
我分析的一個企業(yè)級的爬蟲系統(tǒng)應(yīng)該具有的主體功能如下(還請各位資深人士多多指教):
1.爬取指定數(shù)據(jù)
2.規(guī)則化爬取到的數(shù)據(jù)(這一點很重要,就像我們爬取到的活動類文章,是需要在內(nèi)容中準確提煉出活動時間、活動地點、參會人數(shù)、活動類別、主講嘉賓等信息的)
3.數(shù)據(jù)報表分析、自動郵件訂閱推送
4.文章全文檢索(活動以外的文章數(shù)據(jù),可以作為整個行業(yè)的時訊基庫存在,將成為企業(yè)其他網(wǎng)站、微信等文章資源的來源)
5.基本統(tǒng)計分析
6.輔助決策支持(當(dāng)然,這一點肯定是大BOSS門提出來的啦~~)
在與boss碰頭一兩次后,做了這個系統(tǒng)的第一份頭腦風(fēng)暴圖:
經(jīng)過一番講解與討論(我也不確定,boss們是否聽明白了我的方案),boss們拍板“沒啥大問題,給你一個月自己去做吧,做完拿出來給我們用”。
對,你沒聽錯,就是一個月,還是在我手上有其他項目,并且不給任何資源的情況下,當(dāng)時就淚崩在現(xiàn)場!
不過上有政策,下有對策,人總不能被尿憋死!
于是乎過了兩天,我又新給出了更具體的方案:
1.新系統(tǒng)職能主要是數(shù)據(jù)支持,不再是單一的爬蟲系統(tǒng),取了一個高大上的名字“Support云”
2.抽象的數(shù)據(jù)處理流程圖
3.對boss更加抽象的最終服務(wù)方案圖
再配上一張規(guī)劃排期的excel表格。順利的與boss暢談個把小時,最終確定按我的排期,第一個月只做排期表的第一版功能。
歐耶~~目的終于達到,不然穩(wěn)妥妥的自己把自己加班加死最后還撈不著好!
非優(yōu)秀的程序員常常把空間和時間消耗殆盡,優(yōu)秀的程序員則總是有足夠的空間和時間去完成編程任務(wù),而且配合近乎完美。
項目進展:
當(dāng)前已正式啟動,博主已開始進行新爬蟲系統(tǒng)項目的搭建。
每周都會發(fā)一篇博客記錄相關(guān)的方案與框架代碼,直至項目最終上線,歡迎大家來吐槽~~~
?
我們應(yīng)該重視團隊的精神,一個人作用再大,也不過是一碗水中比較大的一粒水珠而已。
這句話送給現(xiàn)在的boss!!!
?
原創(chuàng)文章,代碼都是從自己項目里貼出來的。轉(zhuǎn)載請注明出處哦,親~~~
轉(zhuǎn)載于:https://www.cnblogs.com/csqb-511612371/p/6112844.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的记一次企业级爬虫系统升级改造(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Matlab图片改颜色通道不改名存储
- 下一篇: 如何给容器服务的Docker增加数据盘