"""
今天我們開始嘗試,第一次學習爬蟲的第一個案例,去校花網上爬取一些校花的照片
"""
from requests_html import HTMLSession
##首先導入這個包
# 然后定義一個類,將這個功能封裝起來,將我們所要實現的功能,都封裝到這個類中
# 在以后的編程中,盡量將實現同一功能的函數,都封裝到一個類中,這樣比較方便
class Spider(object):
def __init__(self):
self.session = HTMLSession() ##先 生成一個這樣的對象
def get_index_url(self):
##獲取需要爬取的url路由
for i in range(1, 4):
##分頁處理,由於第一個路由沒有規律,所以第一個需要特殊處理.
##這里我們的校花網圖片只有三頁,以后爬取其他網站,我們也要找到
# 分頁的url的規律,然后生成這樣一個生成器,然后逐個返回
if i == 1:
yield 'http://www.xiaohuar.com/meinv/'
#這是一個生成器對象 ,每次返回一個元素 下次繼續從這里執行
else:
yield 'http://www.xiaohuar.com/meinv/index_%s' % i
#當我們得到了要爬取圖片的url之后,就要去找圖片的具體的位置路徑了.
def get_img_url(self, index_url):###將頁面的url傳進來
r = self.session.get(url=index_url)
###這個就是通過那個路由,模擬路由器向這個URL發送請求,得到那個返回的html
for element in r.html.find('.items'): ##現在就是利用那個css選擇器從那個返回的結果中篩選
##這里使用的是類選擇器,凡是有 class = 'items'的都會被篩選出來
img_element = element.find('img', first=True)##first=True 表示獲取列表中的第一個元素
##然后繼續在這個剛才篩選出來的結果中繼續篩選,就標簽選擇器
title_element = element.find('.p_title a', first=True)
##這個是獲取圖片的名稱的那個a標簽
yield "http://www.xiaohuar.com" + img_element.attrs.get('src'), title_element.text
###將這兩個標簽對象返回出去,由於第一個路徑不是絕對路徑是一個相對路徑,所以這里需要做一個拼接
def save_img(self, img_url, img_name): ###保存圖片到本地,並且命名
img_name = img_name.replace('/', '').replace("\\", "") + ".jpg"
###因為我們之前獲取的文件名中 可能會有 \ 或者 / 這種特殊符號,存成文件名會被識別成文件夾名稱
##所以這里我們需要替換一下 雙\\ 表示轉義之后的 \
r = self.session.get(url=img_url) ##根據圖片的資源地址 獲取資源
with open(img_name, 'wb') as f:
f.write(r.content)
# r.content 就是那個圖片的二進制數據流
print("%s下載完成" % img_name)
def run(self): ##執行函數
for index_url in self.get_index_url():
for img_url, img_name in self.get_img_url(index_url):
self.save_img(img_url, img_name)
if __name__ == '__main__':
xiaohua = Spider()
xiaohua.run()