本人長期出售超大量微博數(shù)據(jù)具垫、旅游網(wǎng)站評論數(shù)據(jù)隘擎,并提供各種指定數(shù)據(jù)爬取服務(wù)痢法,Message to YuboonaZhang@Yahoo.com边苹。同時歡迎加入社交媒體數(shù)據(jù)交流群:99918768
前言
最近在做機器學習下的人臉識別的學習陵且,機器學習這個東西有點暴力,很大程度上靠訓練的數(shù)據(jù)量來決定效果个束。為了找數(shù)據(jù)慕购,通過一個博客的指導,瀏覽了幾個很知名的數(shù)據(jù)集茬底。
幾個大型數(shù)據(jù)集是通過發(fā)郵件申請進行下載沪悲,幾個小型數(shù)據(jù)集直接在網(wǎng)頁的鏈接下載,還有一個Pubfig數(shù)據(jù)集則是提供了大量圖片的鏈接來讓我們自己寫程序來下載桩警。
權(quán)衡了數(shù)據(jù)量的需求可训,最后選擇Pubfig的數(shù)據(jù)集,于是就自己寫了一個python圖片采集程序捶枢,里面用了urllib和requests兩種方法.
分析Pubfig提供的下載文件的特點
![people](https://raw.githubusercontent.com/yuboona/yuboona.github.io/master/2018/02/03/python%E7%88%AC%E5%8F%96%E5%9B%BE%E7%89%87/people.png)
people
這個數(shù)據(jù)文件提供了在數(shù)據(jù)集中出現(xiàn)的所有人物
![urls](https://raw.githubusercontent.com/yuboona/yuboona.github.io/master/2018/02/03/python%E7%88%AC%E5%8F%96%E5%9B%BE%E7%89%87/urls.png)
urls
這個數(shù)據(jù)文件提供了每個人的urls
可以看出來這個數(shù)據(jù)集的處理其實非常簡單了握截,可以通過readlines的方式存進列表用空格分開一下數(shù)據(jù)就可以把urls提取出來了。
處理一下urls文件
urls在文件的中后部烂叔,寫個文件把它單純地提取出來谨胞,方便使用。
我單獨把Miley_Cyrus的部分提取出來放了一個txt文件
pic_url = []
with open('./Miley_Cyrus.txt') as f:
for i in f.readlines():
pic_url.append(i.strip('\r\n'))
urls = []
for s in pic_url:
_, _, _, url, _, _ = s.split()
urls.append(url)
# 寫入到文件里面
with open('url.data', 'w') as f:
for i in urls:
f.write(i)
f.write('\n')
爬取urls圖片
1. Urllibs方法
import urllib.request as request
import socket
import os
# 在同級目錄新建文件夾存圖片
os.mkdir('./img')
# 為請求增加一下頭
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'
headers = ('User-Agent', user_agent)
opener = request.build_opener()
opener.addheaders = [headers]
request.install_opener(opener)
# 設(shè)定一下無響應(yīng)時間蒜鸡,防止有的壞圖片長時間沒辦法下載下來
timeout = 20
socket.setdefaulttimeout(timeout)
# 從文件里面讀urls
urls = []
with open('./url.data') as f:
for i in f.readlines():
if i != '':
urls.append(i)
else:
pass
# 通過urllibs的requests獲取所有的圖片
count = 1
bad_url = []
for url in urls:
url.rstrip('\n')
print(url)
try:
pic = request.urlretrieve(url, './img3/%d.jpg' % count)
print('pic %d' % count)
count += 1
except Exception as e:
print(Exception, ':', e)
bad_url.append(url)
print('\n')
print('got all photos that can be got')
# 把沒有抓取到的urls保存起來
with open('bad_url3.data', 'w') as f:
for i in bad_url:
f.write(i)
f.write('\n')
print('saved bad urls')
2. Requests方法
import requests
import socket
import os
# 在同級目錄新建文件夾存圖片
os.mkdir('./img')
# 設(shè)定一下無響應(yīng)時間胯努,防止有的壞圖片長時間沒辦法下載下來
timeout = 20
socket.setdefaulttimeout(timeout)
# 從文件里面讀urls
urls = []
with open('./url.data') as f:
for i in f.readlines():
if i != '':
urls.append(i)
else:
pass
# 為請求增加一下頭,獲取圖片
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'
headers = {
'User-Agent': user_agent
}
bad_url = []
count = 1
for url in urls:
url.rstrip('\n')
print(url)
try:
pic = requests.get(url, headers=headers)
with open('./img2/%d.jpg' % count, 'wb') as f:
f.write(pic.content)
f.flush()
print('pic %d' % count)
count += 1
except Exception as e:
print(Exception, ':', e)
bad_url.append(url)
print('\n')
print('got all photos that can be got')
# 保存壞鏈接
with open('bad_url.data', 'w') as f:
for i in bad_url:
f.write(i)
f.write('\n')
print('saved bad urls')