申明:本文出自我自己的微信號(hào)python1024,屬于個(gè)人原創(chuàng)。
先看下代碼目錄結(jié)構(gòu):
有三個(gè).py文件,map_craw.py、stat.py、store.py分別的功能是爬取數(shù)據(jù)、數(shù)據(jù)分析、將爬取的數(shù)據(jù)存儲(chǔ)入mysql數(shù)據(jù)庫(kù)中,由于stat.py還沒(méi)寫完,這篇文章主要講數(shù)據(jù)的爬取與存儲(chǔ)。
這里的地圖就是baidu map,如果是沒(méi)有爬蟲基礎(chǔ)的同學(xué)先到CSDN里面搜一下,安裝個(gè)Chrome瀏覽器,順便在瀏覽器的右上角更多中找到更多工具—>擴(kuò)展程序選項(xiàng)將JSONView擴(kuò)展程序安裝一下。
要想爬取數(shù)據(jù)首先要分析網(wǎng)站中你想要的數(shù)據(jù)在那里,有的可能直接就在前端接口頁(yè)面中獲取到,有的可能需要請(qǐng)求后端的接口。如果請(qǐng)求的是前端頁(yè)面的接口,請(qǐng)求完以后需要對(duì)前端頁(yè)面進(jìn)行解析、提取拿到你想要的信息。常用的頁(yè)面解析python包有xml、beautiful(bs4)等,提取的方式包括xpath定位、select選擇器、CSS選擇器等。通常在解析包里可以調(diào)用接口函數(shù)實(shí)現(xiàn)這幾種提取方式。如果是請(qǐng)求后端接口的話,搞懂請(qǐng)求類型是get、post的哪一種(很簡(jiǎn)單在headers里查看一下Request Method即可),然后分析url的Query String Parameters參數(shù)。找到規(guī)律后,查看Reponse返回的類型。如果是html頁(yè)面,那就和前端一樣的方法去解析提取,如果返回的是JSON數(shù)據(jù)格式,你需要解析JSON數(shù)據(jù)得到你想要的信息(超級(jí)簡(jiǎn)單啊)。
我們這次爬取的信息就從搜索關(guān)鍵詞火鍋后所有城市的火鍋店的信息。包括名稱、地址、人均消費(fèi)、電話、評(píng)論條數(shù)、全部評(píng)價(jià)分?jǐn)?shù)等。
這次map的數(shù)據(jù)返回格式就是JSON。在Chrome瀏覽器中,右鍵點(diǎn)擊檢查Inspect,找到Network并點(diǎn)擊,然后選擇XHR選項(xiàng)。刷新一下抓取到一些數(shù)據(jù)包。首先找到哪些包返回的reponse包含你所需要的信息,然后查看這些包的Request請(qǐng)求中url的Query String Parameters參數(shù)的規(guī)律,找到這些規(guī)律你才能爬取所有頁(yè)面的數(shù)據(jù)。
我們來(lái)看下面的代碼,頂部是導(dǎo)的一些包,中間兩句是連接數(shù)據(jù)庫(kù)的下面講,def是定義了一個(gè)work的函數(shù),用來(lái)執(zhí)行爬取的步驟。for語(yǔ)句是一個(gè)循環(huán)語(yǔ)句,目的是從第一頁(yè)爬取到第幾頁(yè),那邊的2是爬取到第二頁(yè)。如果有基礎(chǔ)的人不需要解釋,沒(méi)有基礎(chǔ)的就跟著看懂就好了,慢慢學(xué)就會(huì)知道了。其實(shí)我想說(shuō)的是下面的url參數(shù)的分析,其他的東西都是可以查閱學(xué)到的。但分析url這件事卻是需要你足夠的耐性,才能發(fā)現(xiàn)它的規(guī)律,而且每個(gè)網(wǎng)站的接口參數(shù)是不同的,這是需要花費(fèi)時(shí)間的最重要一步。
這些參數(shù)data其實(shí)還有很多(很多刪掉了),可以實(shí)現(xiàn)更多的搜索方法,比如根據(jù)經(jīng)緯度去搜索指定區(qū)域的火鍋店。這里我只介紹幾個(gè)重要的參數(shù),wd:是指要搜索的關(guān)鍵詞,這里是火鍋(其實(shí)你可以替換成任意的,想爬什么就爬什么)。
c:是指城市的代碼(這里同樣需要找到規(guī)律,只要你知道baidu所有城市的代碼,你就可以爬取所有城市的了,我有哦!很容易一搜一大把,需要你自己甑別)。pn和nn是重點(diǎn)啦,決定你爬取的頁(yè)數(shù)啦,找到規(guī)律哦。當(dāng)頁(yè)數(shù)為第一頁(yè)的時(shí)候,pn和nn都為0。當(dāng)頁(yè)數(shù)為第二頁(yè)的時(shí)候pn為1,nn為10(是不是很好找),然而接下來(lái)你就入坑了,你只能爬到兩頁(yè)。
繼續(xù)找規(guī)律你會(huì)發(fā)現(xiàn)當(dāng)pn竟然沒(méi)有等于2的,當(dāng)pn等于3的時(shí)候,nn等于20,當(dāng)pn等于4的時(shí)候,nn等于30。找到規(guī)律了吧,很坑吧(煩就不能好好的嗎,一點(diǎn)都不能玩耍)。
接下來(lái)是頁(yè)面的解析,在找到規(guī)律后將剛才在瀏覽器上看到的url用一個(gè)新的窗口打開(kāi),你就會(huì)發(fā)現(xiàn)數(shù)據(jù)是下面這樣的(不是這樣的那你就是人氣大爆發(fā)了,被狗吃了,其實(shí)是你沒(méi)在瀏覽器加入JSONView擴(kuò)展程序)。
直接看代碼,經(jīng)過(guò)上面的分析可以得下面的代碼,我們用requests庫(kù)去發(fā)送請(qǐng)求,返回得到的reponse數(shù)據(jù)是json格式的。然后去分析發(fā)現(xiàn)我們要的信息其實(shí)在content下(頁(yè)面很大,截圖只截取了一小部分),content有很多條所以需要for循環(huán)遍歷一下,然后發(fā)現(xiàn)數(shù)據(jù)都在ext中的detail_info下,就像下面代碼那樣取,然后信息又分別在下面name、poi_address等下面。通過(guò)下面的方式分別取出來(lái)(try是用來(lái)嘗試一下可不可以取到,不會(huì)因?yàn)闆](méi)取到報(bào)錯(cuò),程序不能繼續(xù)執(zhí)行)。
下面headers是將爬蟲程序偽裝成一個(gè)瀏覽器請(qǐng)求頭,url是基礎(chǔ)的網(wǎng)址,因?yàn)槭莋et請(qǐng)求,剛才解析的url參數(shù)會(huì)直接拼接在上面,然后形成一個(gè)巨長(zhǎng)的url,這個(gè)url就是你剛才解析頁(yè)面時(shí)復(fù)制的url。key_word就是你要爬取時(shí)搜索的關(guān)鍵詞,下面for遍歷其實(shí)你可以在上面key_word寫多個(gè),然后都爬。然后我開(kāi)了5個(gè)線程加快爬取的速度,其實(shí)baidu很友好的,沒(méi)有什么反爬機(jī)制。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
