關於爬取京東手機圖片:以前一直使用python2加xpath來完成這個任務。本篇介紹如何使用python3加正則表達式來完成。使用的書籍《精通Python網絡爬蟲》中的案例代碼不太適用了,在這裏稍做改進。html
首先來觀察網站,進入京東首頁,點擊「手機/運營商/數碼」中的手機,再點擊「熱門分類」中的「所有手機」。python
(1)觀察網址:點擊下面的頁數觀察網址變化,能夠獲得有規律的網址「https://list.jd.com/list.html?cat=9987,653,655&page=1」。正則表達式
(2)點擊右鍵選擇檢查(我用的google瀏覽器),觀察手機部分的源代碼,構造第一個正則表達式:part1='<div id="plist".+? <div class="page clearfix">'。(3)根據第一個正則表達式獲得全部手機圖片所在框架的源碼,再構造第二個正則表達式:part2='<img width="220" height="220" data-img="1".+?>'。全部的圖片連接都在獲得的列表裏面。瀏覽器
(4)在獲得的列表裏面進一步抽取圖片的連接,即src中的內容。part3='//.+?\.jpg|//.+?\.png'。網絡
能夠根據page構造一個for循環選擇要爬取的頁面。框架
(5)代碼能夠成功運行,若有疑問請留言網站
import re import urllib.request def craw(url,page): headers={ "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36" } req=urllib.request.Request(url,headers=headers) html1=urllib.request.urlopen(req).read() html1=str(html1) #獲得包含手機圖片的網頁框架源碼 part1='<div id="plist".+? <div class="page clearfix">' #result1=re.search(part1,html1) result1=re.compile(part1).findall(html1) result1=result1[0] print(len(result1)) #先弄出來圖片的位置 part2='<img width="220" height="220" data-img="1".+?>' #part2='//(.+?[\.jpg|\png])' imglist=re.compile(part2).findall(result1) #print(imglist[1]) #print(len(imglist)) #獲得圖片的連接 part3='//.+?\.jpg|//.+?\.png' urllist=re.compile(part3).findall(str(imglist)) print(len(urllist)) x=1 print(urllist[1]) for imageurl in urllist: imagename="E:/爬蟲練習/pj1/文件/"+str(page)+str(x)+".jpg" #在圖片連接前面加上‘https:’ imageurl="https:"+imageurl print(imageurl) try: #urllib.request.urlretrieve(imageurl,filename=imagename) req=urllib.request.Request(imageurl,headers=headers) res=urllib.request.urlopen(req).read() with open(imagename,"wb")as f: f.write(res) 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,2): url="https://list.jd.com/list.html?cat=9987,653,655&page="+str(i) craw(url,i)