獲取百度貼吧頭像的爬蟲

在上一篇文章的基礎上增長獲取百度貼吧的頭像圖片的功能,使用到的技術爲XPath,Requests,具體實現以下:html

1. 查看網頁源代碼
測試網頁連接:http://tieba.baidu.com/p/3522395718?pn=1 經過Chrome定位頭像的HTML的代碼函數

clipboard.png

每一樓層的標籤是:post

class="l_post j_l_post l_post_bright  "

從樓層開始,直到定位到照片順序應該是測試

clipboard.png

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'

clipboard.png
這是由於網頁是分步加載的,首先使用默認的頭像展現,再逐步下載自定義頭像替換,所以還要獲得自定義頭像的地址,經過分析網頁代碼,能夠發現: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)

測試結果:

clipboard.png

clipboard.png

相關文章
相關標籤/搜索