【工作】淺談爬蟲

本來(lái)想繼續(xù)寫Go方面的灼芭,不過由于五一節(jié)前收到需要爬取3個(gè)網(wǎng)站的一些數(shù)據(jù),那就剛好總結(jié)一下。文章講的都是很基本讓你大概知道爬蟲是個(gè)什么東西用來(lái)做什么的效诅,適合新手入門,之后有可能會(huì)逐步加深功能趟济,譬如多線程乱投,隊(duì)列,深網(wǎng)爬取顷编,反爬等篡腌。

一句話概括爬蟲

利用Http、Https協(xié)議模擬人操作將開放性的web傳輸內(nèi)容保存到本地中勾效。

爬蟲準(zhǔn)備
  • 開發(fā)語(yǔ)言(這次用C#寫)
  • 目標(biāo)數(shù)據(jù)
開始爬取案例一

這次需要爬取的是平行進(jìn)口車的數(shù)據(jù)
  1. 分析網(wǎng)頁(yè)的數(shù)據(jù)來(lái)源

    首先了解需求之后打開F12嘹悼,看到有好多數(shù)據(jù)請(qǐng)求會(huì)影響我們分析有用的數(shù)據(jù)來(lái)源,所以一般可以直接選擇XHR看接口层宫,這樣就可以篩走很多不需要的請(qǐng)求杨伙,最終定位到這個(gè)接口是我們所需要的。
    請(qǐng)求接口
    既然知道了是哪個(gè)接口萌腿,請(qǐng)求頭的信息也知道了限匣,那么就可以模擬發(fā)送請(qǐng)求了。
    請(qǐng)求頭信息
  2. 代碼爬取
    由于是工作匯總毁菱,所以這次就直接用內(nèi)部的類庫(kù)了米死,但是基本邏輯是一樣的(訪問請(qǐng)求地址,發(fā)送參數(shù)贮庞,得到內(nèi)容峦筒,解析內(nèi)容)這里需要做一步escape解析得到中文。
var html = "";
var postUrl = "http://*************/conditionList?version=v2.0";
var postData = "page_size=200&price_range=&pbid=&page=1&mtat=&level=&import=3&drive=&displacement=&bodywork=";

html = client.POST(postUrl, postData).HTML; //請(qǐng)求接口并接收返回內(nèi)容
html = UAP.Function.String.EscapeDecode(html); //這里需要做escape解析

if (string.IsNullOrWhiteSpace(html)) //判斷內(nèi)容是否為空
{
    Console.WriteLine("html is null");
    return;
}

var data = UAP.JSON.Parse(html); //解析成為JSON
if (!(data.Int("code") == 200 && data.Boolean("success"))) //判斷接口是否正常
{
    Console.WriteLine("code or success not match");
    return;
}

var list = data["data"]["list"];
var dt = new UAP.Data.DataTable(list);
if (dt.Rows.Count <= 0) //數(shù)據(jù)是否有值
{
    Console.WriteLine("dt count is 0");
    return;
}
CAR.DB.admin.Once().Inserts("table", dt); //入庫(kù)

這種是最簡(jiǎn)單的爬取接口直接返回json沒有做cookies驗(yàn)證或者sign之類的窗慎,所以基本上這就已經(jīng)完成一個(gè)爬取需求了物喷。

接下來(lái)案例二

第二個(gè)案例同樣是需要爬取車型數(shù)據(jù),至于有什么特殊我們接下來(lái)看

同樣的遮斥,打開F12 -> XHR 看接口
可是WFT峦失??术吗?什么內(nèi)容都沒有尉辑,這是為什么呢?原因有兩種较屿,第一種是靜態(tài)HTML隧魄,第二種數(shù)據(jù)從后臺(tái)加載出來(lái)的前端沒有直接訪問數(shù)據(jù)接口实幕,那么我們需要怎么做才能拿到這個(gè)數(shù)據(jù)呢。

step 1. 右鍵查看源代碼堤器,發(fā)現(xiàn)我們需要的內(nèi)容都存在昆庇,這就好辦了。

step 2. 寫代碼利用webclient用get請(qǐng)求這個(gè)網(wǎng)站得到內(nèi)容

var html = "";
var postUrl = "";
List<object> ls = new List<object>();

postUrl = "http://*************/meiguiche/";

html = client.GET(postUrl).HTML; //獲取數(shù)據(jù)
html = Regex.Replace(html, @"\s*\n\s*", ""); //關(guān)鍵去掉多余空格和換行

var matchs = Regex.Matches(html, @"<a href=.(http://www.*********.com/\d+/meiguiche/).>(.*?)</a>");
if (matchs.Count == 0) //判斷正則匹配是否有值
{
    Console.WriteLine("matchs is null");
    return;
}
foreach (Match match in matchs)
{
    ls.Add(
        UAP.JSON.NEW
        .Add("id", match.Result("$1").RegexGetResult(@"(\d+)"))
        .Add("name", match.Result("$2"))
        .Add("url", match.Result("$1"))
    );
}
if (ls.Count == 0)
{
    Console.WriteLine("ls count is 0");
    return;
}
CAR.DB.admin.Once().Inserts("table", new UAP.Data.DataTable(ls)); //入庫(kù)

這時(shí)候捕捉數(shù)據(jù)需要用到正則表達(dá)式做匹配處理闸溃,至于怎么用這里就不多說(shuō)了整吆。

題外話 爬取數(shù)據(jù)要注意的事項(xiàng)
  • 注意爬取的時(shí)間間隔,避免被封IP或者導(dǎo)致別人的服務(wù)器奔潰辉川;
  • 用到正則爬取表蝙,最好把多余的空格換行去掉,方便寫正則匹配乓旗;
  • 保存數(shù)據(jù)到庫(kù)里面的時(shí)候不要每條都操作dbinsert府蛇,最好一批dbinsert;
  • 多些判斷驗(yàn)證條件可以讓你思考問題更加嚴(yán)謹(jǐn)屿愚,從而形成習(xí)慣汇跨、積累經(jīng)驗(yàn);
  • 爬取時(shí)盡量保存更多有用字段數(shù)據(jù)而不是局限于需求提出的字段這樣可以避免二次爬取的煩惱妆距;

coding不難穷遂,用更多的時(shí)間思考問題,才能減少敲鍵盤的時(shí)間娱据。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚪黑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子中剩,更是在濱河造成了極大的恐慌忌穿,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件结啼,死亡現(xiàn)場(chǎng)離奇詭異掠剑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妆棒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門澡腾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人糕珊,你說(shuō)我怎么就攤上這事∫阍悖” “怎么了红选?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)姆另。 經(jīng)常有香客問我喇肋,道長(zhǎng)坟乾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任蝶防,我火速辦了婚禮甚侣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘间学。我一直安慰自己殷费,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布低葫。 她就那樣靜靜地躺著详羡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘿悬。 梳的紋絲不亂的頭發(fā)上实柠,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音善涨,去河邊找鬼窒盐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钢拧,可吹牛的內(nèi)容都是我干的登钥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼娶靡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼牧牢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起姿锭,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤塔鳍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后呻此,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轮纫,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年焚鲜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掌唾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忿磅,死狀恐怖糯彬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葱她,我是刑警寧澤撩扒,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站吨些,受9級(jí)特大地震影響搓谆,放射性物質(zhì)發(fā)生泄漏炒辉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一泉手、第九天 我趴在偏房一處隱蔽的房頂上張望黔寇。 院中可真熱鬧,春花似錦斩萌、人聲如沸缝裤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倘是。三九已至,卻和暖如春袭艺,著一層夾襖步出監(jiān)牢的瞬間搀崭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工猾编, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘤睹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓答倡,卻偏偏與公主長(zhǎng)得像轰传,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘪撇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348