python爬蟲工程師 成長之路五(一) 爬取京東商城圖片

爬取京東筆記本圖片


  1. 選取爬取目標

    選取我們的爬取目標,電腦中的筆記本,我們發現url如下

    https://list.jd.com/list.html?cat=670,671,672
    

    在這裏插入圖片描述


  2. 構建url,爬取多頁圖片

    對每頁url進行觀察

    第一頁url

    https://list.jd.com/list.html?cat=670,671,672
    

    第二頁url

    	https://list.jd.com/list.html?cat=670,671,672&page=2&sort=sort_totalsales15_desc&trans=1&JL=6_0_0#J_main
    

    第三頁url

    	https://list.jd.com/list.html?cat=670,671,672&page=3&sort=sort_totalsales15_desc&trans=1&JL=6_0_0#J_main
    

    我們嘗試直接使用如下url,發現出現的頁面就是第二頁,所以jd上顯示的url後面爲多餘的

    https://list.jd.com/list.html?cat=670,671,672&page=2
    

    每頁的url爲:

    https://list.jd.com/list.html?cat=670,671,672&page=i
    

  3. 構建正則表達式

    右鍵點擊筆記本圖片→檢查
    在這裏插入圖片描述
    通過瀏覽器的檢查功能,發現圖片所在位置爲"img width=“220” height=“220” data-img=“1” src="",所以,構造正則表達式

    pattern1='<img width="220" height="220" data-img="1" src=".+?">'
    

    這裏,我們先觀察下效果

    In:

    import urllib.request
    import re
    
    def reptile(url,page):
    	req=urllib.request.Request(url) #創建Request對象
     	#模擬瀏覽器
    	req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")# 添加報頭信息格式:對象名.add_header()
    	data=urllib.request.urlopen(req).read()#打開網址
    	data=str(data)
    	#獲取標籤數據
    	pattern1='<img width="220" height="220" data-img="1" src=".+?">'
    	result=re.compile(pattern1).findall(data)
    	result=str(result)
    
    	print(result)
    
    url="https://list.jd.com/list.html?cat=670,671,672&page="+str(i)
    reptile(url,1)
    

    Out:在這裏插入圖片描述
    發現匹配到的正是我們需要的src


  4. 提取數據

    上面我們得到了圖片位置,但還不能直接獲取,還需要一定的處理

    '<img width="220" height="220" data-img="1" src="//img12.360buyimg.com/n7/jfs/t1/90347/19/13459/85049/5e5a6779E5ab27072/757c0ae9a50c18ce.jpg">'
    

    觀察上述標籤,發現只有src中才是我們需要的內容,所以構建正則在匹配一次

    pattern2='<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">'
    result1=re.compile(pattern2).findall(result)
    

    查看效果

    In:

    import urllib.request
    import re
    
    def reptile(url,page):
    	req=urllib.request.Request(url) #創建Request對象
    	#模擬瀏覽器
    	req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")# 添加報頭信息格式:對象名.add_header()
    	data=urllib.request.urlopen(req).read()#打開網址
    	data=str(data)
    	#獲取標籤數據
    	pattern1='<img width="220" height="220" data-img="1" src=".+?">'
    	result=re.compile(pattern1).findall(data)
    	result=str(result)
    	#提取src
    	pattern2='<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">'
    	result1=re.compile(pattern2).findall(result)
    	print(result1)
    
    url="https://list.jd.com/list.html?cat=670,671,672&page="+str(i)
    reptile(url,1)
    

    Out:
    在這裏插入圖片描述

    顯而易見,這正是我們需要的只有src中的內容


  5. 構建真正的url鏈接

    將之前獲得的scr直接在瀏覽器中打開就是我們所需的圖片了,所以這裏就不要構建了,直接加上http://即可,不加瀏覽器也會自動加

    在這裏插入圖片描述


  6. 檢查

    檢查構建之後的url鏈接有沒有錯誤的

    In:

    import urllib.request
    import re
    
    def reptile(url,page):
    	req=urllib.request.Request(url) #創建Request對象
    	#模擬瀏覽器
    	req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")# 添加報頭信息格式:對象名.add_header()
    	data=urllib.request.urlopen(req).read()#打開網址
    	data=str(data)
    	#獲取標籤數據
    	pattern1='<img width="220" height="220" data-img="1" src=".+?">'
    	result=re.compile(pattern1).findall(data)
    	result=str(result)
    	#提取src
    	pattern2='<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">'
    	result1=re.compile(pattern2).findall(result)
    
    	for imageurl in result1:
        imageurl="http://"+imageurl
        print(imageurl)
        
    for i in range(1,8):
    url="https://list.jd.com/list.html?cat=670,671,672&page="+str(i)
    reptile(url,i)
    

    Out:
    在這裏插入圖片描述
    一定要仔細檢查

    檢查後無誤

    最終代碼:

    import urllib.request
    import re
    import http.client
    def reptile(url,page):
    	req=urllib.request.Request(url) #創建Request對象
    	#模擬瀏覽器,最好用自己的
    	req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")# 添加報頭信息格式:對象名.add_header()
    	data=urllib.request.urlopen(req).read()#打開網址
    	data=str(data)
    	#獲取標籤數據
    	pattern1='<img width="220" height="220" data-img="1" src=".+?">'
    	result=re.compile(pattern1).findall(data)
    	result=str(result)
    	#提取src
    	pattern2='<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">'
    	result1=re.compile(pattern2).findall(result)
     	x=1 #用於文件命名
    	#訪問每頁中的所有圖片
    	for imageurl in result1:
        imagename="D:/picture/"+str(page)+str(x)+".jpg" 
        imageurl="http://"+imageurl
        print(imageurl)
        x=x+1
        #異常處理,否則一出問題程序就會終止
        try:
            urllib.request.urlretrieve(imageurl,filename=imagename)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                x+=1
            if hasattr(e,"reason"):
                x+=1
        except http.client.InvalidURL as f: #url異常
            x+=1
    for i in range(1,8):
    	url="https://list.jd.com/list.html?cat=670,671,672&page="+str(i)
    	reptile(url,i)
    

    成果:
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章