文章目錄
爬取京東筆記本圖片
-
選取爬取目標
選取我們的爬取目標,電腦中的筆記本,我們發現url如下
https://list.jd.com/list.html?cat=670,671,672
-
構建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
-
構建正則表達式
右鍵點擊筆記本圖片→檢查
通過瀏覽器的檢查功能,發現圖片所在位置爲"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
-
提取數據
上面我們得到了圖片位置,但還不能直接獲取,還需要一定的處理
'<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中的內容
-
構建真正的url鏈接
將之前獲得的scr直接在瀏覽器中打開就是我們所需的圖片了,所以這裏就不要構建了,直接加上http://即可,不加瀏覽器也會自動加
-
檢查
檢查構建之後的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)
成果: