注:以下所有python代碼均運(yùn)行于2.7.0
最近想抓點(diǎn)數(shù)據(jù)存起來,開始搗鼓python。爬蟲技術(shù)以前沒接觸過,這一回就當(dāng)練手,從零開始,從最原始的方式開始。先定個(gè)小目標(biāo),抓一下著名的“李毅吧”的一些貼子標(biāo)題。
要爬數(shù)據(jù),第一步肯定是網(wǎng)絡(luò)請(qǐng)求,在這里主要是指get/post請(qǐng)求。第二步是對(duì)返回的html進(jìn)行解析。第三步是從解析后的DOM樹里取我們想要的東西。
在這些步驟進(jìn)行之前,要先安裝lxml,這個(gè)用pip install lxml就可以了。
第一步,使用urllib2,先把李毅吧的url請(qǐng)求一下。百度目前使用的是https,這個(gè)沒關(guān)系。https://tieba.baidu.com/f?ie=utf-8&kw=%E6%9D%8E%E6%AF%85/
然后打開命令窗口,python。let's go。
import urllib2 from lxml import etree r = urllib2.urlopen("https://tieba.baidu.com/f?ie=utf-8&kw=%E6%9D%8E%E6%AF%85") p = r.read()
好了,是不是代碼很簡短,我們第一步就完成了。
第二步,要引入lxml,來解析取到的html文件。解析前肯定是要用開發(fā)者工具先分析一下html源碼的,要不然怎么找到規(guī)律去匹配我們想要的內(nèi)容呢。用開發(fā)者工具定位到貼吧的貼子都是位于一個(gè)div里面,這個(gè)div的id是content,class也是content。每個(gè)貼子的標(biāo)題都是一個(gè)超鏈接,標(biāo)題內(nèi)容放在這個(gè)超鏈接的title里。
簡單的介紹一下lxml的路徑表達(dá)式:
//body/a[1] 取body下的第一個(gè)a元素 //a[@href] 取所有擁有屬性名為href的a元素 //a[@href='img.html'] 取所有htre屬性為img.html的a元素 根據(jù)前面的分析,要取到貼子的標(biāo)題,需要這么寫 //div[@id='content']//a//@title
下面開始解析:
e = etree.HTML(decode_html) l = e.xpath("http://div[@id='content']//a//@title")
第二步到此為止,通過xpath能匹配到所有的貼子標(biāo)題。
第三步就是數(shù)據(jù)過濾、清洗、轉(zhuǎn)換、存儲(chǔ)之類的工作了,沒有什么通用性。因?yàn)閘是一個(gè)列表,里面又存的是utf8,對(duì)于一些新手來說,可能很抓狂,因?yàn)椴荒芎苤庇^地看到漢字。
加上這一段就好了:
print item```
最后附上代碼:
`#-*- coding: utf-8 -*-`
import urllib2
import lxml
from lxml import etree
r = urllib2.urlopen("https://tieba.baidu.com/f?ie=utf-8&kw=%E6%9D%8E%E6%AF%85")
raw_html = r.read()
decode_html = raw_html.decode("utf-8")
dom_html = etree.HTML(decode_html)
title_list = dom_html.xpath("http://div[@id='content']//a//@title")
for item in title_list:
print item
這個(gè)代碼沒有真正實(shí)現(xiàn)只抓貼子標(biāo)題的功能,抓的內(nèi)容超出了貼子標(biāo)題的范圍。還需要優(yōu)化一下才可以的。
