1.目標(biāo)
從簡(jiǎn)書的作者推薦中獲取所有的頭像,保存到本地,名稱為作者的名字,GitHub源碼
2.三方庫(kù)以及工具準(zhǔn)備
2.1~2.4是需要使用的三方庫(kù),使用pip安裝在 虛擬環(huán)境中
2.1 requests
快速入門,請(qǐng)求數(shù)據(jù)
pip install requests
2.2 selenium
快速入門,自動(dòng)化操作
pip install selenium
2.3 lxml
pip install lxml
2.4 beautifulsoup4
快速入門,獲取html,xml的數(shù)據(jù)
pip install beautifulsoup4
2.5 phantomjs
快速入門,無(wú)界面的瀏覽器
brew install phantomjs
3.selenium模擬搜索
在簡(jiǎn)書首頁(yè)搜索“python”,并輸出搜索內(nèi)容
這里使用Mac的Safari,首先需要在Safari的偏好設(shè)置里面選中“在菜單欄中顯示‘開(kāi)發(fā)’菜單”,然后允許遠(yuǎn)程自動(dòng)化,如果運(yùn)行失敗嘗試退出Safari后重試。自己嘗試一下,期間不要點(diǎn)擊Safari,不是Mac的同學(xué)可以使用其他瀏覽器

image

image
import time
from selenium import webdriver
//自動(dòng)用簡(jiǎn)書搜索Python
driver = webdriver.Safari()//實(shí)例化Safari瀏覽器
driver.get("http://www.itdecent.cn")//加載網(wǎng)頁(yè)
print(driver.title)//輸出網(wǎng)頁(yè)title
elem = driver.find_element_by_name("q")//獲取搜索框,搜索框的name為“q”
elem.clear()//清空搜索框
elem.send_keys("python")//輸入搜索關(guān)鍵字
elem.send_keys(Keys.RETURN)//點(diǎn)擊搜索
time.sleep(3)//防止網(wǎng)速不好時(shí)搜索不到內(nèi)容
print(driver.page_source)//輸出搜索內(nèi)容
assert "No results found." not in driver.page_source
driver.close()//一定要關(guān)閉,否則不可進(jìn)行第二次
4.開(kāi)始爬取頭像
4.1、引入頭文件
import requests
from bs4 import BeautifulSoup
import lxml
import os
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
4.2、瀏覽器驅(qū)動(dòng)
def request(self,url):
driver = webdriver.PhantomJS()//使用無(wú)頁(yè)面的PhantomJS
driver.get(url)
self.click_more(driver,5)//模擬點(diǎn)擊5次
return driver.page_source
4.3、點(diǎn)擊“加載更多”按鈕
def click_more(self,driver,times):
for i in range(times):
print("開(kāi)始執(zhí)行第", str(i + 1),"次點(diǎn)擊操作")
#復(fù)合類的名稱不允許,所以使用下面的方式
# elem = driver.find_element_by_class_name("btn btn-danger load-more-btn")
elem = driver.find_element_by_class_name("load-more-btn")
elem.click()
time.sleep(5)//每次點(diǎn)擊后給一定的加載時(shí)間
4.4、創(chuàng)建路徑
如果路徑存在的話下載圖片時(shí)需要去重,如果路徑是新建的則不需要去重,這里使用作者的名字當(dāng)作去重的標(biāo)準(zhǔn)
def mkdir(self, path):
path = path.strip()
isExists = os.path.exists(path)
if not isExists:
print('創(chuàng)建名字叫做', path, '的文件夾')
os.makedirs(path)
print('創(chuàng)建成功!')
return True
else:
print(path, '文件夾已經(jīng)存在了,不再創(chuàng)建')
return False
4.5、處理爬取的數(shù)據(jù),獲取圖片url和名稱
每一個(gè)推薦作者的數(shù)據(jù)是一個(gè)div
<div class="col-xs-8">
<div class="wrap">
<a target="_blank" href="/users/5SqsuF">
<img class="avatar" src="http://upload.jianshu.io/users/upload_avatars/6287/06c537002583.png?imageMogr2/auto-orient/strip|imageView2/1/w/180/h/180" alt="180">
<h4 class="name">
劉淼
</h4>
<p class="description">來(lái),走一圈關(guān)注:
http://www.j...</p>
</a>
<a class="btn btn-success follow"><i class="iconfont ic-follow"></i><span>關(guān)注</span></a>
<hr>
<div class="meta">最近更新</div>
<div class="recent-update">
<a class="new" target="_blank" href="/p/5cc6e5ebb742">開(kāi)車記</a>
<a class="new" target="_blank" href="/p/828f8c5f82ea">關(guān)于時(shí)間與金錢的十條感悟</a>
<a class="new" target="_blank" href="/p/615e75439598">干一票更大的</a>
</div>
</div>
</div>
def getImgUrlAndName(self, item):
img = BeautifulSoup(str(item), 'lxml').find('img',class_='avatar',alt='180')
sufPos = img['src'].rstrip().index('imageMogr2') - 1
img_url = 'http:' + img['src'][:sufPos]
suffixPos = img_url.rindex('.')
suffix = img_url[suffixPos:]
if suffix.__len__() > 5:
suffix = '.png'//針對(duì)個(gè)別不是以圖片格式后綴結(jié)尾的
nameStr = BeautifulSoup(str(item), 'lxml').find('h4',class_='name')
name = nameStr.text.strip() + suffix
return img_url,name
4.6、處理沒(méi)一個(gè)url和名稱
def get_pic(self):
print('開(kāi)始網(wǎng)頁(yè)get請(qǐng)求')
r = self.request(self.web_url)
print('開(kāi)始獲取所有item')
all_item = BeautifulSoup(r, 'lxml').find_all('div',class_='col-xs-8')
print('開(kāi)始創(chuàng)建文件夾')
is_new_folder = self.mkdir(self.folder_path)//是否存在路徑
print('開(kāi)始切換文件夾')
os.chdir(self.folder_path)
for item in all_item:
img_url, name = self.getImgUrlAndName(item)
if is_new_folder:
self.save_img(img_url, name)
else:
all_files = os.listdir(self.folder_path)//獲取路徑下所有文件,不包含子文件
if name not in all_files:
self.save_img(img_url, name)
4.7、保存圖片
def save_img(self, url, name):
print('開(kāi)始保存圖片...%s'%name)
img = requests.get(url)//獲取圖片
time.sleep(5)
print('開(kāi)始保存文件')
f = open(name, 'ab')
f.write(img.content)
print(name, '文件保存成功!')
f.close()
4.8、使用
將以上方法寫在BeautifulPicture類中,執(zhí)行下面代碼就可以獲取到144個(gè)用戶的頭像和名稱,有幾個(gè)美女作者用的自己的頭像哦
beauty = BeautifulPicture()
beauty.get_pic()
20180116更新
用 Python 寫一個(gè)爬圖片的程序,爬 這個(gè)鏈接里的日本妹子圖片 :-)
import requests
from bs4 import BeautifulSoup
import os
import time
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = 'http://tieba.baidu.com/p/2166231880'
file = '/Users/ly/Desktop/Python'
#獲取html文件
def get_html(url):
driver = webdriver.PhantomJS()
driver.get(url)
return driver.page_source
#新建一個(gè)路徑
def make_dir():
global file
pre_f = '/Users/ly/Desktop/Python/py-test'
t = datetime.now()
file = os.path.join(pre_f, t.strftime('%Y%m%d'))
if os.path.exists(file):
for f in os.listdir(file):
os.remove(os.path.join(file,f))
os.rmdir(file)
os.mkdir(file)
#開(kāi)始下載圖片
def get_picture():
make_dir()
source = get_html(url)
imgs = BeautifulSoup(source,'lxml').find_all('img', class_='BDE_Image')
index = 0
for img in imgs:
img_url = img['src'].strip()
print(img_url)
im = requests.get(img_url)
name = os.path.join(file, str(index) + '.jpg')
with open(name,'ab') as f:
f.write(im.content)
f.close()
print('success')
index += 1
get_picture()