在上一篇文章的基礎上增長獲取百度貼吧的頭像圖片的功能,使用到的技術爲XPath,Requests,具體實現以下:html
1. 查看網頁源代碼
測試網頁連接:http://tieba.baidu.com/p/3522395718?pn=1 經過Chrome定位頭像的HTML的代碼函數
每一樓層的標籤是:post
class="l_post j_l_post l_post_bright "
從樓層開始,直到定位到照片順序應該是測試
2. 提取XPath信息
經過XPath一步步獲取到<img>這一層,提取到這個標籤中的src就能夠獲取到圖片的urlurl
ImgLink = ImgFilter.xpath('//div[@class="l_post j_l_post l_post_bright "]')[0] links = ImgLink.xpath('//div[@class="d_author"]/ul/li/div[@class="icon_relative j_user_card"]/a/img/@data-tb-lazyload')
這裏會遇到一個問題,若是第二個XPath的條件是/img/@src則會遇到一個問題:
使用requests獲取到的html會有不少空白的頭像spa
'http://tb2.bdstatic.com/tb/static-pb/img/head_80.jpg'
這是由於網頁是分步加載的,首先使用默認的頭像展現,再逐步下載自定義頭像替換,所以還要獲得自定義頭像的地址,經過分析網頁代碼,能夠發現:code
<img username="Loveyqiang7" class="" src="http://tb2.bdstatic.com/tb/static-pb/img/head_80.jpg" data-tb-lazyload="http://tb.himg.baidu.com/sys/portrait/item/07c44c6f7665797169616e67372941">
「data-tb-lazyload」這個纔是真正的自定義頭像的連接地址orm
3. 去掉獲取到的連接中的重複值
因爲貼吧的不一樣的樓層是有多是同一我的,即同一個頭像的;爲了節省空間,咱們要去除掉重複的圖像,在Python中能夠經過函數set()去除列表重複值xml
links = list(set(links))
測試一下:htm
print("before set list:{0}".format(len(links))) links = list(set(links)) print("after set list:{0}".format(len(links)))
測試結果:
before set list:27 after set list:21
成功消除掉了重複的連接
4.將連接存儲到jpeg文件
Requests庫中包含了獲取數據的方法get(),可使用該方法將連接存儲到文件中
with open("img{0}.jpeg".format(i),"wb") as code: code.write(graphic.content)
完整程序(可直接使用)
#-*-coding:utf8-*- from lxml import etree import requests import re def GetImgLink(url): html = requests.get(url) html = re.sub(r'charset=(/w*)', 'charset=UTF-8', html.text) ImgFilter = etree.HTML(html) ImgLink = ImgFilter.xpath('//div[@class="l_post j_l_post l_post_bright "]')[0] links = ImgLink.xpath('//div[@class="d_author"]/ul/li/div[@class="icon_relative j_user_card"]/a/img/@data-tb-lazyload') #links = ImgLink.xpath('//div[@class="d_author"]/ul/li/div[@class="icon_relative j_user_card"]/a/img/@src') print(links) print("before set list:{0}".format(len(links))) links = list(set(links)) print("after set list:{0}".format(len(links))) i = 0 for each_link in links: graphic = requests.get(each_link) with open("img{0}.jpeg".format(i),"wb") as code: code.write(graphic.content) i = i + 1 pagelink = 'http://tieba.baidu.com/p/3522395718?pn=1' GetImgLink(pagelink)
測試結果: