爬取表情包

  這是我第一次在這寫博客,仍是有點興奮。正則表達式

  我也是剛接觸Python不久,發現Python代碼真的很強大,簡單就能夠處理複雜的事。最近很想寫個爬蟲,但水平沒達到,正好CSDN學院有個公開課,黃勇老師講的《90分鐘掌握Python多線程爬蟲(全程實戰)》,3月6日晚20:00我聽了直播,當時沒跟上,等看了回播才搞明白(可能我是Python2課裏是Python3,找理由O(∩_∩)O哈哈~)。數據庫

  先上筆記:緩存

爬蟲的流程分析:服務器

一、請求數據:requests庫(這個庫能夠很方便的去請求網絡數據)
*安裝方法:pip install requests
二、將請求下來的數據解析出來,獲取咱們想要的數據,把不想要的數據拋棄掉
*Beautifulsoup:pip install bs4
*lxml:pip install lxml
三、將解析後的數據保存下來,若是是文字類型,能夠保存到文件中或者數據庫中或者緩存中,若是是文件類型,好比圖片、視頻,那麼能夠保存到硬盤中
四、不管你的爬蟲是大仍是小,都是由這幾個模塊組成的。

在此感謝黃勇老師,也不囉嗦了,直接上代碼。網絡

#coding:utf-8
import requests import os from bs4 import BeautifulSoup import urllib import threading # 首先要進行身份假裝
Headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36'} PAGE_URLS=[] IMG_URLS=[]#全局變量IMG_URLS:就是一個列表,這個列表存儲了不少表情包的連接
gLock=threading.Lock() def producer(): '''生產者:專門用來從網站獲取表情包的url連接,至關於增長IMG_URLS中的數據'''
    while True: gLock.acquire()#多線程對全局變量操做必須加鎖
        if len(PAGE_URLS)==0: gLock.release()#跳出循環退出程序前也必須解鎖
            break page_url=PAGE_URLS.pop()#pop函數將列表中最後一項刪除,並返回刪除的項
        gLock.release()#操做完成記得解鎖
        response = requests.get(page_url, Headers)#獲取網頁數據,返回response
        text = response.text # print text
        soup = BeautifulSoup(text, 'lxml')#實例BeautifulSoup對象解析數據,使用lxml引擎。固然還能夠用其餘解析工具,也可用正則表達式,正則表達式比較複雜
        img_list = soup.find_all("img", attrs={"class": "img-responsive lazy image_dta"})#根據標籤屬性查找本身想要的數據,拋棄其它非表情包圖片
        for img in img_list: img_url = img['data-original']#找到圖片源網址,img['src']不是真正的圖片源,網址都是同樣
 gLock.acquire() IMG_URLS.append(img_url) gLock.release() def consumer(): '''消費者:專門從表情包的url連接中下載圖片,至關於消耗IMG_URLS中的數據'''
    while True: gLock.acquire() if len(IMG_URLS)==0 and len(PAGE_URLS)==0:#剛運行有可能IMG_URLS爲空,因此加上PAGE_URLS同時爲空纔是結束條件
 gLock.release() break
        if len(IMG_URLS)>0: img_url=IMG_URLS.pop()#爲空時pop出錯
        else: img_url='' gLock.release() if img_url: filename = img_url.split("/")[-1]#將圖片地址分割成列表,取最後一項文件名
            fullpath = os.path.join("images", filename)#將images目錄名與文件名合併,因爲系統不一樣,不必定就是加"/"
            try: urllib.urlretrieve(img_url, fullpath)#urlretrieve函數就是從目標網址下載存儲到本地,Python3中在request庫中
                # print img_url,"下載完成"
            except Exception as e: print e print img_url,"下載失敗"#還時常出現10054錯誤,多是服務器發現了爬蟲強行關閉當前連接

def main(): for x in range(1,100):#爬取1-99頁數據
        page_url="https://www.doutula.com/photo/list/?page="+str(x) PAGE_URLS.append(page_url) for x in range(5):#開啓5個生產者線程
        th=threading.Thread(target=producer) th.start() for x in range(5):#開啓5個消費者線程
        th =threading.Thread(target=consumer) th.start() if __name__ == '__main__':#若是做爲程序則執行,若是做爲包加載則不執行
    main()
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息