歡迎光臨
每天分享高質量文章

Python3爬取1024圖片

分析

串列頁面

首先進入1024的導航網站,隨便點選一個地址進入選擇圖片區或者在網站地址後面新增thread0806.php?fid=16&search;=&page;=,這就是1024網站的圖片區,這個爬蟲就是主要抓取這個區域的所有圖片,使用瀏覽器debug分析一下這個頁面發現基本都是串列頁,格式如下:

在位址列http://xxxxxx.biz/thread0806.php?fid=16&search;=&page;=後面拼1、2、3等於就是訪問圖片區第一頁、第二頁、第三頁的串列頁。根據這些串列頁就可以爬出具體的每一個圖片頁的地址,類似上圖的地址:htm_data/16/1611/2114702.html 在地址的前面拼接上主站地址就是具體的圖片頁了。所以根據以上的分析:透過迴圈位址列找到不同的串列頁在根據串列頁找到具體的圖片頁

位址列->圖片串列->圖片頁地址

獲取串列頁圖片地址程式碼如下:

在這個地址後面拼接1到N就是不同的串列頁

圖片頁面

利用瀏覽器debug一下頁面,圖片基本上都是外鏈地址,以http或者https開頭以jpg、png、gif結尾,寫個正則運算式匹配這些地址,然後交給程式下載就OK了。

頁面程式碼如下:

在下載過程中遇到了幾個問題,就是有的頁面會報403禁止訪問等,應該是網站加了一些防止爬蟲的手段,網上找了下加上essay-header引數來模擬瀏覽器訪問就解決了;

下載單個頁面程式碼如下:

import urllib.request,socket,re,sys,os#定義檔案儲存路徑targetPath = "D:\\temp\\1024\\1"def openUrl(url):
    essay-headers = {                  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '                            'Chrome/51.0.2704.63 Safari/537.36'
               }

    req = urllib.request.Request(url=url, essay-headers=essay-headers)
    res = urllib.request.urlopen(req)
    data = res.read()
    downImg(data)def downImg(data):
    for link,t in set(re.findall(r'([http|https]:[^\s]*?(jpg|png|gif))', str(data))):        if link.startswith('s'):
            link='http'+link        else:
            link='htt'+link        print(link)        try:
            opener=urllib.request.build_opener()
            opener.addessay-headers=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
            urllib.request.install_opener(opener)
            urllib.request.urlretrieve(link,saveFile(link))        except:            print('失敗')def saveFile(path):
    #檢測當前路徑的有效性
    if not os.path.isdir(targetPath):
        os.mkdir(targetPath)    #設定每個圖片的路徑
    pos = path.rindex('/')
    t = os.path.join(targetPath,path[pos+1:])    return t

url = "http://xxxx.biz/htm_data/16/1611/2115193.html"openUrl(url)


批次爬取

批次爬取有兩個工作要做,第一for迴圈標的內的所有串列頁,第二為了避免重覆爬取,需要給每個頁面建立唯一的檔案夾,下次爬取的時候如果存在直接跳過。最後在理一下所有的爬取步驟:

迴圈位址列->找出圖片頁串列->圖片頁分析找出圖片地址->為圖片頁建立唯一的檔案夾->開始下載頁面圖片

完整的程式碼如下:

import urllib.request,socket,re,sys,os

baseUrl='http://xxxx.biz/'targetPath = "D:\\temp\\1024\\"def getContant(Weburl):
    Webessay-header= {'Upgrade-Insecure-Requests':'1',                'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36',}
    req = urllib.request.Request(url = Weburl,essay-headers=Webessay-header)
    respose = urllib.request.urlopen(req)
    _contant = respose.read()
    respose.close()    return str(_contant)def getUrl(URL):
    pageIndex = 1
    for i in range(1,int(pageIndex)+1):
        Weburl = URL + str(i)
        contant = getContant(Weburl)
        comp = re.compile(r')
        urlList1 = comp.findall(contant)
        comp = re.compile(r'a href="(.*?)"')
        urlList2 = comp.findall(str(urlList1))
        urlList = []        for url1 in urlList2:
            url2 = baseUrl+url1
            urlList.append(url2)        return urlListdef openUrl(url):
    essay-headers = {                  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '                            'Chrome/51.0.2704.63 Safari/537.36'
               }

    filePath=targetPath+url[-12:-5]    #檢測當前路徑的有效性
    if not os.path.isdir(filePath):
        os.mkdir(filePath)
        req = urllib.request.Request(url=url, essay-headers=essay-headers)
        res = urllib.request.urlopen(req)
        data = res.read()
        downImg(data,filePath)    else:        print("已經下載過的地址跳過:"+url)        print("filePath  "+filePath)def downImg(data,filePath):
    for link,t in set(re.findall(r'([http|https]:[^\s]*?(jpg|png|gif))', str(data))):        if link.startswith('s'):
            link='http'+link        else:
            link='htt'+link        print(link)        try:
            opener=urllib.request.build_opener()
            opener.addessay-headers=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
            urllib.request.install_opener(opener)
            urllib.request.urlretrieve(link,saveFile(link,filePath))        except:            print('失敗')def saveFile(path,filePath):
    #設定每個圖片的路徑
    pos = path.rindex('/')
    t = os.path.join(filePath,path[pos+1:])    return tdef openPage(UrlList):
    for pageUlr in UrlList:        try:            print('正在下載地址:'+pageUlr)
            openUrl(pageUlr)        except:            print('地址:'+pageUlr+'下載失敗')

URL = baseUrl+'thread0806.php?fid=16&search;=&page;='for num in range(0,20):#0-20頁
    print("#######################################")    print("##########總目錄下載地址###############")    print(URL+str(num))    print("#######################################")    print("#######################################")
    UrlList = getUrl(URL+str(num)) 
    openPage(UrlList)

最後的爬取結果:

原始碼地址:python-crawler
具體地址和原始碼在一起


其它

關於python2和python3的爭論,網站爭論比較大python3不相容pyhton2,很多第三方的類庫暫時還沒有支援python3等等,但是對於我們新手來說,肯定是往前看果斷python3.

程式碼比較冗餘幾個地方還沒有寫好,還在慢慢學習中,目前只是搞的可以跑起來。還有幾個問題沒有解決,下載一段時間後會莫名其妙的斷掉目前還麼找到原因,後期看是否可以加上多執行緒來爬取可能會快一點,大家有什麼更好的建議也可以提出來。


文章

申明

作者:純潔的微笑

源自:http://www.cnblogs.com/ityouknow/p/6013074.html

宣告:文章著作權歸作者所有,如有侵權,請聯絡小編刪除

贊(0)

分享創造快樂