網易數讀是一個數據新聞可視化欄目,致力於提供輕量化的閱讀體驗。其內容每每是結合時下新聞熱點將相關數據可視化處理,並以精緻的圖文形式呈現出來。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 ,任意圖片均可如下載。 但咱們的目標是下載網易數讀的全部圖片,這時該怎麼寫呢?微信
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複製代碼
經過上面方法能夠獲取到 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 # 圖片添加編號順序
}
複製代碼
提取出的網址是一個 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.流浪地球影評
3.圖蟲網美女
4.豬小屁視頻
5.拉勾網數據
你的點贊和關注就是對我最大的支持!