Pycharm 5.0.3
IDE Pycharm
BeautifulSoup 4.5.0
如何在Pycharm下安裝BeautifulSoup請(qǐng)看
致力于打造最詳細(xì)的Requests使用(不定期補(bǔ)充)
還有強(qiáng)烈推薦@崔慶才--Python爬蟲利器二之Beautiful Soup的用法不能更詳細(xì)的用法介紹
都說(shuō)BeautifulSoup是利器蓉媳,那就記錄下bs的學(xué)習(xí)過(guò)程和代碼示例
從以前的幾篇博客上來(lái)看,我基本沒有使用BeautifulSoup來(lái)進(jìn)行對(duì)內(nèi)容的抓取撬码,可能我絕大多數(shù)對(duì)內(nèi)容抓取的都是動(dòng)態(tài)網(wǎng)頁(yè),而采用的selenium+phantomjs組合错蝴,抓的時(shí)候也是xpath定位元素的,接下來(lái)的一段時(shí)間颓芭,復(fù)習(xí)一下bs顷锰,正好有空也把正則撿撿,暑假到家屏幕只有一個(gè)了亡问,不適合寫工程類項(xiàng)目了官紫,所以還是撿撿復(fù)習(xí)復(fù)習(xí)基礎(chǔ)吧,就醬州藕!
牛刀時(shí)間
我們進(jìn)行網(wǎng)頁(yè)查看元素分析時(shí)候總能看到這樣的結(jié)構(gòu)
這個(gè)網(wǎng)頁(yè)結(jié)構(gòu)我就不進(jìn)行展開了束世,反正我也不太清楚,哈哈床玻,我負(fù)責(zé)的還是對(duì)數(shù)據(jù)進(jìn)行采集毁涉,知道怎么運(yùn)作,哪些元素锈死,tag就行了點(diǎn)擊了解html結(jié)構(gòu)
這里我還是對(duì)一個(gè)具體的小爬蟲進(jìn)行入手薪丁,爬自己學(xué)校的博士生導(dǎo)師,爬了兩層馅精。
BTW严嗜,我實(shí)在忍不住吐槽,這網(wǎng)頁(yè)做的是什么玩意啊洲敢,規(guī)范性去哪了B!压彭!爬起來(lái)好費(fèi)勁啊睦优。先上幾幅圖,按理來(lái)說(shuō)壮不,每個(gè)老師的介紹板塊應(yīng)該是一樣的汗盘,也應(yīng)該是由一個(gè)人寫的腳本,但是询一!這尼瑪隨便找了三個(gè)人我就看到三種形式隐孽,我真是醉了。健蕊。菱阵。
有這樣的--比較標(biāo)準(zhǔn)的
有這樣的,我快控制不住體內(nèi)的洪荒之力了缩功。晴及。。嫡锌。
還有直接這樣的虑稼。琳钉。。所有內(nèi)容都寫在一個(gè)標(biāo)簽里蛛倦,哥哥槽卫,你累不累啊,我爬也爬好累胰蝠,都快一個(gè)個(gè)點(diǎn)開看各自布局了!那爬蟲還有什么意義震蒋!
程序構(gòu)思
1.對(duì)首頁(yè)老師名字和第二層url進(jìn)行抓取茸塞,url可以采用正則的方式,然后再過(guò)濾一下查剖。當(dāng)然你也可以采用獲取標(biāo)簽屬性的方法進(jìn)行對(duì)url的收集
2.對(duì)1抓取的url進(jìn)行下一層的導(dǎo)師具體內(nèi)容的抓取钾虐,這是第二層,直接調(diào)用就好
3.循環(huán)輸出
上代碼
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import re
def getDetail(getURL):
html_detail = requests.get(getURL)
html_detail.encoding='gb2312'#規(guī)定編碼類型
bs_getDetail = BeautifulSoup(html_detail.text,'lxml')
for column in range(10):#防止采集不全數(shù)據(jù)
try:
print bs_getDetail.findAll("p",{"class":"MsoNormal"})[column].get_text()
except:
pass
url = 'http://icec.hrbeu.edu.cn/xintongxueyuan/ShowArticle.asp?ArticleID=138877'
html = requests.get(url)
html.encoding='gbk'#規(guī)定編碼類型笋庄,和第二層的網(wǎng)頁(yè)不是一個(gè)編碼
bs = BeautifulSoup(html.text,'lxml')#至于為什么要加'lxml'效扫,這是IDE提醒我添加上的,無(wú)傷大雅咯
url_f=[]#創(chuàng)建個(gè)列表用來(lái)存第二層url
for i in range(13,44):
url_f.append(bs.findAll("a",{"href":re.compile("/xintongxueyuan/ShowArticle.asp\?ArticleID=[0-9]+")})[i])
#跳過(guò)中間的(校內(nèi))直砂,校內(nèi)這幾個(gè)字也是同樣的結(jié)構(gòu)菌仁,只有這樣去除
if i < 35:
print bs.findAll("td",{"class":"STYLE3"})[i-12].get_text()
if i >=35:
print bs.findAll("td",{"class":"STYLE3"})[i-11].get_text()
getURL= u'http://icec.hrbeu.edu.cn'+re.findall(r"/xintongxueyuan/ShowArticle.asp\?ArticleID=[0-9]+",str(url_f[i-13]))[0]
print getURL
getDetail(getURL)#調(diào)用函數(shù)
print '#--------------------------------------------------------------#'
實(shí)現(xiàn)效果如下,絕大部分是正常的静暂;
刁 鳴
http://icec.hrbeu.edu.cn/xintongxueyuan/ShowArticle.asp?ArticleID=137277
刁 鳴济丘,男,1960年出生洽蛀,工學(xué)碩士摹迷,教授,工學(xué)碩士郊供、博士生導(dǎo)師峡碉,巴拉巴拉巴拉。驮审。鲫寄。
研究方向:寬帶信號(hào)檢測(cè)、處理與識(shí)別疯淫,通信信號(hào)處理
個(gè)人成果:先后承擔(dān)和參與省部級(jí)科研項(xiàng)目10余項(xiàng)塔拳,發(fā)表學(xué)術(shù)論文100余篇,巴拉巴拉巴拉峡竣。靠抑。。
聯(lián)系方式:diaoming@hrbeu.edu.cn
#--------------------------------------------------------------#
也有不正常的适掰。颂碧。荠列。
司偉建
http://icec.hrbeu.edu.cn/xintongxueyuan/ShowArticle.asp?ArticleID=65700
司偉建,男载城,1971年生肌似,工學(xué)博士,研究員诉瓦,博士生導(dǎo)師川队,巴拉巴拉巴拉。睬澡。固额。
招生專業(yè):信息與通信工程(博士、碩士)煞聪、電子與通信工程
研究方向:寬帶信號(hào)檢測(cè)斗躏、處理與識(shí)別;高精度無(wú)源測(cè)向技術(shù)昔脯;譜估計(jì)
個(gè)人成果:在國(guó)內(nèi)外核心期刊啄糙、會(huì)議發(fā)表學(xué)術(shù)論文70余篇,巴拉巴拉巴拉云稚。隧饼。。
#--------------------------------------------------------------#
絕大多數(shù)是正常的静陈,有幾個(gè)例外桑李,我估計(jì)不是一個(gè)人寫的腳本,不然差別不會(huì)差那么多窿给,以司偉建導(dǎo)師為例贵白,為什么缺少了聯(lián)系方式了呢?點(diǎn)開后才發(fā)現(xiàn)崩泡,他的聯(lián)系方式根本不在我的規(guī)則里禁荒,如下圖,別的老師都是在MsoNormal中角撞,他偏偏在結(jié)尾p標(biāo)簽處呛伴,我真是醉了。谒所。热康。。
這里就不在做具體的討論劣领,我選擇的項(xiàng)目根本不夠規(guī)范姐军,練習(xí)的BS4也就那么幾句,不規(guī)范的網(wǎng)頁(yè)對(duì)死板的代碼來(lái)說(shuō)殺傷力太大,我已經(jīng)加了幾個(gè)防范措施奕锌,比如try語(yǔ)句著觉,每次每個(gè)老師的MsoNormal選項(xiàng)個(gè)數(shù)總是不一樣,try多幾次惊暴,抓不到就pass饼丘,還有校內(nèi)這幾個(gè)字,規(guī)范和老師ID一樣辽话,我真無(wú)語(yǔ)肄鸽,還得中間靠if來(lái)去掉,如果靠正則油啤,估計(jì)又有點(diǎn)麻煩典徘。
遇到問題
1.requests編碼問題
1.解決方案,通過(guò)點(diǎn)擊網(wǎng)頁(yè)才發(fā)祥村砂,第一頁(yè)的編碼方式和第二層的編碼方式不一樣,看來(lái)踩點(diǎn)還是沒踩好屹逛,直接犯錯(cuò)础废,具體解決方法和urllib的方式不太一樣,具體可看致力于打造最詳細(xì)的Requests使用(不定期補(bǔ)充)里面的最后一節(jié)罕模,關(guān)于requests的一些編碼問題评腺。
2.BeautifulSoup和Re的一些組合問題
2.以bs.findAll("a",{"href":re.compile("/xintongxueyuan/ShowArticle.asp\?ArticleID=[0-9]+")})
為例,我們用的最多的莫過(guò)于findAll淑掌,它的實(shí)際用法是
findAll(tag,attributes,recursive,text,limit,keywords)
我們基本是用前面兩個(gè)參數(shù)就夠了蒿讥,前面那就話的意思是,先找到a標(biāo)簽抛腕,然后參數(shù)是href芋绸,里面的值我們用正則表達(dá)式來(lái)進(jìn)行篩選,注意這里要的是編譯好的正則
3.關(guān)于正則的一點(diǎn)使用
3.可以采用編譯好的正則來(lái)直接findall担敌,就像這兩個(gè)摔敛,是等價(jià)的
getURL= u'http://icec.hrbeu.edu.cn'+re.findall(r"/xintongxueyuan/ShowArticle.asp\?ArticleID=[0-9]+",str(url_f[i-13]))[0]
和下面這個(gè)編譯好的再進(jìn)行處理
p = r"/xintongxueyuan/ShowArticle.asp\?ArticleID=[0-9]+"
patten = re.compile(p)
getURL= u'http://icec.hrbeu.edu.cn'+patten.findall(str(url_f[i-13]))[0]
多用幾次,加深印象全封!
致謝
@崔慶才--Python爬蟲利器二之Beautiful Soup的用法
常用html元素總結(jié)包括基本結(jié)構(gòu)马昙、文檔類型、頭部刹悴、主體等等
@MrLevo520--致力于打造最詳細(xì)的Requests使用(不定期補(bǔ)充)