韋老師的課程練習,寫一個小爬蟲,爬取京東上的手機圖片
1.正則表達式:
通過查看京東手機頁面的源代碼確定了兩個過濾的正則表達式:
a.是確定手機展示部分的起始標志位和結束標志位,正則表達式為:
<div id="plist".+?<div class="page clearfix">
b.是圖片的正則表達式,也是從網頁的源代碼可以發現其正則表達式為:
pat = '<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)">' # 括號表示分組,將括號的內容捕獲到分組當中 # .+表示匹配至少一個任意字符,問號?表示懶惰匹配,也就是匹配盡可能少的字符串。 # .+?\.jpg合起來表示盡可能少匹配字符的匹配到.jpg,避免匹配范圍超出src的范圍 # 這個括號也就可以匹配網頁中圖片的url了
接下來寫代碼:
思路主要是:
1.建立一個爬取圖片的自定義函數,該函數負責爬取一個頁面下我們想爬取的圖片
a.通過urllib.request.urlopen(url).read()讀取對應網頁全部源代碼
b.通過兩個正則表達式進行信息過濾,提取圖片目標鏈接,將地址存儲在列表中,隨后遍歷該列表
2.分別將對應鏈接通過urllib.request.urlretrieve(imageurl,filename = imagename) 存儲到本地,建立異常處理,通過x+1自動跳到下一個圖片
3.通過for循環,調用函數,開始爬取
# -*- coding:utf-8 -*- # Author : 何子辰 # 爬取京東手機圖片 ——批量爬取 import re import urllib.request def craw(url,page): html1 = urllib.request.urlopen(url).read() html1 = str(html1) pat1 = '<div id="plist".+?<div class="page clearfix">' #第一次過濾,網頁源代碼中標志位 result1 = re.compile(pat1).findall(html1) result1 = result1[0] pat2 = '<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)">' imagelist = re.compile(pat2).findall(result1) x = 1 for imageurl in imagelist: imagename = "F:/爬蟲/2018.1.24/jdpics/"+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"): x+=1 if hasattr(e,"reason"): x+=1 x+=1 for i in range(1,20): url = "https://list.jd.com/list.html?cat=9987,653,655&page="+str(i) craw(url,i)
最后在文件夾里就可以收圖片了