爬取国内创业公司、投资机构、独角兽公司信息
歡迎關(guān)注天善智能,我們是專注于商業(yè)智能BI,人工智能AI,大數(shù)據(jù)分析與挖掘領(lǐng)域的垂直社區(qū),學(xué)習(xí),問答、求職一站式搞定!
對(duì)商業(yè)智能BI、大數(shù)據(jù)分析挖掘、機(jī)器學(xué)習(xí),python,R等數(shù)據(jù)領(lǐng)域感興趣的同學(xué)加微信:tstoutiao,邀請(qǐng)你進(jìn)入數(shù)據(jù)愛好者交流群,數(shù)據(jù)愛好者們都在這兒。
作者:? 蘇克1900
公眾號(hào):第2大腦
摘要:?之前爬的網(wǎng)站都是不需要登錄就可以爬取的,但還有很多網(wǎng)站的內(nèi)容需要先登錄才能爬,比如桔子網(wǎng)、豆瓣、知乎等。這時(shí)采用之前的方法就不行了,需要先登錄再去爬。本文以桔子網(wǎng)為例,介紹模擬登錄方法,然后爬取該網(wǎng)站數(shù)據(jù)庫中的數(shù)據(jù)信息,并保存到 MongoDB 數(shù)據(jù)庫中。
1. 網(wǎng)站介紹
網(wǎng)址:https://www.itjuzi.com/
對(duì)于創(chuàng)投圈的人來說,國內(nèi)的桔子和國外的?Crunchbase應(yīng)該算是必備網(wǎng)站。今天,我們要說的就是前者,這個(gè)網(wǎng)站提供了很多有價(jià)值的信息。
信息的價(jià)值體現(xiàn)在哪里呢,舉個(gè)簡單的例子。你運(yùn)營了一個(gè)不錯(cuò)的公眾號(hào),有著 10 萬粉絲群,這時(shí)候你想找投資繼續(xù)做大,但你不知道該到哪里去找投資。這時(shí)候你偶然發(fā)現(xiàn)了這個(gè)網(wǎng)站,在網(wǎng)站上你看到了同領(lǐng)域的大 V 號(hào)信息,他們得到了好幾家公司上千萬的投資。你看著心生羨慕,也躍躍欲試。于是,你經(jīng)過綜合對(duì)比分析,對(duì)自己公眾號(hào)估值 200 萬,然后就去找投資大 V 號(hào)的那幾家公司洽談。由于目的性明確,準(zhǔn)備也充分,你很快就得到了融資。
這個(gè)例子中,桔子網(wǎng)提供了創(chuàng)業(yè)公司(運(yùn)營公眾號(hào)也是創(chuàng)業(yè))融資金額和投資機(jī)構(gòu)等相關(guān)寶貴的信息。當(dāng)然,這只是非常小的一點(diǎn)價(jià)值,該網(wǎng)站數(shù)據(jù)庫提供了自 2000 年以來的海量數(shù)據(jù),包括:超過11 萬家的創(chuàng)業(yè)公司、6 萬多條投融資信息、7 千多家投資機(jī)構(gòu)以及其他數(shù)據(jù),可以說是非常全了。這些數(shù)據(jù)的背后蘊(yùn)含著大量有價(jià)值的信息。
接下來,本文嘗試爬取該網(wǎng)站數(shù)據(jù)庫的信息,之后做一些數(shù)據(jù)分析,嘗試找到一些有意思的信息。
主要內(nèi)容:
模擬登錄
分析 Ajax 然后抓取
存儲(chǔ)到 MongoDB 數(shù)據(jù)庫
導(dǎo)出 csv
數(shù)據(jù)分析(后期)
2. 模擬登錄
2.1. Session 和 Cookies
觀察這個(gè)網(wǎng)站,是需要先登錄才能看到數(shù)據(jù)信息的,但是好在不用輸驗(yàn)證碼。我們需要利用賬號(hào)和密碼,然后實(shí)現(xiàn)模擬登錄。
模擬登錄的方法有好幾種,比如 Post 直接提交賬號(hào)、先登錄獲取 Cookies 再直接請(qǐng)求、Selenium 模擬登錄等。其中:
Post 方法需要在后臺(tái)獲取登錄的 url,填寫表單參數(shù)然后再請(qǐng)求,比較麻煩;
直接復(fù)制 Cookies 的方法就是先登錄賬號(hào),復(fù)制出 Cookies 并添加到 Headers 中,再用requests.get?方法提交請(qǐng)求,這種方法最為方便;
Selenium 模擬登錄方法是直接輸入賬號(hào)、密碼,也比較方便,但速度會(huì)有點(diǎn)慢。
之后,會(huì)單獨(dú)介紹幾種方法的具體實(shí)現(xiàn)的步驟。這里,我們就先采用第二種方法。
首先,需要先了解兩個(gè)知識(shí)點(diǎn):Session 和 Cookies。
Session 在服務(wù)端,也就是網(wǎng)站的服務(wù)器,用來保存用戶的會(huì)話信息,Cookies 在客戶端,也可以理解為瀏覽器端,有了 Cookies,瀏覽器在下次訪問網(wǎng)頁時(shí)會(huì)自動(dòng)附帶上它發(fā)送給服務(wù)器,服務(wù)器通過識(shí)別 Cookies 并鑒定出是哪個(gè)用戶,然后再判斷用戶是否是登錄狀態(tài),然后返回對(duì)應(yīng)的 Response。所以我們可以理解為 Cookies 里面保存了登錄的憑證,有了它我們只需要在下次請(qǐng)求攜帶 Cookies 發(fā)送 Request 而不必重新輸入用戶名、密碼等信息重新登錄了。
因此在爬蟲中,有時(shí)候處理需要登錄才能訪問的頁面時(shí),我們一般會(huì)直接將登錄成功后獲取的 Cookies 放在 Request Headers 里面直接請(qǐng)求。
更多知識(shí),可以參考崔慶才大神的文章:
https://germey.gitbooks.io/python3webspider/content/2.4-Session%E5%92%8CCookies.html
在了解 Cookies 知識(shí)后,我們就可以進(jìn)入正題了。
2.2. Requests 請(qǐng)求登錄
首先,利用已有的賬號(hào)和密碼,登錄進(jìn)網(wǎng)站主頁,然后右鍵-檢查,打開第一個(gè)?www.itjuzi.com請(qǐng)求:
向下拉到 Requests Headers 選項(xiàng),可以看到有很多字段信息,這些信息之后我們都要添加到 Get 請(qǐng)求中去。
定位到下方的 Cookie 字段,可以看到有很多 Cookie 值和名稱,這是在登錄后自動(dòng)產(chǎn)生的。我們將整個(gè) Cookies 復(fù)制 Request Headers 里,然后請(qǐng)求網(wǎng)頁就可以順利登陸然后爬取。如果不加 Cookies,那么就卡在登錄界面,也就無法進(jìn)行后面的爬取,所以 Cookies 很重要,需要把它放到 Request Headers 里去。
下面,我們按照 json 格式開始構(gòu)造 Request Headers。這里推薦一個(gè)好用的網(wǎng)站,可以幫我們自動(dòng)構(gòu)造 Request Headers:https://curl.trillworks.com/
使用方法也很簡單,右鍵復(fù)制cURL鏈接到這個(gè)網(wǎng)頁中。
將 cURL 復(fù)制到左邊選框,默認(rèn)選擇語言為 Python,然后右側(cè)就會(huì)自動(dòng)構(gòu)造后 requests 請(qǐng)求,包括 headers,復(fù)制下來直接可以用。登錄好以后,我們就轉(zhuǎn)到投融資速遞網(wǎng)頁中(url:http://radar.itjuzi.com/investevent),然后就可以獲取該頁面網(wǎng)頁內(nèi)容了。代碼如下:
1importrequests
2headers?=?{
3'Connection':'keep-alive',
4'Cache-Control':'max-age=0',
5'Upgrade-Insecure-Requests':'1',
6'User-Agent':'Mozilla/5.0?(Windows?NT?6.1;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/66.0.3359.181?Safari/537.36',
7'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
8'DNT':'1',
9'Referer':'http://radar.itjuzi.com/investevent',
10'Accept-Encoding':'gzip,?deflate,?br',
11'Accept-Language':'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7',
12'If-None-Match':'W/^\\^5bc7df15-19cdc^\\^',
13'If-Modified-Since':'Thu,?18?Oct?2018?01:17:09?GMT',
14#?主頁cookie
15'Cookie':'你的cookie',
16}
17
18url?='http://radar.itjuzi.com/investevent'#?投融資信息
19s?=?requests.Session()
20response?=?s.get(url,headers?=?headers)
21print(response.status_code)
22print(response.text)
結(jié)果如下:
可以看到,添加 Cookie 后,我們請(qǐng)求投融資信息網(wǎng)頁就成功了。這里如果不加 Cookie 的結(jié)果就什么也得不到:
好,這樣就算成功登錄了。但是整個(gè) headers 請(qǐng)求頭的參數(shù)太多,是否一定需要帶這么多參數(shù)呢? 這里就去嘗試看哪些參數(shù)是請(qǐng)求一定要的,哪些則是不用的,不用的可以去掉以精簡代碼。經(jīng)過嘗試,僅需要下面三個(gè)參數(shù)就能請(qǐng)求成功。
1headers?=?{
2'User-Agent':'Mozilla/5.0?(Windows?NT?6.1;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/66.0.3359.181?Safari/537.36'
3'X-Requested-With':'XMLHttpRequest',
4#?主頁cookie
5'Cookie':'復(fù)制你的cookie',
6}
Tips:當(dāng)爬取失效的時(shí)候需要重新注冊(cè)帳號(hào),然后生成新的 Cookie。
如果你沒那么多郵箱賬號(hào),那么推薦一個(gè)可生成隨機(jī)賬號(hào)的免費(fèi)郵箱,用來接收注冊(cè)激活鏈接:
https://10minutemail.net/
3. 網(wǎng)頁爬取分析
在成功登錄以后,我們就可以通過分析網(wǎng)頁結(jié)構(gòu)來采取相應(yīng)的爬取方法。這里,我們將爬取投融資速遞、創(chuàng)業(yè)公司、投資機(jī)構(gòu)和千里馬等幾個(gè)子板塊的數(shù)據(jù)。首先,以投融資速遞信息為例。
網(wǎng)址:http://radar.itjuzi.com/investevent
3.1. 分析網(wǎng)頁
可以看到,投融資事件信息網(wǎng)頁中的數(shù)據(jù)是表格形式。經(jīng)嘗試點(diǎn)擊翻頁,發(fā)現(xiàn)url不變,可以初步判定網(wǎng)頁數(shù)據(jù)采用 Ajax 形式呈現(xiàn)。切換到后臺(tái),點(diǎn)擊翻頁可以發(fā)現(xiàn)出現(xiàn)有規(guī)律的?info?locatiop 開頭的請(qǐng)求,頁數(shù)隨 page 參數(shù)而發(fā)生規(guī)律的變化。
點(diǎn)擊請(qǐng)求查分別查看 Response 和 Preview,發(fā)現(xiàn)表格數(shù)據(jù)是 json 格式,這就太好了。因?yàn)?json 格式的數(shù)據(jù)非常整齊也很容易抓取。上一篇文章,我們正好解決了 json 格式數(shù)據(jù)的處理方法,如果不太熟悉可以回顧一下:
https://www.makcyun.top/web_scraping_withpython6.html
接著,我們就可以通過構(gòu)造 url 參數(shù),然后用 Get 請(qǐng)求就可以獲取網(wǎng)頁中的表格數(shù)據(jù),最后再加個(gè)循環(huán),就可以爬取多頁數(shù)據(jù)了。
3.2. 構(gòu)造 url
下面,我們來構(gòu)造一下 url,切換到 Headers 選項(xiàng)卡,拉到最底部可以看到 url 需帶的請(qǐng)求參數(shù)。這里有三項(xiàng),很好理解。location:in,表示國內(nèi)數(shù)據(jù); orderby:def,表示默認(rèn)排序;page:1,表示第一頁。所以,只需要改變 page 參數(shù)就可以查看其他頁的結(jié)果,非常簡單。
這里,如果我們對(duì)表格進(jìn)行篩選,比如行業(yè)選擇教育、時(shí)間選擇 2018 年,那么相應(yīng)的請(qǐng)求參數(shù)也會(huì)增加。通過構(gòu)造參數(shù)就可以爬取指定的數(shù)據(jù),這樣就不用全部爬下來了,也對(duì)網(wǎng)站友好點(diǎn)。
3.3. 爬取數(shù)據(jù)
到這兒,我們就可以直接開始爬了。可以使用函數(shù),也可以用定義類(Class)的方法。考慮到,Python 是一種面向?qū)ο蟮木幊?#xff0c;類(Class)是面向?qū)ο笞钪匾母拍钪?#xff0c;運(yùn)用類的思想編程非常重要。所以,這里我們嘗試采用類的方法來實(shí)現(xiàn)爬蟲。
1importrequests
2importpymongo
3importrandom
4importtime
5importjson
6importpandasaspd
7fromfake_useragentimportUserAgent
8ua?=?UserAgent()
9
10classITjuzi(object):
11def__init__(self):
12self.headers?=?{
13'User-Agent':?ua.random,
14'X-Requested-With':'XMLHttpRequest',
15'Cookie':'你的cookie',
16}
17self.url?='http://radar.itjuzi.com/investevent/info?'#?investevent
18self.session?=?requests.Session()
19
20defget_table(self,?page):
21"""
221?獲取投融資事件數(shù)據(jù)
23"""
24params?=?{#?invsestevent
25'location':'in',
26'orderby':'def',
27'page':?page,
28'date':2018#?年份
29}
30response?=?self.session.get(
31self.url,?params=params,?headers=self.headers).json()
32print(response)
33#?self.save_to_mongo(response)
34
35if__name__?=='__main__':
36spider?=?itjuzi()
37spider.get_table(1)
如果你之前一直是用 Def 函數(shù)的寫法,而沒有接觸過 Class 類的寫法,可能會(huì)看地比較別扭,我之前就是這樣的,搞不懂為什么要有 self、為什么用__init__。這種思維的轉(zhuǎn)變可以通過看教程和別人寫的實(shí)際案例去揣摩。這里,我先略過,之后會(huì)單獨(dú)介紹。
簡單解釋一下上面代碼的意思。首先定義了一個(gè)類(class),類名是?ITjuzi,類名通常是大寫開頭的單詞。后面的?(object)?表示該類是從哪個(gè)類繼承下來的,這個(gè)可以暫時(shí)不用管,填上就可以。然后定義了一個(gè)特殊的__init__方法,__init__方法的第一個(gè)參數(shù)永遠(yuǎn)是?self,之后是其他想要設(shè)置的屬性參數(shù)。在這個(gè)方法里可以綁定些確定而且必須的屬性,比如 headers、url 等。
在 headers 里面,User-Agent 沒有使用固定的 UA,而是借助?fake_useragent包?生成隨機(jī)的 UA:ua.random。因?yàn)?#xff0c;這個(gè)網(wǎng)站做了一定的反爬措施,這樣可以起到一定的反爬效果,后續(xù)我們會(huì)再說到。接著,定義了一個(gè) get_table() 函數(shù),這個(gè)函數(shù)和普通函數(shù)沒有什么區(qū)別,除了第一個(gè)參數(shù)永遠(yuǎn)是實(shí)例變量?self。在 session.get()方法中傳入 url、請(qǐng)求參數(shù)和 headers,請(qǐng)求網(wǎng)頁并指定獲取的數(shù)據(jù)類型為 json 格式,然后就可以順利輸出 2018 年投融資信息的第 1 頁數(shù)據(jù):
3.4. 存儲(chǔ)到 MongoDB
數(shù)據(jù)爬取下來了,那么我們放到哪里呢?可以選擇存儲(chǔ)到 csv 中,但 json 數(shù)據(jù)中存在多層嵌套,csv 不能夠直觀展現(xiàn)。這里,我們可以嘗試之前沒有用過的 MongoDB 數(shù)據(jù)庫,當(dāng)作練習(xí)。另外,數(shù)據(jù)存儲(chǔ)到該數(shù)據(jù)庫中,后期也可以導(dǎo)出 csv,一舉兩得。
關(guān)于 MongoDB 的安裝與基本使用,可以參考下面這兩篇教程,之后我也會(huì)單獨(dú)再寫一下:
安裝
https://germey.gitbooks.io/python3webspider/content/1.4.2-MongoDB%E7%9A%84%E5%AE%89%E8%A3%85.html
使用
https://germey.gitbooks.io/python3webspider/content/5.3.1-MongoDB%E5%AD%98%E5%82%A8.html
可視化工具可采用 Robo 3T (之前叫 RoboMongo)
https://www.mongodb.com/
下面我們就將上面返回的 json 數(shù)據(jù),存儲(chǔ)到 MongoDB 中去:
1importpymongo
2importnumpyasnp
3#?mongodb數(shù)據(jù)庫初始化
4client?=?pymongo.MongoClient('localhost',27017)
5#?指定數(shù)據(jù)庫
6db?=?client.ITjuzi
7#?指定集合,類似于mysql中的表
8mongo_collection1?=?db.itjuzi_investevent
9
10defsave_to_mongo(self,?response):
11try:
12data?=?response['data']['rows']#?dict可以連續(xù)選取字典層內(nèi)的內(nèi)容
13df?=?pd.DataFrame(data)
14table?=?json.loads(df.T.to_json()).values()
15ifmongo_collection1.insert_many(table):#?investment
16print('存儲(chǔ)到mongodb成功')
17sleep?=?np.random.randint(3,7)
18time.sleep(sleep)
19exceptException:
20print('存儲(chǔ)到mongodb失敗')
21defspider_itjuzi(self,?start_page,?end_page):
22forpageinrange(start_page,?end_page):
23print('下載第%s頁:'%?(page))
24self.get_table(page)
25print('下載完成')
26
27if__name__?=='__main__':
28spider?=?ITjuzi()
29spider.spider_itjuzi(1,2)
這里,安裝好 MongoingDB 數(shù)據(jù)庫、Robo 3T 和 pymongo 庫后,我們就可以開始使用了。
首先,對(duì)數(shù)據(jù)庫進(jìn)行初始化,然后指定(如果沒有則生成)數(shù)據(jù)將要存放的數(shù)據(jù)庫和集合名稱。接著,定義了save_to_mongo 函數(shù)。由于表格里面的數(shù)據(jù)存儲(chǔ)在鍵為 rows 的 value 值中,可使用?response['data']['rows']?來獲取到 json 里面的嵌套數(shù)據(jù),然后轉(zhuǎn)為 DataFrame。DataFrame 存儲(chǔ) MongoDB 參考了 stackoverflow 上面的一個(gè)答案:json.loads(df.T.to_json()).values()。
然后,使用?mongo_collection1.insert_many(table)?方法將數(shù)據(jù)插入到 mongo_collection1,也就是 itjuzi_investevent 集合中。爬取完一頁數(shù)據(jù)后,設(shè)置隨機(jī)延時(shí) 3-6 s,避免爬取太頻繁,這也能起到一定的反爬作用。
最后,我們定義一個(gè)分頁循環(huán)爬取函數(shù)?spider_itjuzi,利用 for 循環(huán)設(shè)置爬取起始頁數(shù)就可以了,爬取結(jié)果如下:
打開 Robo 3T,可以看到數(shù)據(jù)成功存儲(chǔ)到 MongoDB 中了:
好,以上,我們就基本上完成了 2018 年投融資信息數(shù)據(jù)表的爬取,如果你想爬其他年份或者更多頁的數(shù)據(jù),更改相應(yīng)的參數(shù)即可。
3.5. 導(dǎo)出到 csv
數(shù)據(jù)存好后,如果還不太熟悉 MongoDB 的對(duì)數(shù)據(jù)的操作,那么我們可以將數(shù)據(jù)導(dǎo)出為 csv,在 excel 中操作。MongoDB不能直接導(dǎo)出 csv,但操作起來也不麻煩,利用mongoexport命令,幾行代碼就可以輸出 csv。
mongoexport導(dǎo)出 csv 的方法:
https://docs.mongodb.com/manual/reference/program/mongoexport/#mongoexport-fields-example
首先,運(yùn)行 cmd,切換路徑到 MongoDB 安裝文件夾中的 bin 目錄下,我這里是:
1cd?C:\Program?Files\MongoDB\Server\4.0\bin
接著,在桌面新建一個(gè)txt文件,命名為fields,在里面輸入我們需要輸出的表格列名,如下所示:
然后,利用mongoexport命令,按照:表格所在的數(shù)據(jù)庫、集合、輸出格式、導(dǎo)出列名文件位置和輸出文件名的格式,編寫好命令并運(yùn)行就可以導(dǎo)出了:
1mongoexport?--db?ITjuzi?--collection?itjuzi_investevent?--type=csv?--fieldFile?C:\Users\sony\Desktop\fields.txt?--out?C:\Users\sony\Desktop\investevent.csv
cmd 命令:
導(dǎo)出 csv 結(jié)果如下:
Tips:直接用 excel 打開可能會(huì)是亂碼,需先用 Notepad++ 轉(zhuǎn)換為 UTF-8 編碼,然后 excel 再打開就正常了。
以上,我們就完成了整個(gè)數(shù)據(jù)表的爬取。
3.6. 完整代碼
下面,可以再嘗試爬取創(chuàng)業(yè)公司、投資機(jī)構(gòu)和千里馬的數(shù)據(jù)。他們的數(shù)據(jù)結(jié)構(gòu)形式是一樣的,只需要更換相應(yīng)的參數(shù)就可以了,感興趣的話可以嘗試下。將上面的代碼再稍微整理一下,完整代碼如下:
?1importrequests
?2importre
?3importpymongo
?4importrandom
?5importtime
?6importjson
?7importrandom
?8importnumpyasnp
?9importcsv
10importpandasaspd
11fromfake_useragentimportUserAgent
12importsocket#?斷線重試
13fromurllib.parseimporturlencode
14#?隨機(jī)ua
15ua?=?UserAgent()
16#?mongodb數(shù)據(jù)庫初始化
17client?=?pymongo.MongoClient('localhost',27017)
18#?獲得數(shù)據(jù)庫
19db?=?client.ITjuzi
20#?獲得集合
21mongo_collection1?=?db.itjuzi_investevent
22mongo_collection2?=?db.itjuzi_company
23mongo_collection3?=?db.itjuzi_investment
24mongo_collection4?=?db.itjuzi_horse
25
26classitjuzi(object):
27def__init__(self):
28
29self.headers?=?{
30'User-Agent':?ua.random,
31'X-Requested-With':'XMLHttpRequest',
32#?主頁cookie
33'Cookie':'你的cookie',
34}
35self.url?='http://radar.itjuzi.com/investevent/info?'#?investevent
36#?self.url?=?'http://radar.itjuzi.com/company/infonew?'???????#?company
37#?self.url?=?'http://radar.itjuzi.com/investment/info?'???????#?investment
38#?self.url?=?'https://www.itjuzi.com/horse'???????????????#?horse
39self.session?=?requests.Session()
40
41defget_table(self,?page):
42"""
431?獲取投融資事件網(wǎng)頁內(nèi)容
44"""
45params?=?{#?1?invsestevent
46'location':'in',
47'orderby':'def',
48'page':?page,
49'date':2018#年份??
50}
51
52#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?##?#?#?#?#?#?#?#?#?#?#?#
53#?params?=?{??????????????????#?2?company
54#?????'page':?page,
55#?????#?'scope[]':?1,??#?行業(yè)?1教育
56#?????'orderby':?'pv',
57#?????'born_year[]':?2018,??#?只能單年,不能多年篩選,會(huì)保留最后一個(gè)
58#?}
59#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?##?#?#?#?#?#?#?#?#?#?#?#
60#?params?=?{??????????????????#?3?investment
61#?'orderby':?'num',
62#?'page':?page
63#?}
64#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?#?##?#?#?#?#?#?#?#?#?#?#?#
65#?params?=?{??????????????????#?4?horse
66#?}
67#?可能會(huì)遇到請(qǐng)求失敗,則設(shè)置3次重新請(qǐng)求
68retrytimes?=3
69whileretrytimes:
70try:
71response?=?self.session.get(
72self.url,?params=params,?headers=self.headers,timeout?=?(5,20)).json()
73self.save_to_mongo(response)
74break
75exceptsocket.timeout:
76print('下載第{}頁,第{}次網(wǎng)頁請(qǐng)求超時(shí)'.format(page,retrytimes))
77retrytimes?-=1
78
79defsave_to_mongo(self,?response):
80try:
81data?=?response['data']['rows']#?dict可以連續(xù)選取字典層內(nèi)的內(nèi)容
82#?data?=response??#?爬取千里馬時(shí)需替換為此data
83df?=?pd.DataFrame(data)
84table?=?json.loads(df.T.to_json()).values()
85ifmongo_collection1.insert_many(table):#?investevent
86#?if?mongo_collection2.insert_many(table):????#?company
87#?if?mongo_collection3.insert_many(table):????#?investment
88#?if?mongo_collection4.insert_many(table):????#?horse?
89print('存儲(chǔ)到mongodb成功')
90sleep?=?np.random.randint(3,7)
91time.sleep(sleep)
92exceptException:
93print('存儲(chǔ)到mongodb失敗')
94
95defspider_itjuzi(self,?start_page,?end_page):
96forpageinrange(start_page,?end_page):
97print('下載第%s頁:'%?(page))
98self.get_table(page)
99print('下載完成')
100
101if__name__?=='__main__':
102spider?=?itjuzi()
103spider.spider_itjuzi(1,2)
源代碼也可以在下面的鏈接中獲取:
https://github.com/makcyun/web_scraping_with_python
4. 總結(jié):
本文以桔子網(wǎng)為例,介紹了需登錄網(wǎng)站的爬取方法。即:先模擬登錄再爬取數(shù)據(jù)信息。但是還有一些網(wǎng)站登錄時(shí)需要輸入驗(yàn)證碼,這讓爬取難度又增加,后期會(huì)再進(jìn)行介紹。
該網(wǎng)站相比之前的爬蟲網(wǎng)站,反爬措施高了很多。本文通過設(shè)置隨機(jī)延時(shí)、隨機(jī) UserAgent,可一定程度上增加爬蟲的穩(wěn)定性。但是仍然會(huì)受到反爬措施的限制,后期可嘗試通過設(shè)置 IP 代理池進(jìn)一步提升爬蟲效率。
上面的爬蟲程序在爬取過程容易中斷,接著再進(jìn)行爬取即可。但是手動(dòng)修改非常不方便,也容易造成數(shù)據(jù)重復(fù)爬取或者漏爬。所以,為了更完整地爬取,需增加斷點(diǎn)續(xù)傳的功能。
補(bǔ)充一下,后期可能會(huì)在我的博客中不斷更新、補(bǔ)充本文的內(nèi)容。如想獲得更多,可點(diǎn)擊閱讀原文,或者瀏覽器打開我的博客鏈接。
https://www.makcyun.top
本文完。
作者好文推薦:分析了6000款A(yù)pp,竟有這么多佳軟神器沒用過
Python愛好者社區(qū)歷史文章大合集:
Python愛好者社區(qū)歷史文章列表(每周append更新一次)
福利:文末掃碼立刻關(guān)注公眾號(hào),“Python愛好者社區(qū)”,開始學(xué)習(xí)Python課程:
關(guān)注后在公眾號(hào)內(nèi)回復(fù)“課程”即可獲取:
小編的轉(zhuǎn)行入職數(shù)據(jù)科學(xué)(數(shù)據(jù)分析挖掘/機(jī)器學(xué)習(xí)方向)【最新免費(fèi)】
小編的Python入門免費(fèi)視頻課程!!!
小編的Python快速上手matplotlib可視化庫!!!
崔老師爬蟲實(shí)戰(zhàn)案例免費(fèi)學(xué)習(xí)視頻。
陳老師數(shù)據(jù)分析報(bào)告制作免費(fèi)學(xué)習(xí)視頻。
玩轉(zhuǎn)大數(shù)據(jù)分析!Spark2.X+Python 精華實(shí)戰(zhàn)課程免費(fèi)學(xué)習(xí)視頻。
總結(jié)
以上是生活随笔為你收集整理的爬取国内创业公司、投资机构、独角兽公司信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高性能计算机重要的配件,电脑配件大盘点,
- 下一篇: openGauss数据库客户端接入认证详