目錄:
python爬蟲 Day04
Xpath工具(解析html)
Xpath
- 在XML文檔中查找信息的語言,同樣適用於HTML文檔的檢索
Xpath輔助工具
- Chrome插件 : XPath Helper
打開/關閉 : Ctrl + Shift + 大寫X - FireFox插件 :XPath checker
- XPath表達式編輯工具 : XML Quire
XPath匹配規則
- 匹配演示
- 查找bookstore下面的所有節點 : /bookstore
- 查找所有的book節點 : //book
- 查找所有book節點下title節點中,lang屬性爲"en"的節點 : //book/title[@lang=“en”]
- 選取節點
/
: 從根節點開始選取 /bookstore
//
: 從整個文檔中查找某個節點 //price
@
: 選取某個節點的屬性 //title[@lang=“en”] - @使用
- 選取1個節點 : //title[@lang=“en”]
- 選取N個節點 : //title[@lang]
- 選取節點屬性值 : //title/@lang
- 匹配多路徑
- 符號 : |
- 示例
- 獲取所有book節點下的title節點和price節點
//book/title | //book/price
- 函數
- contains() : 匹配1個屬性值中包含某些字符串的節點
//title[contains(@lang,"e")]
安裝環境
- win7 環境
- 進入cmd ,輸入:
python -m pip install lxml
- 進入cmd ,輸入:
解析HTML源碼
- lxml庫 : HTML/XML解析庫
- 安裝
conda install lxml
pip install lxml
- 安裝
- 使用流程
- 利用lxml庫的etree模塊構建解析對象
- 解析對象調用xpath工具定位節點信息
- 使用
- 導入模塊 from lxml import etree
- 創建解析對象 : parseHtml = etree.HTML(html)
- 調用xpath進行解析
r_list = parseHtml.xpath('//title[@lang="en"]')
- 只要調用了xpath,則結果一定是列表
- 示例+練習
from lxml import etree html = """<div class="wrapper"> <i class="iconfont icon-back" id="back"></i> <a href="/" id="channel">新浪社會</a> <ul id="nav"> <li><a href="http://domestic.firefox.sina.com/" title="國內">國內</a></li> <li><a href="http://world.firefox.sina.com/" title="國際">國際</a></li> <li><a href="http://mil.firefox.sina.com/" title="軍事">軍事</a></li> <li><a href="http://photo.firefox.sina.com/" title="圖片">圖片</a></li> <li><a href="http://society.firefox.sina.com/" title="社會">社會</a></li> <li><a href="http://ent.firefox.sina.com/" title="娛樂">娛樂</a></li> <li><a href="http://tech.firefox.sina.com/" title="科技">科技</a></li> <li><a href="http://sports.firefox.sina.com/" title="體育">體育</a></li> <li><a href="http://finance.firefox.sina.com/" title="財經">財經</a></li> <li><a href="http://auto.firefox.sina.com/" title="汽車">汽車</a></li> </ul> <i class="iconfont icon-liebiao" id="menu"></i> </div>""" # 1.構建解析對象 parseHtml = etree.HTML(html) # 2.解析對象調用 xpath 工具 # 獲取所有a標籤的 href屬性值 r_list = parseHtml.xpath('//a/@href') #for i in r_list: # print(i) # 獲取 / r_list = parseHtml.xpath( '//a[@id="channel"]/@href') #print(r_list) # 獲取 非 / #r_list = parseHtml.xpath( # '//ul[@id="nav"]/li/a/@href') r_list = parseHtml.xpath( '//ul[@id="nav"]//a/@href') #print(r_list) # 獲取所有<a>節點的文本內容 r_list = parseHtml.xpath('//a') # 得到的是元素對象,需要用 對象名.text 獲取內容 #for i in r_list: # print(i.text) # 獲取 新浪社會 r_list = parseHtml.xpath('//a[@id="channel"]') #for i in r_list: # print(i.text) # 獲取非 新浪社會 的節點文本 r_list = parseHtml.xpath('//ul[@id="nav"]//a') for i in r_list: print(i.text)
4.案例 : 抓取百度貼吧帖子裏面的圖片
- 目標 : 抓貼吧中帖子圖片
- 思路
- 獲取貼吧主頁URL : 美女吧 下一頁:URL規律
- 獲取美女吧中每個帖子的 URL
- 對每個帖子發請求,獲取帖子裏所有圖片的URL
- 對圖片URL發請求,以wb的方式寫入本地文件
3.步驟 - 獲取貼吧的URL
http://tieba.baidu.com/f? + 一堆的查詢參數
pn = (page-1)*50
- 獲取每個帖子的URL
http://tieba.baidu.com + /p/5869279412
//div[@class="t_con cleafix"]/div/div/div/a/@href
- 打開每個帖子,圖片的URL
http://imgsrc.baidu.com/forum/w%3D580/sign=6e7036eac31b9d168ac79a69c3dfb4eb/9b23f21fbe096b63ee92fa6501338744eaf8ace5.jpg
xpath匹配: //img[@class="BDE_Image"]/@src
- 保存到本地
- ProxyBasicAuthHandler私密代理Handler處理器
-
密碼管理器使用流程
- 創建密碼管理器對象
pwd=urllib.request.HTTPPasswordMgrWithDefaultRealm()
- 創建密碼管理器對象
-
添加私密代理用戶名,密碼,IP地址,端口信息
pwd.add_password(None,"IP:端口","用戶名","密碼")
-
urllib.request.ProxyBasicAuthHandler(密碼管理器對象)
-
代碼:
server = "114.67.228.126:16819" user = "309435365" password = "szayclhp" url = "http://www.baidu.com/" tarenaUrl = "http://code.tarena.com.cn/" # 密碼管理器對象操作 pwd = urllib.request.HTTPPasswordMgrWithDefaultRealm() pwd.add_password(None,server,user,password) #pwd.add_password(None,tarenaUrl,"tarenacode","code_2013") # 創建處理器對象 proxy_handler = urllib.request.ProxyBasicAuthHandler(pwd) opener = urllib.request.build_opener(proxy_handler) # 發請求 req = urllib.request.Request(url) res = opener.open(req) html = res.read().decode("utf-8") print(html)
-