1. 程式人生 > >python XML實例

python XML實例

number 存儲文件 spa 當前頁 列表 ima lan rfi 編碼格式

案例:使用XPath的爬蟲

現在我們用XPath來做一個簡單的爬蟲,我們嘗試爬取某個貼吧裏的所有帖子,並且將該這個帖子裏每個樓層發布的圖片下載到本地。

# tieba_xpath.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import urllib
import urllib2
from lxml import etree

class Spider:
    def __init__(self):
        self.tiebaName = raw_input("請需要訪問的貼吧:")
        self.beginPage = int(raw_input("請輸入起始頁:"))
        self.endPage = int(raw_input("請輸入終止頁:"))

        self.url = ‘http://tieba.baidu.com/f‘
        self.ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1 Trident/5.0;"}

        # 圖片編號
        self.userName = 1

    def tiebaSpider(self):
        for page in range(self.beginPage, self.endPage + 1):
            pn = (page - 1) * 50 # page number
            word = {‘pn‘ : pn, ‘kw‘: self.tiebaName}

            word = urllib.urlencode(word) #轉換成url編碼格式(字符串)
            myUrl = self.url + "?" + word

            # 示例:http://tieba.baidu.com/f? kw=%E7%BE%8E%E5%A5%B3 & pn=50
            # 調用 頁面處理函數 load_Page
            # 並且獲取頁面所有帖子鏈接,
            links = self.loadPage(myUrl)  # urllib2_test3.py

    # 讀取頁面內容
    def loadPage(self, url):
        req = urllib2.Request(url, headers = self.ua_header)
        html = urllib2.urlopen(req).read()

        # 解析html 為 HTML 文檔
        selector=etree.HTML(html)

        #抓取當前頁面的所有帖子的url的後半部分,也就是帖子編號
        # http://tieba.baidu.com/p/4884069807裏的 “p/4884069807”
        links = selector.xpath(‘//div[@class="threadlist_lz clearfix"][email protected]
/* */) # links 類型為 etreeElementString 列表 # 遍歷列表,並且合並成一個帖子地址,調用 圖片處理函數 loadImage for link in links: link = "http://tieba.baidu.com" + link self.loadImages(link) # 獲取圖片 def loadImages(self, link): req = urllib2.Request(link, headers = self.ua_header) html = urllib2.urlopen(req).read() selector = etree.HTML(html) # 獲取這個帖子裏所有圖片的src路徑 imagesLinks = selector.xpath(‘//img[@class="BDE_Image"][email protected]
/* */) # 依次取出圖片路徑,下載保存 for imagesLink in imagesLinks: self.writeImages(imagesLink) # 保存頁面內容 def writeImages(self, imagesLink): ‘‘‘ 將 images 裏的二進制內容存入到 userNname 文件中 ‘‘‘ print imagesLink print "正在存儲文件 %d ..." % self.userName # 1. 打開文件,返回一個文件對象 file = open(‘./images/‘ + str(self.userName) + ‘.png‘, ‘wb‘) # 2. 獲取圖片裏的內容 images = urllib2.urlopen(imagesLink).read() # 3. 調用文件對象write() 方法,將page_html的內容寫入到文件裏 file.write(images) # 4. 最後關閉文件 file.close() # 計數器自增1 self.userName += 1 # 模擬 main 函數 if __name__ == "__main__": # 首先創建爬蟲對象 mySpider = Spider() # 調用爬蟲對象的方法,開始工作 mySpider.tiebaSpider()

技術分享

python XML實例