python爬蟲入門 實(shí)戰(zhàn)(一)---爬糗事百科初窺XPath


注:(此篇為切換Markdown編輯器調(diào)整了格式重發(fā)的……強(qiáng)迫癥盛险,原來用富文本編輯器寫的太丑了)

今天第一次嘗試用python寫爬蟲费什,在w3shcool學(xué)習(xí)了一下XPath碍岔,用來找結(jié)點(diǎn)獲取內(nèi)容琐旁。過程中遇到幾個小問題,在這里記錄一下并分享給其他初學(xué)者窿锉。本文以爬取糗事百科為例枢赔,這里用的是python2.7倦始。

出現(xiàn)的問題:

  • socket.error: [Errno 10054]
  • xpath尋找結(jié)點(diǎn)的相對路徑的寫法

糗事百科是一個很容易爬的網(wǎng)站王浴,不需要登錄脆炎。熱門段子的URL是:http://www.qiushibaike.com/hot/page/2/

發(fā)送請求獲取html源碼

直接發(fā)送請求獲取網(wǎng)頁內(nèi)容就好了,page后面的數(shù)字可以用來翻頁氓辣。我們先來試一試直接發(fā)送請求并輸出response的內(nèi)容秒裕。注意請求要設(shè)置headers的內(nèi)容,可以審查元素查看需要設(shè)置的內(nèi)容筛婉。

# -*- coding:utf-8 -*-
import urllib
import urllib2

page=1
url='http://www.qiushibaike.com/hot/page/'+str(page)

user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36'
headers={'User-Agent':user_agent}

request=urllib2.Request(url,headers=headers)
response=urllib2.urlopen(request)
str_html= response.read()
response.close()

print str_html

運(yùn)行沒有問題簇爆,成功輸出了網(wǎng)頁源碼內(nèi)容。這里筆者出現(xiàn)一個疏忽爽撒,一開始因?yàn)闆]有close掉response,以至于遠(yuǎn)端主機(jī)重置了鏈接响蓉,出現(xiàn)socket.error: [Errno 10054] 硕勿。可能出現(xiàn)該錯誤的還有其他原因枫甲,具體可以參考這篇:python socket 超時設(shè)置 errno 10054

用xpath解析并找到目標(biāo)結(jié)點(diǎn)

我們先嘗試從簡單的開始源武,把當(dāng)前頁面的所有段子的作者名字爬下來輸出扼褪。首先先審查元素,看看頁面的結(jié)構(gòu)粱栖。

從上圖可以看到话浇,所有的段子以瀑布流的形式放在一個id="content-left"的div里面,段子有共同的特點(diǎn)class="article block untagged mb15"
那我們先獲取所有段子的整個div結(jié)點(diǎn)

tree=html.fromstring(str_html)
nodes=tree.xpath('//div[@id="content-left"]/div[@class="article block untagged mb15"]')

xpath的語法可以參考w3shcool里的XPath 教程闹究,或者其他資料幔崖。
然后我們繼續(xù)看段子的內(nèi)容結(jié)構(gòu),如下圖:

我們可以發(fā)現(xiàn)每個段子的第一個子div就是包含作者(用戶)名字和頭像信息的div渣淤,有共同的特點(diǎn)class="author clearfix"赏寇,然后具體的名字信息在該div下的子元素第二個a標(biāo)簽里的h2標(biāo)簽里。
了解了結(jié)構(gòu)我們可以進(jìn)行提取名字了价认。

tree=html.fromstring(str_html)
nodes=tree.xpath('//div[@id="content-left"]/div[@class="article block untagged mb15"]')
for node in nodes: 
  res_author=node.xpath('//div[@class="author clearfix"]/a[2]/h2')[0].text 
  print res_author

對于之前找到的每個段子結(jié)點(diǎn)嗅定,我們再找到class="author clearfix"的子div,再找到第二個a標(biāo)簽下的h2并獲取其text內(nèi)容用踩,即可渠退。但事實(shí)上上圖是一個錯誤的寫法,我們先運(yùn)行一下看結(jié)果脐彩。

結(jié)果所有段子結(jié)點(diǎn)貌似都輸出了同一個作者名字碎乃,但從頁面看,只有第一個作者是這個名字丁屎。修改后的正確代碼如下:
去掉了node.xpath路徑的開頭兩個正斜杠荠锭,一切都正常了。這是什么原因呢晨川。我又看了一下w3school上的教程证九,里面寫到:
相對路徑前面沒有斜杠,而有兩個斜杠是表示:
看起來有點(diǎn)拗口共虑,但我猜測應(yīng)該是用“//”都是從整個文檔開始找的愧怜,除非在之前加個特定元素,才會在特定元素的所有后代中找妈拌。
于是拥坛,我又測試了一下(下圖),符合我的猜測尘分,但可能是巧合猜惋,所以暫時先這么理解,如果有懂的同學(xué)看到這篇文章培愁,希望可以給我講解一下著摔。

從上圖結(jié)果看,用“//”果然可以從整個文檔中找到所有的段子作者定续,所以之前的代碼為什么會對所有的段子都輸出同一個作者呢谍咆,(猜測)是因?yàn)槊看窝h(huán)都從整個文檔找了一遍禾锤,而每次都是輸出下標(biāo)為[0]的作者名字,當(dāng)然就是一樣的摹察。
而修改后恩掷,變成了每個段子結(jié)點(diǎn)下的相對尋址,對于每個段子只有一個作者供嚎,所以下標(biāo)為[0]的結(jié)果就是該條段子的作者名字了黄娘。

爬取所有段子的主要信息(作者,內(nèi)容查坪,點(diǎn)贊和評論數(shù))

既然作者名字會爬寸宏,其他的文字信息也類似,都是用相對路徑的寫法找到偿曙。直接上完整代碼:(本文只簡單實(shí)現(xiàn)爬取文字內(nèi)容氮凝,沒有爬取圖片望忆。)

# -*- coding:utf-8 -*-
from lxml import html
import urllib
import urllib2

page=1
url='http://www.qiushibaike.com/hot/page/'+str(page)user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36'
headers={'User-Agent':user_agent}

request=urllib2.Request(url,headers=headers)
response=urllib2.urlopen(request)
str_html= response.read()
response.close()

tree=html.fromstring(str_html)
nodes=tree.xpath('//div[@id="content-left"]/div[@class="article block untagged mb15"]')

#循環(huán)對每個段子結(jié)點(diǎn)進(jìn)行輸出
for node in nodes: 
  #解析每個段子
  res_author=node.xpath('div[@class="author clearfix"]/a[2]/h2')[0].text 
  content=node.xpath('a[@class="contentHerf"]/div[@class="content"]/span')  [0].text 
  num_vote=node.xpath('div[@class="stats"]/span[@class="stats-vote"]/i')[0].text 
  num_comments=node.xpath('div[@class="stats"]/span[@class="stats-comments"]/a[@class="qiushi_comments"]/i')[0].text 

  #輸出指定內(nèi)容
  print u"作者:"+res_author 
  print "---------------------------------------------------------" 
  print u"內(nèi)容:"+content 
  print "---------------------------------------------------------" 
  print u"點(diǎn)贊:"+num_vote+u",評論:"+num_comments+"\n"

運(yùn)行結(jié)果截圖:

本文參考:

Python爬蟲實(shí)戰(zhàn)一之爬取糗事百科段子 | 靜覓
XPath 教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罩阵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子启摄,更是在濱河造成了極大的恐慌稿壁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歉备,死亡現(xiàn)場離奇詭異傅是,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蕾羊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門喧笔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人龟再,你說我怎么就攤上這事书闸。” “怎么了利凑?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵浆劲,是天一觀的道長。 經(jīng)常有香客問我哀澈,道長牌借,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任割按,我火速辦了婚禮走哺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哲虾。我一直安慰自己丙躏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布束凑。 她就那樣靜靜地躺著晒旅,像睡著了一般汪诉。 火紅的嫁衣襯著肌膚如雪废恋。 梳的紋絲不亂的頭發(fā)上扒寄,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天鱼鼓,我揣著相機(jī)與錄音该编,去河邊找鬼迄本。 笑死,一個胖子當(dāng)著我的面吹牛课竣,可吹牛的內(nèi)容都是我干的嘉赎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼于樟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迂曲?” 一聲冷哼從身側(cè)響起靶橱,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤路捧,失蹤者是張志新(化名)和其女友劉穎关霸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鬓长,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谒拴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涉波。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片英上。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡啤覆,死狀恐怖苍日,靈堂內(nèi)的尸體忽然破棺而出窗声,到底是詐尸還是另有隱情相恃,我是刑警寧澤笨觅,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布耕腾,位于F島的核電站,受9級特大地震影響杀糯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜固翰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一狼纬、第九天 我趴在偏房一處隱蔽的房頂上張望疗琉。 院中可真熱鬧,春花似錦、人聲如沸送火。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猖败。三九已至降允,卻和暖如春幢尚,著一層夾襖步出監(jiān)牢的瞬間翅楼,已是汗流浹背毅臊。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朗鸠,地道東北人式撼。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像美浦,于是被迫代替她去往敵國和親浦辨。 傳聞我的和親對象是個殘疾皇子流酬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容