案例:使用XPath的爬蟲
現(xiàn)在我們用XPath來做一個簡單的爬蟲,我們嘗試爬取某個貼吧里的所有帖子后添,并且將該這個帖子里每個樓層發(fā)布的圖片下載到本地躏升。
# 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
# 調(diào)用 頁面處理函數(shù) load_Page
# 并且獲取頁面所有帖子鏈接,
links = self.loadPage(myUrl) # urllib2_test3.py
# 讀取頁面內(nèi)容
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"]/div/a/@href')
# links 類型為 etreeElementString 列表
# 遍歷列表孝鹊,并且合并成一個帖子地址扭仁,調(diào)用 圖片處理函數(shù) 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"]/@src')
# 依次取出圖片路徑垮衷,下載保存
for imagesLink in imagesLinks:
self.writeImages(imagesLink)
# 保存頁面內(nèi)容
def writeImages(self, imagesLink):
'''
將 images 里的二進制內(nèi)容存入到 userNname 文件中
'''
print imagesLink
print "正在存儲文件 %d ..." % self.userName
# 1. 打開文件,返回一個文件對象
file = open('./images/' + str(self.userName) + '.png', 'wb')
# 2. 獲取圖片里的內(nèi)容
images = urllib2.urlopen(imagesLink).read()
# 3. 調(diào)用文件對象write() 方法乖坠,將page_html的內(nèi)容寫入到文件里
file.write(images)
# 4. 最后關閉文件
file.close()
# 計數(shù)器自增1
self.userName += 1
# 模擬 main 函數(shù)
if __name__ == "__main__":
# 首先創(chuàng)建爬蟲對象
mySpider = Spider()
# 調(diào)用爬蟲對象的方法搀突,開始工作
mySpider.tiebaSpider()
image.png