目的:獲取京東手機頁面的圖片
1、打開京東首頁(www.jd.com),選擇對應的”手機/運營商/數碼”分類,並進入“手機”子分類
鏈接地址:https://list.jd.com/list.html?cat=9987,653,655&page=1
分析網頁源碼:找到對應的圖片代碼段:
思路:
1、爬取網頁
2、然後根據正則爬取出 關鍵內容
3、根據關鍵內容 再用正則匹配出 圖片地址
4、存到服務器將圖片
源代碼:
import urllib.request
import re
import urllib.error
def craw(url, page):
html1 = urllib.request.urlopen(url).read()
html1 = str(html1) # 如果不轉爲str 則會報TypeError: cannot use a string pattern on a bytes-like object
# 先把所有圖片部分的數據全部取出
pat1 = '<div id="plist".+?<div class="clr"' # 注意單雙引號
result1 = re.compile(pat1).findall(html1)
if result1:
result1 = result1[0]
# 京東圖片加載時首先加載8張,然後的圖片爲懶加載所以要獲取兩次圖片
# 根據源碼寫出對應圖片鏈接地址的正則表達式
pat2 = '<img width="220" height="220" data-img="1" src="//(.+?\.jpg)"'
pat3 = '<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)"' # 懶加載圖片正則
imagelist = re.compile(pat2).findall(result1) # 常加載的圖片
imagelist1 = re.compile(pat3).findall(result1) # 懶加載的圖片
imagelist = imagelist + imagelist1 # 數組合並 將所有圖片合併
x = 1
for imageurl in imagelist:
# 對所存的圖片進行命名
imagename = "/home/zyb/crawler/myweb/part6/img1/"+str(page)+str(x)+".jpg"
# 圖片地址
imageurl = "http://"+imageurl
try:
# 獲取圖片並保存
urllib.request.urlretrieve(imageurl, filename=imagename)
except urllib.error.URLError as e:
if hasattr(e, "code"): # 使用hasattr函數判斷是否有這些屬性
x += 1
if hasattr(e, "reason"):
x += 1
x += 1
print("爬取成功")
else:
print("爬取失敗,未獲取內容")
for i in range(1, 2):
url = "https://list.jd.com/list.html?cat=9987,653,655&page="+str(i)
craw(url, i)
最終結果: