python爬取京東手機圖片

關於爬取京東手機圖片:以前一直使用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)
相關文章
相關標籤/搜索