python简单爬虫入门一_Python爬虫快速入门:基本结构简单实例
本爬蟲系列入門教程假設讀者僅有一點點Python基礎或者近乎為零的基礎。如果是有Python基礎的可以跳過一些對于Python基本知識的補充。
爬蟲能干什么呢?一句話概括,正常通過瀏覽器可以獲取的數據,爬蟲都可以獲取。這句話可以說是包羅萬象。一是說明了爬蟲的本質是一個服務端,實現的功能類似于瀏覽器;二是說明了爬蟲的界限,如果不能正常訪問到的數據就不能通過爬蟲獲取;三是爬蟲的最高境界,只要是瀏覽器能正常訪問的都可以用爬蟲獲取。
下面我們講講爬蟲的基本結構和簡單實現。這篇專欄我不準備詳細地講具體怎么寫爬蟲,只是先用一個非常簡單的實現,給大家看看爬蟲是個什么樣子。詳細的內容我們后面一個一個慢慢說。
一、爬蟲的基本結構
讓我們忽略掉來自各種各樣的資料對于爬蟲結構的描述,把問題盡可能地描述簡單一點。前面說到,爬蟲是一個獲取正常瀏覽器可以獲取的數據的自動化獲取程序。那么,從這個功能出發,我們需要干的事情其實就兩件事情:找到我們需要的網頁,然后把他們一個一個處理一遍。(這句話很重要,我們在后面的后面講到海量數據爬取策略的時候還要回到這句話。)那么問題就來了:一,怎么找到我們需要的網頁的那個入口?二,怎么處理我們需要處理的網頁?
對于單個頁面來說,入口的來源有兩種,一種是已知地址,比如我們院的網站的教學研究人員:[教學研究人員 - WISE];另外一種是你可以通過前面爬下來的網頁中獲取入口,比如這個頁面上所有老師的個人主頁。這一點很重要,后面我們在把小爬蟲逐步變大的時候還要反復回到這里。
好的,后面的部分,讓我們通過解決第二個問題(處理網頁)的過程,順便看看怎么解決第一個問題(獲取更多入口)。我們一起開看看一個單頁爬蟲是怎么實現的。
二、爬蟲實例:簡單的單頁爬蟲
好了,現在我們要處理網頁了。可是網頁要怎么處理呢?讓我們回憶一下我們使用瀏覽器的過程:你先把一個地址復制進瀏覽器的框框里面,或者點開一個鏈接;然后瀏覽器的進度條跑一下(有可能快也有可能慢),然后我們就在瀏覽器里面看到了數據。首先,進度條跑的過程完成了一個對網頁的請求,然后瀏覽器把請求下來的數據進行處理,然后就輸出出來。這是一個極其簡化但是不太準確的對于瀏覽器工作原理的描述。那么爬蟲和瀏覽器有什么不同呢?一般來說,我們是只需要解析網頁,而不需要渲染瀏覽器環境的;另外,我們需要特定網頁的特點數據,因此要用一定的方式把數據組織并儲存起來。所以,爬蟲的核心模塊有三個:請求、解析、儲存。
首先我們給一個入口:[教學研究人員 - WISE]。這就是我們今天要處理的目標網頁。我們今天要實現的目的就是把這個頁面上所有老師的姓名和個人主頁的鏈接(也就是可能的下一次爬蟲的入口)提取出來。下面開始寫爬蟲吧~
1. 請求
這里我們使用的package是requests。這是一個第三方模塊(具體怎么下載以后再說),對HTTP協議進行了高度封裝,非常好用。所謂HTTP協議,簡單地說就是一個請求過程。我們先不管這玩意是啥,以后再討論。這個部分,我們要實現的目的是把網頁請求(或者說下載)下來。
首先我們導入requests:
import requests
下面調用requests的get函數,把網頁請求下來:
r = requests.get('http://www.wise.xmu.edu.cn/people/faculty')
返回的“r”的是一個包含了整個HTTP協議需要的各種各樣的東西的對象。我們先不管都有啥,先把我們需要的網頁提取出來:
html = r.content
好了,到這一步我們已經獲取了網頁的源代碼。具體源代碼是什么樣的呢?右鍵,點擊“查看源文件”或者“查看源”就可以看到
2. 解析
當然從這一大坨代碼里面找信息太麻煩了。我們可以用瀏覽器提供的另外一個工具:審查元素。這里我們先不講怎么使用審查元素,先從源代碼里面找。找到的我們需要的信息如下:
這里我們使用bs4來解析。bs4是一個非常好的解析網頁的庫,后面我們會詳細介紹。這次的解析先給大家看bs4里面最常用的幾個BeautifulSoup對象的方法(method)。我們使用的這幾個方法,主要是通過HTML的標簽和標簽里面的參數來定位,然后用特定方法(method)提取數據。
首先還是導入package:
from bs4 import BeautifulSoup
然后創建一個BeautifulSoup對象:
soup = BeautifulSoup(html,'html.parser') ? ?#html.parser是解析器
下面我們根據我們看到的網頁提取。首先提取我復制的這部分的代碼的第一行,先定位到這部分代碼:
div_people_list = soup.find('div', attrs={'class': 'people_list'})
這里我們使用了BeautifulSoup對象的find方法。這個方法的意思是找到帶有‘div’這個標簽并且參數包含" class = 'people_list' "的HTML代碼。如果有多個的話,find方法就取第一個。那么如果有多個呢?正好我們后面就遇到了,現在我們要取出所有的“a”標簽里面的內容:
a_s = div_people_list.find_all('a', attrs={'target': '_blank'})
這里我們使用find_all方法取出所有標簽為“a”并且參數包含“ target = ‘_blank‘ ”的代碼,返回一個列表。“a”標簽里面的“href”參數是我們需要的老師個人主頁的信息,而標簽里面的文字是老師的姓名。我們繼續:
這里我們使用BeautifulSoup支持的方法,使用類似于Python字典索引的方式把“a”標簽里面“href”參數的值提取出來,賦值給url(Python實際上是對對象的引用),用get_text()方法把標簽里面的文字提起出來。
事實上,使用這四個方法就可以正常地解析大部分HTML了。不過如果只用這四個方法,很多程序會寫的異常原始。所以我們后面再繼續介紹更多解析方法。
3. 儲存
這里我們先弱化一下具體的儲存方法,先輸出到控制臺上面。我們在剛才的代碼的基礎上加一行代碼:
使用print關鍵詞把得到的數據print出來。讓我們看看結果:
# result'''
Bluhm, Marcel /people/faculty/4b901e30_5f2a_4609_96ee_2d154954d22e.html
Bowers, Roslyn /people/faculty/47557237_8d2f_4f54_a889_7ea6b2e41c91.html
Caroline Botsford /people/faculty/b16b86f2_0eed_40da_ad4a_0b559864109e.html
鮑小佳 /people/faculty/85baa506_9087_4c89_979e_4a9fd19ff60b.html
Chang, Seong Yeon /people/faculty/d0c8f922_2c64_4bbb_99d9_b3d40a04cefe.html
蔡熙乾 /people/faculty/f642c7bf_ac86_42dd_a6ac_a85720d45c8e.html
蔡宗武 /people/faculty/55981260_ddce_43aa_97b5_3d7ad0ae2844.html
陳燈塔 /people/faculty/899ecc03_5fc6_4fd7_89d7_af93901ef6b1.html
陳國進 /people/faculty/22627c95_155a_4f18_a586_df9ac4f1d7ce.html
陳海強 /people/faculty/382f444e_a849_4818_9d34_ed6347d9cbf7.html
程立新 /people/faculty/ab01c285_bbcc_4354_b27e_3bfb947a3690.html
丁錦秀 /people/faculty/de839f24_9947_43a6_9857_580ec3d07e2d.html
董曉芳 /people/faculty/abd60523_953f_48aa_862d_4b0893c88f4a.html
范青亮 /people/faculty/739b6285_0f8e_4683_b71c_640a896b687f.html
方穎 /people/faculty/94656316_8cb0_4d02_a822_4d06c12dddbe.html
馮崢暉 /people/faculty/cb02c396_6b12_497f_a724_9127aa37da33.html
Graham, Brett ?/people/faculty/3af92170_844d_48a4_875f_98ed85d04207.html
耿森 /people/faculty/04a8870f_d728_4e83_ba95_1d00b53cf6df.html
龔天益 /people/faculty/d7c4cd68_7489_419a_a23a_85265e67d6f9.html
管中閔 /people/faculty/d7ecca89_f116_4757_8c1e_759e435ab813.html
郭曄 /people/faculty/69499729_7f5d_4b32_9a3d_29413a8e7f71.html
韓乾 /people/faculty/27b6b1c7_9787_4747_bd44_9f2e481b5a0f.html
韓曉祎 /people/faculty/f0852907_3fc8_422e_8517_4c2c6343d3fa.html
何亞男 /people/faculty/04cbc55f_a447_4e01_b30b_ebf9d01b6f4c.html
洪永淼 /people/faculty/07848586_e55c_4e2b_8934_4df456307d7b.html
黃娟娟 /people/faculty/e03b1af7_9119_49d8_ac3a_1fd7e4843ee2.html
薛紹杰 /people/faculty/cb05eba1_f8f9_419d_86f3_f6d7e557d006.html
荊海偉 /people/faculty/5f0a030f_bcdb_4c92_87f8_f16fc4a454cc.html
賴小瓊 /people/faculty/159be896_9a94_4bb9_b967_65dacbef6332.html
李嘉楠 /people/faculty/45495497_f951_4f46_8546_17bafe4148e9.html
李夢玲 /people/faculty/44f6af2b_a423_4913_83ed_f83d0fa635e5.html
李木易 /people/faculty/386198a6_ff09_4105_8337_98be8d9eaf50.html
李培 /people/faculty/8799c2eb_2ac1_4354_b2a6_25f60eb93aa5.html
李迎星 /people/faculty/91a6e77b_4e97_4a7b_98ba_15a08f8bc5ef.html
李志文 /people/faculty/67b3184d_9989_42f1_84e4_c280962320a2.html
李智 /people/faculty/22c3d25f_913e_4f03_b40f_cd80a71a8cf7.html
廖謀華 /people/faculty/76d14b07_96cd_40de_bff1_276647bafb88.html
林光平 /people/faculty/b5a0449b_d991_4345_8802_e45be1adbda3.html
林海 /people/faculty/bf8bd4a1_dca2_4c08_8128_91120a5ffd84.html
林娟 /people/faculty/6714b425_91ba_40b4_95a1_e98299ffd21d.html
林明 /people/faculty/fadf2e50_6736_43b6_94a4_f0d69a3efb4b.html
劉鼎銘 /people/faculty/92f33f3c_4cdb_4abf_b030_8942ec17329f.html
劉繼春 /people/faculty/aad04279_03c4_4182_be07_4bf5f59f0e41.html
劉婧媛 /people/faculty/c85a8534_b940_4fad_b220_1e9ed73aacf0.html
龍小寧 /people/faculty/a4ba4fec_65fa_4775_9802_0200645bca74.html
馬超 /people/faculty/e1544cf5_21a6_4c35_b03f_3ba4845ef11c.html
馬雙鴿 /people/faculty/d8d1b107_2dfc_437a_b302_e4a1b43f0817.html
茅家銘 /people/faculty/600cf256_34ab_465b_8f60_d7a15bf56934.html
蒙莉娜 /people/faculty/61cd935f_51d0_4891_805e_b43354688765.html
孟磊 /people/faculty/78bdea7b_42dd_456c_bbc2_02c1db9ff980.html
牛霖琳 /people/faculty/3dd722d5_3c4f_41c2_a7bc_c69948e4714f.html
潘越 /people/faculty/a2c16c29_ba98_4883_bf69_a63d7de6c43f.html
屈文洲 /people/faculty/7b9aa674_62fb_4acf_b293_ff569f0a991a.html
任宇 /people/faculty/b134ac71_c990_4578_a730_4e90e1c50a4d.html
White, Chris /people/faculty/4c9e3afb_cb0b_4746_bbd5_e9e4302ed93a.html
王璐航 /people/faculty/dcb7ab35_a252_4e37_a31d_9ce86229cd85.html
王學新 /people/faculty/cfecc858_9c39_4fff_b056_eaf5999b83e6.html
王藝明 /people/faculty/f4448009_5c81_4725_9798_42ce40412ffb.html
王云 /people/faculty/06fc08d7_5dbd_4d28_8de9_4e7b57c04163.html
蕭政 /people/faculty/da83c84c_cb80_431c_97ea_0bb6bd31745f.html
謝沛霖 /people/faculty/a9a0a3b2_99cb_43a6_b683_43861065fe38.html
徐海峰 /people/faculty/faa2370a_0b25_40c5_80f3_75862906b6a3.html
許文超 /people/faculty/dc8a8b18_3b1e_443d_bd49_81d15fd56cde.html
楊荷 /people/faculty/90b06e5e_d49d_43e1_b18c_dd3c855e001c.html
姚加權 /people/faculty/0550534a_6c10_4e82_930c_20cec564e781.html
葉茂亮 /people/faculty/39653e4b_d311_4de5_8974_041b546ad9dc.html
張晶 /people/faculty/9ce540c8_708e_4cf7_8f37_9f00c7edc6a5.html
張爍珣 /people/faculty/17d9773b_6c4d_4314_b35f_ba0d614e2164.html
張宇 /people/faculty/e9bd8598_728f_490d_ab99_87bf6828d544.html
趙宏飆 /people/faculty/81a49a75_1576_4127_983c_3922c8d30e3b.html
趙敏強 /people/faculty/1c12aee5_f441_4978_b4d8_e7e71668e114.html
趙西亮 /people/faculty/86e0f1dd_132f_424c_a14d_ababd7e46463.html
趙燕菁 /people/faculty/66984253_3868_41cc_92da_f17231137282.html
鄭鳴 /people/faculty/721ba480_06f3_4c63_8a91_a562159360ff.html
鄭挺國 /people/faculty/c5e82359_fd50_4b65_b263_cd974783eb0d.html
鐘威 /people/faculty/353d37aa_7187_4486_9712_9f70cf6c4222.html
衷楠 /people/faculty/58717416_c68a_48a5_a60c_8457ddc06e8b.html
周穎剛 /people/faculty/78caf248_ab50_47bc_8f9d_2351a66d1db0.html
鄒至莊 /people/faculty/c8d8f928_1fbf_4cdb_86e5_eb93b910e31b.html
'''
好的,到這里一個原型就完成了。這就是一個非常簡單的爬蟲,總代碼不過十幾行。復雜到幾百幾千行的爬蟲,都是在這樣的一個原型的基礎上不斷深化、不斷完善得到的。
后面的爬蟲系列,我們會詳細講解三個部分,然后把每個模塊拼起來成一個爬蟲。之后我們還會見到更多爬蟲方法和爬蟲實例。我們下次見~
總結
以上是生活随笔為你收集整理的python简单爬虫入门一_Python爬虫快速入门:基本结构简单实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java吃货联盟app讲解_吃货联盟订餐
- 下一篇: python识别虚假新闻的分类器_使用N