最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 3實(shí)戰(zhàn)爬蟲(chóng)之爬取京東圖書(shū)的圖片詳解

 更新時(shí)間:2017年10月09日 09:30:28   作者:阿阿阿阿阿阿鑫  
最近在學(xué)習(xí)python3,下面這篇文章主要給大家介紹了關(guān)于Python3實(shí)戰(zhàn)爬蟲(chóng)之爬取京東圖書(shū)圖片的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。

前言

最近工作中遇到一個(gè)需求,需要將京東上圖書(shū)的圖片下載下來(lái),假如我們想把京東商城圖書(shū)類的圖片類商品圖片全部下載到本地,通過(guò)手工復(fù)制粘貼將是一項(xiàng)非常龐大的工程,此時(shí),可以用Python網(wǎng)絡(luò)爬蟲(chóng)實(shí)現(xiàn),這類爬蟲(chóng)稱為圖片爬蟲(chóng),接下來(lái),我們將實(shí)現(xiàn)該爬蟲(chóng)。

實(shí)現(xiàn)分析

首先,打開(kāi)要爬取的第一個(gè)網(wǎng)頁(yè),這個(gè)網(wǎng)頁(yè)將作為要爬取的起始頁(yè)面。我們打開(kāi)京東,選擇圖書(shū)分類,由于圖書(shū)所有種類的圖書(shū)有很多,我們選擇爬取所有編程語(yǔ)言的圖書(shū)圖片吧,網(wǎng)址為:https://list.jd.com/list.html?cat=1713,3287,3797&page=1&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main

如圖:

進(jìn)去后,我們會(huì)發(fā)現(xiàn)總共有251頁(yè)。

那么我們?cè)趺床拍茏詣?dòng)爬取第一頁(yè)以外的其他頁(yè)面呢?

可以單擊“下一頁(yè)”,觀察網(wǎng)址的變化。在單擊了下一頁(yè)之后,發(fā)現(xiàn)網(wǎng)址變成了https://list.jd.com/list.html?cat=1713,3287,3797&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main。

我們可以發(fā)現(xiàn),在這里要獲取第幾頁(yè)是通過(guò)URL網(wǎng)址識(shí)別的,即通過(guò)GET方式請(qǐng)求的。在這個(gè)GET請(qǐng)求中,有多個(gè)字段,其中有一個(gè)字段為page,對(duì)應(yīng)值為2,由此,我們可以得到該網(wǎng)址中的關(guān)鍵信息為:https://list.jd.com/list.html?cat=1713,3287,3797&page=2。接下來(lái),我們根據(jù)推測(cè),將page=2改成page=6,發(fā)現(xiàn)我們能夠成功進(jìn)入第6頁(yè)。

由此,我們可以想到自動(dòng)獲取多個(gè)頁(yè)面的方法:可以使用for循環(huán)實(shí)現(xiàn),每次循環(huán)后,對(duì)應(yīng)的網(wǎng)址中page字段加1,即自動(dòng)切換到下一頁(yè)。

在每頁(yè)中,我們都要提取對(duì)應(yīng)的圖片,可以使用正則表達(dá)式匹配源碼中圖片的鏈接部分,然后通過(guò)urllib.request.urlretrieve()將對(duì)應(yīng)鏈接的圖片保存到本地。

但是這里有一個(gè)問(wèn)題,該網(wǎng)頁(yè)中的圖片不僅包括列表中的商品圖片,還包括旁邊的一些無(wú)關(guān)圖片,所以我們可以先進(jìn)行一次信息過(guò)濾,第一次信息過(guò)濾將中間的商品列表部分?jǐn)?shù)據(jù)留下,將其他部分的數(shù)據(jù)過(guò)濾掉。可以單擊右鍵,然后查看網(wǎng)頁(yè)的源代碼,如圖:

可以通過(guò)商品列表中的第一個(gè)商品名為“JAVA從入門(mén)到精通”快速定位到源碼中的對(duì)應(yīng)位置,然后觀察其商品列表部分的特殊標(biāo)識(shí),可以看到,其上方有處“<div id="plist”代碼,然后我們?cè)谠创a中搜索該代碼,發(fā)現(xiàn)只有一個(gè)地方有,隨后打開(kāi)其他頁(yè)的對(duì)應(yīng)頁(yè)面,發(fā)現(xiàn)仍然具有這個(gè)規(guī)律,說(shuō)明該特殊標(biāo)識(shí)可以作為有效信息的起始過(guò)濾位置。當(dāng)然,你可以使用其他的代碼作為特殊標(biāo)識(shí),但是該特殊標(biāo)識(shí)要滿足唯一性,并且要包含要爬取的信息。

那么,有效信息到什么代碼位置結(jié)束呢?

同樣,我們通過(guò)在源碼中查找該頁(yè)商品列表中最后一個(gè)圖書(shū),快速定位到源碼位置,進(jìn)行分析,我們可以找到一個(gè)這樣的代碼作為標(biāo)識(shí),如圖:

所以,如果要進(jìn)行第一次過(guò)濾,我們的正則表達(dá)式可以構(gòu)造為:

<div id="plist".+? <div class="page clearfix">

進(jìn)行了第一次信息過(guò)濾后,留下來(lái)的圖片鏈接就是我們想爬取的圖片了,下一步需要在第一次過(guò)濾的基礎(chǔ)上,再將圖片鏈接信息過(guò)濾出來(lái)。

此時(shí),需要觀察網(wǎng)頁(yè)中對(duì)應(yīng)圖片的源代碼,我們觀察到其中兩張圖片的對(duì)應(yīng)源碼:

圖片1:

 <img width="200" height="200" data-img="1" src="http://img13.360buyimg.com/n7/jfs/t6130/167/771989293/235186/608d0264/592bf167Naf49f7f6.jpg">

圖片2:

<img width="200" height="200" data-img="1" src="http://img10.360buyimg.com/n7/g14/M03/0E/0D/rBEhV1Im1n8IAAAAAAcHltD_3_8AAC0FgC-1WoABweu831.jpg">

對(duì)比兩張圖片代碼,發(fā)現(xiàn)其基本格式是一樣的,只是圖片的鏈接網(wǎng)址不一樣,所以此時(shí),我們根據(jù)該規(guī)律構(gòu)造出提取圖片鏈接的正則表達(dá)式:

<img width="200" height="200" data-img="1" src="http://(.+?\.jpg)">

剛開(kāi)始到這里,我以為就結(jié)束了,后來(lái)在爬取的過(guò)程中我發(fā)現(xiàn)每一頁(yè)都少爬取了很多圖片,再次查看源碼發(fā)現(xiàn),每頁(yè)后面的幾十張圖片又是另一種格式:

<img width="200" height="200" data-img="1" data-lazy-img="http://img10.360buyimg.com/n7/jfs/t3226/230/618950227/110172/7749a8bc/57bb23ebNfe011bfe.jpg">

所以,完整的正則表達(dá)式應(yīng)該是這兩種格式的或:

<img width="200" height="200" data-img="1" src="http://(.+?\.jpg)">|<img width="200" height="200" data-img="1" data-lazy-img="http://(.+?\.jpg)">

到這里,我們根據(jù)該正則表達(dá)式,就可以提取出一個(gè)頁(yè)面中所有想要爬取的圖片鏈接。

所以,根據(jù)上面的分析,我們可以得到該爬蟲(chóng)的編寫(xiě)思路與過(guò)程,具體如下:

  • 建立一個(gè)爬取圖片的自定義函數(shù),該函數(shù)負(fù)責(zé)爬取一個(gè)頁(yè)面下的我們想爬取的圖片,爬取過(guò)程為:首先通過(guò)urllib.request.utlopen(url).read()讀取對(duì)應(yīng)網(wǎng)頁(yè)的全部源代碼,然后根據(jù)上面的第一個(gè)正則表達(dá)式進(jìn)行第一次信息過(guò)濾,過(guò)濾完成之后,在第一次過(guò)濾結(jié)果的基礎(chǔ)上,根據(jù)上面的第二個(gè)正則表達(dá)式進(jìn)行第二次信息過(guò)濾,提取出該網(wǎng)頁(yè)上所有的目標(biāo)圖片的鏈接,并將這些鏈接地址存儲(chǔ)的一個(gè)列表中,隨后遍歷該列表,分別將對(duì)應(yīng)鏈接通過(guò)urllib.request.urlretrieve(imageurl,filename=imagename)存儲(chǔ)到本地,為了避免程序中途異常崩潰,我們可以建立異常處理。
  • 通過(guò)for循環(huán)將該分類下的所有網(wǎng)頁(yè)都爬取一遍,鏈接可以構(gòu)造為url='https://list.jd.com/list.html?cat=1713,3287,3797&page=' + str(i)

完整的代碼如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re
import urllib.request
import urllib.error
import urllib.parse


sum = 0
def craw(url,page):
 html1=urllib.request.urlopen(url).read()
 html1=str(html1)
 pat1=r'<div id="plist".+? <div class="page clearfix">'
 result1=re.compile(pat1).findall(html1)
 result1=result1[0]
 pat2=r'<img width="200" height="200" data-img="1" src="http://(.+?\.jpg)">|<img width="200" height="200" data-img="1" data-lazy-img="http://(.+?\.jpg)">'
 imagelist=re.compile(pat2).findall(result1)
 x=1
 global sum
 for imageurl in imagelist:
  imagename='./books/'+str(page)+':'+str(x)+'.jpg'
  if imageurl[0]!='':
   imageurl='http://'+imageurl[0]
  else:
   imageurl='http://'+imageurl[1]
  print('開(kāi)始爬取第%d頁(yè)第%d張圖片'%(page,x))

  try:
   urllib.request.urlretrieve(imageurl,filename=imagename)
  except urllib.error.URLError as e:
   if hasattr(e,'code') or hasattr(e,'reason'):
    x+=1

  print('成功保存第%d頁(yè)第%d張圖片'%(page,x))
  x+=1
  sum+=1

for i in range(1,251):
 url='https://list.jd.com/list.html?cat=1713,3287,3797&page='+str(i)
 craw(url,i)
print('爬取圖片結(jié)束,成功保存%d張圖'%sum)

運(yùn)行結(jié)果如下:

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論

牡丹江市| 江达县| 临高县| 峨山| 彭阳县| 准格尔旗| 河间市| 彩票| 大埔县| 珠海市| 定南县| 西城区| 伊通| 太和县| 石屏县| 阳东县| 渑池县| 蛟河市| 松江区| 新昌县| 甘泉县| 松阳县| 沅江市| 馆陶县| 乌海市| 阿拉善右旗| 涞水县| 彰化市| 武强县| 华蓥市| 得荣县| 慈利县| 鄂尔多斯市| 哈密市| 会同县| 衡南县| 鄂托克旗| 东乡族自治县| 永丰县| 榆中县| 徐汇区|