[python學習] 簡單爬取圖片站點圖庫中圖片

        近期老師讓學習Python與維基百科相關的知識,無聊之中用Python簡單作了個爬取「遊訊網圖庫」中的圖片,因爲每次點擊下一張感受很浪費時間又繁瑣。主要分享的是怎樣爬取HTML的知識和Python怎樣下載圖片。但願對你們有所幫助,同一時候發現該站點的圖片都挺精美的,建議閱讀原網下載圖片,支持遊訊網不要去破壞它。
        經過瀏覽遊訊網發現它的圖庫URL爲。當中全部圖片爲0_0_1到0_0_75:
        http://pic.yxdown.com/list/0_0_1.html
        http://pic.yxdown.com/list/0_0_75.html
        同一時候經過下圖可以發現遊訊網的1-75頁個列表,每頁中有很是多個主題。每個主題都有對應的多張圖片。


        源碼例如如下:
        (需在本地建立E:\\Picture3目錄和Python執行目錄建立yxdown目錄)
# coding=utf-8
# 聲明編碼方式 默認編碼方式ASCII 參考https://www.python.org/dev/peps/pep-0263/
import urllib
import time
import re
import os

'''
Python下載遊迅網圖片 BY:Eastmount
'''

'''
**************************************************
#第一步 遍歷獲取每頁相應主題的URL
#http://pic.yxdown.com/list/0_0_1.html
#http://pic.yxdown.com/list/0_0_75.html
**************************************************
'''
fileurl=open('yxdown_url.txt','w')
fileurl.write('****************獲取遊訊網圖片URL*************\n\n') 
#建議num=3 while num<=3一次遍歷一個頁面所有主題,下次換成num=4 while num<=4而不是1-75 
num=3
while num<=3:
    temp = 'http://pic.yxdown.com/list/0_0_'+str(num)+'.html'
    content = urllib.urlopen(temp).read()
    open('yxdown_'+str(num)+'.html','w+').write(content)
    print temp
    fileurl.write('****************第'+str(num)+'頁*************\n\n')

    #爬取相應主題的URL
    #<div class="cbmiddle"></div>中<a target="_blank" href="/html/5533.html" >
    count=1 #計算每頁1-75中詳細網頁個數
    res_div = r'<div class="cbmiddle">(.*?

)</div>' m_div = re.findall(res_div,content,re.S|re.M) for line in m_div: #fileurl.write(line+'\n') #獲取每頁所有主題相應的URL並輸出 if "_blank" in line: #防止獲取列表list/1_0_1.html list/2_0_1.html #獲取主題 fileurl.write('\n\n********************************************\n') title_pat = r'<b class="imgname">(.*?javascript

)</b>' title_ex = re.compile(title_pat,re.M|re.S) title_obj = re.search(title_ex, line) title = title_obj.group() print unicode(title,'utf-8') fileurl.write(title+'\n') #獲取URL res_href = r'<a target="_blank" href="(.*?html

)"' m_linklist = re.findall(res_href,line) #print unicode(str(m_linklist),'utf-8') for link in m_linklist: fileurl.write(str(link)+'\n') #形如"/html/5533.html" ''' ************************************************** #第二步 去到詳細圖像頁面 下載HTML頁面 #http://pic.yxdown.com/html/5533.html#p=1 #注意先本地建立yxdown 不然報錯No such file or directory ************************************************** ''' #下載HTML網頁無原圖 故加'#p=1'錯誤 #HTTP Error 400. The request URL is invalid. html_url = 'http://pic.yxdown.com'+str(link) print html_url html_content = urllib.urlopen(html_url).read() #詳細站點內容 #可凝視它 暫不下載靜態HTML open('yxdown/yxdown_html'+str(count)+'.html','w+').write(html_content) ''' #第三步 去到圖片界面下載圖片 #圖片的連接地址爲http://pic.yxdown.com/html/5530.html#p=1 #p=2 #點擊"查看原圖"HTML代碼例如如下 #<a href="javascript:;" style=""onclick="return false;">查看原圖</a> #經過JavaScript實現 而且該界面存儲所有圖片連接<script></script>之間 #獲取"original":"http://i-2.yxdown.com/2015/3/18/6381ccc..3158d6ad23e.jpg" ''' html_script = r'<script>(.*?java

)</script>' m_script = re.findall(html_script,html_content,re.S|re.M) for script in m_script: res_original = r'"original":"(.*?python

)"' #原圖 m_original = re.findall(res_original,script) for pic_url in m_original: print pic_url fileurl.write(str(pic_url)+'\n') ''' #第四步 下載圖片 #假設瀏覽器存在驗證信息如維基百科 需加入例如如下代碼 class AppURLopener(urllib.FancyURLopener): version = "Mozilla/5.0" urllib._urlopener = AppURLopener() #參考 http://bbs.csdn.net/topics/380203601 #http://www.lylinux.org/python使用多線程下載圖片.html ''' filename = os.path.basename(pic_url) #去掉文件夾路徑,返回文件名稱 #No such file or directory 需要先建立文件Picture3 urllib.urlretrieve(pic_url, 'E:\\Picture3\\'+filename) #http://pic.yxdown.com/html/5519.html #IOError: [Errno socket error] [Errno 10060] #僅僅輸出一個URL 不然輸出兩個一樣的URL break #當前頁詳細內容個數加1 count=count+1 time.sleep(0.1) else: print 'no url about content' time.sleep(1) num=num+1 else: print 'Download Over!!!' linux

        當中下載http://pic.yxdown.com/list/0_0_1.html的圖片E:\\Picture目錄例如如下:


        下載http://pic.yxdown.com/list/0_0_3.html的圖片E:\\Picture3目錄例如如下:


       由於代碼凝視中有具體的步驟。如下僅僅是簡介過程。


       1.簡單遍歷站點。獲取每頁相應主題的URL。當中每頁都有無數個主題。當中主題的格式例如如下:
瀏覽器

<!-- 第一步 爬取的HTML代碼例如如下 -->
<div class="conbox">
  <div class="cbtop">
  </div>
  <div class="cbmiddle">
  <a target="_blank" href="/html/5533.html" class="proimg">
    <img src="http://i-2.yxdown.com/2015/3/19/KDE5Mngp/a78649d0-9902-4086-a274-49f9f3015d96.jpg" alt="Miss大小姐駕到!

細數《英雄聯盟》圈的電競女神" /> <strong></strong> <p> <span>b></b>1836人看過</span> <em><b></b>10張</em> </p> <b class="imgname">Miss大小姐駕到!多線程

細數《英雄聯盟》圈的電競女神</b> </a> <a target="_blank" href="/html/5533.html" class="plLink"><em>1</em>人評論</a> </div> <div class="cbbottom"> </div> <a target="_blank" class="plBtn" href="/html/5533.html"></a> </div> socket

        它是由無數個<div class="conbox"></div>組成,當中咱們僅僅需要提取<a target="_blank" href="/html/5533.html" class="proimg">中的href就能夠,而後經過URL拼接實現到詳細的主題頁面。當中相應上面的佈局例如如下圖所看到的:
  
        2.去到詳細圖像頁面 下載HTML頁面。如:
        http://pic.yxdown.com/html/5533.html#p=1
        同一時候下載本地HTML頁面可以凝視該句代碼。此時需要點擊「查看圖片」才幹下載原圖。點擊右鍵僅僅能另存爲站點html。
        3.我最初打算是是分析「查看原圖」的URL來實現下載,其它站點同理是分析「下一頁」來實現的。

但我發現它是經過JavaScript實現的瀏覽,即:
        <a href="javascript:;" onclick="return false;" id="photoOriginal">查看原圖</a>
        同一時候它把所有圖片都寫在如下代碼<script></script>中:
函數

<script>var images = [
{ "big":"http://i-2.yxdown.com/2015/3/18/KDkwMHgp/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg",
  "thumb":"http://i-2.yxdown.com/2015/3/18/KHgxMjAp/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg",
  "original":"http://i-2.yxdown.com/2015/3/18/6381ccc0-ed65-4422-8671-b3158d6ad23e.jpg",
  "title":"","descript":"","id":75109},
{ "big":"http://i-2.yxdown.com/2015/3/18/KDkwMHgp/fec26de9-8727-424a-b272-f2827669a320.jpg",
  "thumb":"http://i-2.yxdown.com/2015/3/18/KHgxMjAp/fec26de9-8727-424a-b272-f2827669a320.jpg",
  "original":"http://i-2.yxdown.com/2015/3/18/fec26de9-8727-424a-b272-f2827669a320.jpg",
  "title":"","descript":"","id":75110},
...
</script>
        當中獲取原圖-original就能夠,縮略圖-thumb,大圖-big,經過正則表達式下載URL:
        res_original = r'"original":"(.*?)"' #原圖
        m_original = re.findall(res_original,script)
        4.最後一步就是下載圖片。當中我不太會使用線程,僅僅是簡單加入了time.sleep(0.1) 函數。下載圖片可能會遇到維基百科那種訪問受限。需要對應設置。核心代碼例如如下:
import os
import urllib
class AppURLopener(urllib.FancyURLopener):
    version = "Mozilla/5.0"
urllib._urlopener = AppURLopener()
url = "http://i-2.yxdown.com/2015/2/25/c205972d-d858-4dcd-9c8b-8c0f876407f8.jpg"
filename = os.path.basename(url)
urllib.urlretrieve(url , filename)
       同一時候我也在本地建立目錄Picture3,並txt記錄獲取的URL,例如如下圖所看到的:

        最後但願文章對你們有所幫助,簡單來講文章就兩句話:怎樣分析源碼經過正則表達式提取指定URL。怎樣經過Python下載圖片。假設文章有不足之處,請海涵!


     (By:Eastmount 2015-3-20 下午5點  http://blog.csdn.net/eastmount/佈局

相關文章
相關標籤/搜索