自學Python十 爬蟲實戰三(美女福利續)

来源:http://www.cnblogs.com/jixin/archive/2016/01/20/5144333.html
-Advertisement-
Play Games

我又來送福利啦!!!不同於上篇文章,這次我們的爬蟲採用了多線程,一直以來被所謂的分散式 多線程 爬蟲 給唬的怕怕的。今天就來一發多線程爬蟲吧,還能看妹子圖,想想就覺得很激動!!! 依然是流程解釋: 1.分析要爬取的網址,發現頁面分兩級,第一級是多個圖片集的入口,第二集是圖片的入口。我們新建兩...


  我又來送福利啦!!!不同於上篇文章,這次我們的爬蟲採用了多線程,一直以來被所謂的分散式  多線程  爬蟲 給唬的怕怕的。今天就來一發多線程爬蟲吧,還能看妹子圖,想想就覺得很激動!!!

  依然是流程解釋:

  1.分析要爬取的網址,發現頁面分兩級,第一級是多個圖片集的入口,第二集是圖片的入口。我們新建兩個類,一個類是爬取所有圖片集的url,一個類是根據得到的圖片集的url爬取圖片下載下來。第二個類的功能就跟我們上篇爬取煎蛋的功能一樣。

  2.我們考慮用多線程去實現爬蟲,為此我們引入了Queue模塊,主線程爬取第一級得到多個圖片集url放入到queue中,新建多個線程,從queue中取出數據,然後下載圖片!

  3.遇到的困難呢  萬惡的編碼坑,要註意規避可能出現的錯誤 因為出現問題 線程就會死掉。

  這篇正則啥的就不搞了,其實都很簡單的,對於html分析python有一些庫是比較不錯的,比如Beautiful Soup 有機會再學習學習!還有爬蟲框架Scrapy。。。要學習的東西還非常非常多啊。務必腳踏實地!!!

  1 # -*- coding: utf-8 -*-
  2 from __future__ import unicode_literals
  3 from HttpClient import HttpClient
  4 import sys,re,os
  5 from threading import Thread
  6 from Queue import Queue
  7 from time import sleep
  8 
  9 q = Queue()#圖片集url隊列
 10 imgCount = 0
 11 class getRosiUrl(HttpClient):#一級url爬取類
 12     def __init__(self):
 13         self.__pageIndex = 1
 14         self.__Url = "http://www.5442.com/tag/rosi/"
 15         self.__refer = 'http://www.5442.com/tag/rosi.html'
 16   #將爬取的圖片集url放入隊列
 17     def __getAllPicUrl(self,pageIndex):
 18         realurl = self.__Url + str(pageIndex) + ".html"
 19         print realurl
 20         pageCode = self.Get(realurl,self.__refer)
 21         type = sys.getfilesystemencoding()
 22         #print pageCode[0:1666].decode("gb2312",'ignore').encode(type)
 23         pattern = re.compile('<div.*?title">.*?<span><a href="(.*?)".*?</a>',re.S)
 24         items = re.findall(pattern,pageCode.decode("gb2312",'ignore').encode(type))
 25         for item in items:
 26             #print item
 27             global q
 28             q.put(item)
 29             #print "放入隊列"
 30   #得到最新頁碼
 31     def __getNewPage(self):
 32         pageCode = self.Get("http://www.5442.com/tag/rosi.html",self.__refer)
 33         type = sys.getfilesystemencoding()
 34         pattern = re.compile(r'<ul.*?<li .*?pageinfo">(.*?)</li>',re.S)
 35         newPage = re.search(pattern,pageCode.decode("gb2312",'ignore').encode(type))
 36         num  = re.search("[0-9]+",newPage.group(1).decode("gb2312",'ignore').split("/")[0]).group()
 37         if newPage != None:
 38             return int(num)
 39         return 0
 40 
 41     def start(self):
 42         page = self.__getNewPage()
 43         for i in range(1,page):
 44             self.__getAllPicUrl(i)
 45 
 46 #圖片下載類
 47 class downloadImg(HttpClient):
 48     def __init__(self):
 49         self.__pageIndex = 1
 50         self.__floder = "rosi"
 51         self.__Url = "http://www.5442.com/meinv/20150904/27058.html"
 52         self.__refer = 'http://www.5442.com/tag/rosi.html'
 53     def __getNewPage(self):
 54         pageCode = self.Get(self.__Url,self.__refer)
 55         type = sys.getfilesystemencoding()
 56         pattern = re.compile(r'<ul.*?<li>.*?<a>(.*?)</a></li>',re.S)
 57         newPage = re.search(pattern,pageCode.decode("gb2312",'ignore').encode(type))
 58         if newPage !=None: 59             num = re.search("[0-9]+",newPage.group(1).decode("gb2312",'ignore').split("/")[0]).group() 60             return int(num)
 61         return 0
 62   #得到圖片集名稱
 63     def __getBookName(self):
 64         pageCode = self.Get(self.__Url,self.__refer)
 65         type = sys.getfilesystemencoding()
 66         pattern = re.compile(r'<h1><a.*?>(.*?)</a>',re.S)
 67         title = re.findall(pattern,pageCode.decode("gb2312",'ignore').encode(type))
 68         if title != None:
 69             return title[0]
 70         return "未命名"
 71   #得到每頁圖片url
 72     def __getAllPicUrl(self,pageIndex):
 73         realurl = self.__Url[:-5] + "_" + str(pageIndex) + ".html"
 74         pageCode = self.Get(realurl)
 75         type = sys.getfilesystemencoding()
 76         pattern = re.compile('<p align="center" id="contents">.*?<a.*?<img src=(.*?) alt=.*?>',re.S)
 77         items = re.findall(pattern,pageCode.decode("gb2312",'ignore').encode(type))
 78         self.__savePics(items,self.__floder)
 79   #下載保存圖片
 80     def __savePics(self,img_addr,folder):
 81         for item in img_addr:
 82             filename = self.__floder + "\\" +item.split('/')[-1][:-1]
 83             print "正在保存圖片:" + filename
 84             print item[1:-1]
 85             with open(filename,'wb') as file:
 86                 img = self.Get(item[1:-1])
 87                 file.write(img)
 88             global imgCount
 89             imgCount = imgCount + 1
 90     def start(self):
 91         while True:
 92             global q
 93             self.__Url = q.get()#從隊列中取出一條圖片集url
 94             title = self.__getBookName()
 95             self.__floder = os.getcwd() + "\\rosi\\" + title.decode("gb2312",'ignore')
 96             isExists=os.path.exists(self.__floder)
 97             if not isExists:
 98                 type = sys.getfilesystemencoding()
 99                 os.mkdir(self.__floder)
100 
101             page = self.__getNewPage() + 1
102             for i in range(self.__pageIndex,page):
103                 self.__getAllPicUrl(i)
104 
105             q.task_done()#完成一項任務
106 
107 
108         
109 
110 if __name__ == '__main__':
111     isExists=os.path.exists("rosi")#創建保存目錄
112     if not isExists:
113         os.mkdir("rosi")
114     for i in range(5):#新建5個線程 等待隊列
115         print i
116         downImg = downloadImg()
117         t = Thread(target=downImg.start)
118         t.setDaemon(True)
119         t.start()
120     rosi = getRosiUrl()
121     rosi.start()
122 
123     q.join

  其中HttpClient.py就參考前面文章的吧,不過這個網站不需要代理了。。。下麵看看成果吧,一波妹子圖正在襲來:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天給大家分享的內容基於前幾天收到的一條留言信息,留言內容是這樣的:看了這位網友的留言相信有不少剛接觸開發的童鞋們也會有同樣的困惑,除了用新建類作為橋梁之外還有什麼好的辦法?很多童鞋肯定會想到DataSet,不錯,DataSet完全可以實現各種數據集的傳遞,而且還很方便,但是一般我們更推薦使用Lis...
  • TopShelf簡介 個人理解:開源、跨平臺的服務框架。提供一種方式以控制台編寫windows服務,與windows服務相比,目前只發現便於調試。 官網網站:http://docs.topshelf-project.com/en/latest/index.htmlTopShelf基本用法...
  • 9-6. 管理斷開時的併發問題想要確保只接受在WCF客戶端併發令牌未被修改的實體。解決方案我們有一個如Figure 9-6所示的模型.Figure 9-6訂單實體模型我們想通過WCF服務來更新一個order ,而要確保這個order 在我們上次取回後沒有發生過其它修改。稍後我們將演示兩個不同的方式....
  • C#用副線程去試圖修改主線程的UI控制項會報出異常,解決方案是使用副線程註冊事件通知主線程自己去修改UI控制項在winform中,方法如下private void button1_Click(object sender, EventArgs e){ Thread myThread = new Th...
  • WCF
    正在準備中
  • 9-5. 刪除一個斷開的實體問題我們要把一個把WCF上取回的對象做上刪除的標誌.解決方案假設我們有如Figure 9-5所示實體的支付與票據的模型.Figure 9-5. 一個支付與票據的模型我們的模型展示了支付記錄與票據的關係。在應用程式中,我們用客戶端與用WC封裝EF數據訪問交互. 在我們的例子...
  • 想完成一個鏈表發現有錯誤,代碼如下://http://ac.jobdu.com/problem.php?pid=1511//֮ǰÓÃlistʵÏֵģ¬½ñÌìÊÔÒ»ÏÂÓÃstructʵÏÖһϰÉ//¿
  • 在try-catch-finally語句中使用return語句遇到了一些疑問代碼一:static int intc(){ int x =0; try{ x=1; return x; }finally { ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...