python爬蟲 Day04

目錄:

python爬蟲 Day04

Xpath工具(解析html)

Xpath

  • 在XML文檔中查找信息的語言,同樣適用於HTML文檔的檢索

Xpath輔助工具

  1. Chrome插件 : XPath Helper
    打開/關閉 : Ctrl + Shift + 大寫X
  2. FireFox插件 :XPath checker
  3. XPath表達式編輯工具 : XML Quire

XPath匹配規則

  1. 匹配演示
    1. 查找bookstore下面的所有節點 : /bookstore
    2. 查找所有的book節點 : //book
    3. 查找所有book節點下title節點中,lang屬性爲"en"的節點 : //book/title[@lang=“en”]
  2. 選取節點
    / : 從根節點開始選取 /bookstore
    // : 從整個文檔中查找某個節點 //price
    @ : 選取某個節點的屬性 //title[@lang=“en”]
  3. @使用
  4. 選取1個節點 : //title[@lang=“en”]
  5. 選取N個節點 : //title[@lang]
  6. 選取節點屬性值 : //title/@lang
  7. 匹配多路徑
  8. 符號 : |
  9. 示例
  • 獲取所有book節點下的title節點和price節點
  • //book/title | //book/price
  1. 函數
    • contains() : 匹配1個屬性值中包含某些字符串的節點
    • //title[contains(@lang,"e")]

安裝環境

  1. win7 環境
    1. 進入cmd ,輸入:python -m pip install lxml

解析HTML源碼

  1. lxml庫 : HTML/XML解析庫
    1. 安裝
      conda install lxml
      pip install lxml
  2. 使用流程
    1. 利用lxml庫的etree模塊構建解析對象
    2. 解析對象調用xpath工具定位節點信息
  3. 使用
    1. 導入模塊 from lxml import etree
    2. 創建解析對象 : parseHtml = etree.HTML(html)
    3. 調用xpath進行解析
      • r_list = parseHtml.xpath('//title[@lang="en"]')
      • 只要調用了xpath,則結果一定是列表
  4. 示例+練習
    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.案例 : 抓取百度貼吧帖子裏面的圖片

  1. 目標 : 抓貼吧中帖子圖片
  2. 思路
  3. 獲取貼吧主頁URL : 美女吧 下一頁:URL規律
  4. 獲取美女吧中每個帖子的 URL
  5. 對每個帖子發請求,獲取帖子裏所有圖片的URL
  6. 對圖片URL發請求,以wb的方式寫入本地文件
    3.步驟
  7. 獲取貼吧的URL
    http://tieba.baidu.com/f? + 一堆的查詢參數
    pn = (page-1)*50
  8. 獲取每個帖子的URL
    http://tieba.baidu.com + /p/5869279412
    //div[@class="t_con cleafix"]/div/div/div/a/@href
  9. 打開每個帖子,圖片的URL
    http://imgsrc.baidu.com/forum/w%3D580/sign=6e7036eac31b9d168ac79a69c3dfb4eb/9b23f21fbe096b63ee92fa6501338744eaf8ace5.jpg
    xpath匹配: //img[@class="BDE_Image"]/@src
  10. 保存到本地
  11. ProxyBasicAuthHandler私密代理Handler處理器
    1. 密碼管理器使用流程

      1. 創建密碼管理器對象
        pwd=urllib.request.HTTPPasswordMgrWithDefaultRealm()
    2. 添加私密代理用戶名,密碼,IP地址,端口信息
      pwd.add_password(None,"IP:端口","用戶名","密碼")

    3. urllib.request.ProxyBasicAuthHandler(密碼管理器對象)

    4. 代碼:

      
      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)
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章