網易數讀所有精緻圖片,Python百行代碼搞定!

微信公衆號原文鏈接

網易數讀是一個數據新聞可視化欄目,致力於提供輕量化的閱讀體驗。其內容往往是結合時下新聞熱點將相關數據可視化處理,並以精緻的圖文形式呈現出來。

舉個栗子,大家感受一下人家的風格:

圖片來源:網易數讀

 

小笨聰覺得他們做的圖表還是很美觀清晰新穎的,就想全部下載下來學習學習。一張張手動下載好費事兒,嗯,人生苦短,我用 Python !

單張圖片下載很簡單,可以利用 requests 庫的 get 請求,然後利用Response對象的content屬性,將圖片保存爲二進制形式。即用下面5行代碼就搞定:

import requests
url = 'http://cms-bucket.ws.126.net/2019/02/02/81b9ebced7514e66b4e969bab19af69c.png'
response = requests.get(url)
with open('2018百家姓.jpg', 'wb') as f:
    f.write(response.content)

 

這個方法也是初學 requests 庫時都會學到的;並且,只要修改 url ,任意圖片都可以下載。 但我們的目標是下載網易數讀的所有圖片,這時該怎麼寫呢?

 

1.requests獲取網頁內容

requests庫是python裏的爬蟲利器,小笨聰前面的幾篇文章都有它的身影。對於想要快速學習的夥伴,我給大家推薦一個鏈接:

https://cuiqingcai.com/5517.html(崔慶才個人博客)

https://2.python-requests.org//zh_CN/latest/index.html(官方文檔)

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    }

def get_page_index():
    url = 'http://data.163.com/special/datablog/'
    try:
        response = requests.get(url,headers = headers)
        if response.status_code == 200:
            return response.text
            # print(response.text)  # 測試網頁內容是否提取成功
    except RequestException:
        print('網頁請求失敗')
        return None

def get_page_detail(item):
    url = item.get('url')
    try:
        response = requests.get(url,headers = headers)
        if response.status_code == 200:
            # print(url) #測試url ok
            return response.text
    except RequestException:
        print('網頁請求失敗')
        return None

2.解析網頁內容

通過上面方法可以獲取到 html 內容,接下來解析 html 字符串內容,從中提取出網頁內的圖片 url。解析和提取 url 的方法有很多種,常見的有5種,分別是:正則表達式、Xpath、BeautifulSoup、CSS、PyQuery。這裏小笨聰採用了 BeautifulSoup。

def parse_page_index(html):
    pattern = re.compile(r'"url":"(.*?)".*?"title":"(.*?)".*?"img":"(.*?)".*?"time":"(.*?)".*?"comment":(.*?),',re.S)
    items = re.findall(pattern,html)
    # print(items)
    for item in items:
        yield{
        'url':item[0],
        'title':item[1],
        'img':item[2],
        'time':item[3],
        'comment':item[4][1:-1]
        }

def parse_page_detail2(html):
    soup = BeautifulSoup(html,'lxml')
    items = soup.select('p > a > img')
    # print(len(items))
    title = soup.h1.string
    for i in range(len(items)):
        pic = items[i].attrs['src']
        yield{
        'title':title,
        'pic':pic,
        'num':i  # 圖片添加編號順序
        }

3.下載並保存圖片

提取出的網址是一個 dict 字典,通過 dict 的 get 方法調用裏面的鍵和值。然後建立文件夾存放已經過編號的圖片。

def save_pic(pic):
    title = pic.get('title')
    title = re.sub('[\/:*?"<>|]','-',title)
    url = pic.get('pic')
    # 設置圖片編號順序
    num = pic.get('num')

    if not os.path.exists(title):
        os.mkdir(title)

    # 獲取圖片url網頁信息
    response = requests.get(url,headers = headers)
    try:
    # 建立圖片存放地址
        if response.status_code == 200:
            file_path = '{0}\{1}.{2}' .format(title,num,'jpg')
            # 文件名採用編號方便按順序查看,而未採用哈希值md5(response.content).hexdigest()
            if not os.path.exists(file_path):
                # 開始下載圖片
                with open(file_path,'wb') as f:
                    f.write(response.content)
                    print('該圖片已下載完成',title)
            else:
                print('該圖片%s 已下載' %title)
    except RequestException as e:
        print(e,'圖片獲取失敗')
        return None

4.下載結果

隨便點一個看看:

圖片來源:網易數讀

以上就是本次爬取網易數讀圖片的過程。

微信公衆號“學編程的金融客”後臺回覆“網易數讀”即可獲得源碼。(禁止商用,否則後果自負。本文所用圖片侵刪。

https://mp.weixin.qq.com/s?__biz=MzI1NzY0MTY3MA==&mid=2247484175&idx=1&sn=84ff6105f75169ea15b596c4a231f280&chksm=ea151ea6dd6297b0b022002c6af735cf2e5557faf8079d60372266f0f8b2366c83bb4ec77620&token=1892740331&lang=zh_CN#rd​mp.weixin.qq.com

 

往期推薦

1.流浪地球影評

2.北上廣深租房圖鑑

3.圖蟲網美女

4.豬小屁視頻

5.拉勾網數據

你的點贊和關注就是對我最大的支持!

保存掃碼關注公衆號唄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章