python爬蟲日誌(6)小小實踐

通過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

相關文章
相關標籤/搜索