如今咱們用XPath來作一個簡單的爬蟲,咱們嘗試爬取某個貼吧裏的全部帖子且將該帖子裏每一個樓層發佈的圖片下載到本地。html
#-*- coding:utf-8 -*- #tieba_xpath.py """ 做用:本案例使用XPath作一個簡單的爬蟲,咱們嘗試爬去某個貼吧的全部帖子 """ import os import urllib2 import urllib 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 DOM文檔 selector = etree.HTML(html) #抓取當前頁面的全部帖子的url的後半部分,也就是帖子編號 #http://tieba.baidu.com/p/4884069807裏的"p/4884069807" links = selector.xpath('//div[@class="threadlist_lz clearfix"]/div/a[@rel="noreferrer"]/@href') #links類型爲etreeElementString列表 #遍歷列表,而且合併爲一個帖子地址,調用圖片處理函數loadImage for link in links: link = "http://tieba.baidu.com" + link self.loadImage(link) #獲取圖片 def loadImage(self, link): req = urllib2.Request(link, headers = self.ua_header) html = urllib2.urlopen(req).read() selector = etree.HTML(html) #獲取這個帖子裏面全部圖片的src路徑 imageLinks = selector.xpath('//img[@class="BDE_Image"]/@src') #依次取出圖片路徑,下載保存 for imageLink in imageLinks: self.writeImages(imageLink) #保存頁面內容 def writeImages(self, imageLink): """ 將images裏的二進制內容存入到userName文件中 """ print(imageLink) print "正在存儲文件 %d..."%self.userName #1.打開一個文件,返回一個文件對象 file = open('./images/'+str(self.userName) + '.png', 'wb') #獲取圖片裏內容 images = urllib2.urlopen(imageLink).read() #調用文件對象write()方法,將page_html的內容寫入到文件裏 file.write(images) #最後關閉文件 file.close() #計數器自增1 self.userName += 1 #模擬__main__函數: if __name__ == '__main__': #首先建立爬蟲對象 mySpider = Spider() #調用爬蟲對象的方法,開始工做 mySpider.tiebaSpider()