注:以下所有python代碼均運行于2.7.0
最近想抓點數(shù)據(jù)存起來,開始搗鼓python把介。爬蟲技術(shù)以前沒接觸過勤讽,這一回就當練手,從零開始拗踢,從最原始的方式開始脚牍。先定個小目標,抓一下著名的“李毅吧”的一些貼子標題巢墅。
要爬數(shù)據(jù)诸狭,第一步肯定是網(wǎng)絡(luò)請求,在這里主要是指get/post請求君纫。第二步是對返回的html進行解析驯遇。第三步是從解析后的DOM樹里取我們想要的東西。
在這些步驟進行之前蓄髓,要先安裝lxml叉庐,這個用pip install lxml就可以了。
第一步会喝,使用urllib2陡叠,先把李毅吧的url請求一下。百度目前使用的是https肢执,這個沒關(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ā)者工具定位到貼吧的貼子都是位于一個div里面淳蔼,這個div的id是content侧蘸,class也是content。每個貼子的標題都是一個超鏈接鹉梨,標題內(nèi)容放在這個超鏈接的title里讳癌。
簡單的介紹一下lxml的路徑表達式:
//body/a[1] 取body下的第一個a元素 //a[@href] 取所有擁有屬性名為href的a元素 //a[@href='img.html'] 取所有htre屬性為img.html的a元素 根據(jù)前面的分析,要取到貼子的標題存皂,需要這么寫 //div[@id='content']//a//@title
下面開始解析:
e = etree.HTML(decode_html) l = e.xpath("http://div[@id='content']//a//@title")
第二步到此為止晌坤,通過xpath能匹配到所有的貼子標題。
第三步就是數(shù)據(jù)過濾旦袋、清洗骤菠、轉(zhuǎn)換、存儲之類的工作了疤孕,沒有什么通用性商乎。因為l是一個列表,里面又存的是utf8祭阀,對于一些新手來說鹉戚,可能很抓狂,因為不能很直觀地看到漢字柬讨。
加上這一段就好了:
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
這個代碼沒有真正實現(xiàn)只抓貼子標題的功能崩瓤,抓的內(nèi)容超出了貼子標題的范圍。還需要優(yōu)化一下才可以的踩官。
![try_baidu_liyi.png](http://upload-images.jianshu.io/upload_images/5205908-e446959a38a2d768.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)