案例教程按以下分類:
按爬去內(nèi)容分成的三種類型,HTML代碼包含型、JS生成型、AJAX異步加載型
按是否需要登錄。
首先講解最簡(jiǎn)單的無(wú)需登錄HTML代碼包含型,以豆瓣電影為例
所需用到的庫(kù)有,re、urllib。均為python內(nèi)置包,無(wú)需下載,直接引入。re為正則表達(dá)式所需包,urllib是核心的爬蟲基礎(chǔ)包。
re正則表達(dá)式及urllib簡(jiǎn)單講解
1.re正則表達(dá)式的常用匹配方法
re.compile
把正則表達(dá)式編譯成一個(gè)正則表達(dá)式對(duì)象
re.match 和re.search
re.match匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search匹配整個(gè)字符串,直到找到一個(gè)匹配。返回為一個(gè)地址,所以需結(jié)合group使用
re.findall
re.findall可以獲取字符串中所有匹配的字符串。以數(shù)組形式返回,匹配失敗返回空數(shù)組
2.urllib
urllib使用很簡(jiǎn)單,兩行就可以得到結(jié)果,首先通過(guò)urlopen函數(shù)傳入url,然后read函數(shù)獲取該url對(duì)應(yīng)網(wǎng)頁(yè)的源代碼。urlopen一般接受三個(gè)參數(shù),urlopen(url,data,timeout),第一個(gè)參數(shù)url即為URL,第二個(gè)參數(shù)data是訪問(wèn)URL時(shí)要傳送的數(shù)據(jù),第三個(gè)timeout是設(shè)置超時(shí)時(shí)間。第二第三個(gè)參數(shù)可不設(shè)置。示例如下:
response=urllib.urlopen("http://www.baidu.com")
print response.read()
源代碼及結(jié)果
以爬去豆瓣電影top250的前5條數(shù)據(jù)為例,源代碼及如下
運(yùn)行可在cmd(windows+R鍵,輸入cmd)里執(zhí)行,python命令 執(zhí)行代碼所在路徑即可,(貼士:tab鍵可自動(dòng)補(bǔ)全路徑),如這里代碼存儲(chǔ)路徑為e:\codes\douban.py. douban.py為代碼文件名。運(yùn)行結(jié)果如下:rate為電影評(píng)分,inq為簡(jiǎn)介,title為電影名。
代碼具體講解
大致思路:分析所需爬去的網(wǎng)址,urllib發(fā)送請(qǐng)求獲取返回html,re正則表達(dá)式匹配所需內(nèi)容
前兩行:newmovie代表存儲(chǔ)每一條電影數(shù)據(jù)(包括名稱、評(píng)分、簡(jiǎn)介)字典型變量,movieList存儲(chǔ)所有電影數(shù)據(jù)的列表。后三行為所需獲取每一條電影的具體三個(gè)數(shù)據(jù)的正則匹配式,.*?代表匹配多個(gè)字符(.*?)代表所需抓取的多個(gè)字符(一個(gè)萬(wàn)能的匹配式)。
該匹配式需要觀察具體頁(yè)面的html代碼,以后兩者為例,下圖為豆瓣網(wǎng)頁(yè)的html代碼,也可在開(kāi)發(fā)者工具中查看。所以按照上圖中的表達(dá)式,評(píng)分匹配出的數(shù)據(jù)即為9.6,簡(jiǎn)介匹配出的數(shù)據(jù)為“希望讓人自由”
核心代碼
這里爬取5條數(shù)據(jù),設(shè)置循環(huán)條件為5,設(shè)置url,豆瓣每條電影數(shù)據(jù)是根據(jù)start來(lái)篩選,start=0則是第一條數(shù)據(jù)放于頂部,可自行在輸入該url在地址欄查看。不同網(wǎng)站可能會(huì)有差異,爬去之前需要分析數(shù)據(jù)顯示的規(guī)律。第三行使用urllib打開(kāi)網(wǎng)址并讀取返回?cái)?shù)據(jù),最后使用decode將其解碼,大多數(shù)中文網(wǎng)站的網(wǎng)頁(yè)是以u(píng)tf-8形式編寫。try部分則是具體的re匹配存取過(guò)程。
到此,爬取就結(jié)束啦,這只是一個(gè)最簡(jiǎn)單的演示,想獲取更多數(shù)據(jù)按以上程序擴(kuò)展就可以啦。