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

微信公衆號原文

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

舉個栗子,你們感覺一下人家的風格:python

的風格:正則表達式

圖片來源:網易數讀

小笨聰以爲他們作的圖表仍是很美觀清晰新穎的,就想所有下載下來學習學習。一張張手動下載好費事兒,嗯,人生苦短,我用 Python !編程

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

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裏的爬蟲利器,小笨聰前面的幾篇文章都有它的身影。對於想要快速學習的夥伴,我給你們推薦一個連接:學習

cuiqingcai.com/5517.html(崔慶才我的博客)測試

2.python-requests.org//zh_CN/late…(官方文檔)ui

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。url

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.下載結果

隨便點一個看看:

圖片來源:網易數讀

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

微信公衆號「學編程的金融客」後臺回覆「網易數讀」便可得到源碼。(禁止商用,不然後果自負。本文所用圖片侵刪。

微信公衆號原文


往期推薦

1.流浪地球影評

2.北上廣深租房圖鑑

3.圖蟲網美女

4.豬小屁視頻

5.拉勾網數據

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

保存掃碼關注公衆號唄

編輯於 19:25
相關文章
相關標籤/搜索