通過3天的學習,如今對簡單的網頁基本能夠爬取想爬取的信息了,但還沒法應對網站一些複雜的反爬蟲措施。python
今天利用目前爲止所學的知識,試着爬取了煎蛋網幾頁圖片並下載到本地。服務器
#首先仍是先導入所需的庫 import requests import base64 #這個庫我也是第一用,它的功能貌似是用於加密解密的,具體怎麼用,後面再研究 import urllib.request import time from bs4 import BeautifulSoup urls=['http://jandan.net/pic/page-{}'.format(i) for i in range(226,228)]#一個列表儲存全部的網頁地址 headers={'User-Agent':'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'} cnt=0 #用於記錄下載的圖片數目,也方便命名 folder_path='D://pictures/' #個人路徑 def get_images(url): #自定義的函數,參數是要爬取的網頁的地址 data=requests.get(url,headers=headers) #請求 soup=BeautifulSoup(data.text,'lxml') #解析,這兩步不用多講了 imgurl=soup.find_all(class_='img-hash') #find_all函數在以前也講過了,功能就是字面意思,找到全部的符合條件的元素 time.sleep(2) #延遲2秒,一些網站若是過於頻繁的訪問,可能會觸發反爬蟲機制,這裏延遲2秒,確保爬取過程順利進行 real_urls=[] #由於網站的反爬取措施,全部的圖片的真實地址都被加了密,因此不能用普通方法爬取,要先解密 for j in imgurl: real_urls.append(base64.b64decode(j.text).decode('utf-8')) #base64.b64decode(j.text).decode('utf-8')這個函數的返回值就是真實網頁的地址,不過這個方法不確保適用其餘加密方法 for i in real_urls: _url='http:'+i #構造地址 global cnt cnt=cnt+1 #每一個圖片的序號做爲文件名 if 'jpg' in i: #有的文件的圖片,有的是動態圖 address=folder_path+str(cnt)+'.jpg' elif 'gif' in i: address = folder_path + str(cnt) + '.gif' urllib.request.urlretrieve(_url,address) print("done") #最後調用函數 for url in urls: get_images(url)
最後成果。由於是隻是練習,因此並無爬取不少圖片,只爬了兩頁。學習爬蟲的朋友在練習時也適當爬取就好,否則頻繁訪問,會給服務器形成很大壓力。本身學習的同時也不要對他人形成困擾。app