使用python編寫一個壁紙網站的簡單爬蟲

来源:http://www.cnblogs.com/try2333/archive/2016/04/15/5396334.html
-Advertisement-
Play Games

目標網站:http://www.netbian.com/ 目的:實現對壁紙各分類的第一頁壁紙的獲取 一:分析網站,編寫代碼: (ps:源代碼在文章的最後) 1.獲取網站目錄部分的一大段代碼,下一步再進行仔細匹配網址與標題. 如圖: 2.進行分類的標題與鏈接的匹配。 如下圖所示: 3.從爬取到的目錄進 ...


目標網站:http://www.netbian.com/

目的:實現對壁紙各分類的第一頁壁紙的獲取

 一:分析網站,編寫代碼:

(ps:源代碼在文章的最後)

1.獲取網站目錄部分的一大段代碼,下一步再進行仔細匹配網址與標題.

 1 #coding=gbk
 2 #目標:下載各目錄的壁紙(大圖)
 3 __author__ = 'CQC'
 4 import urllib2
 5 import urllib
 6 import re
 7 import os
 8 
 9 #創建壁紙下載文件夾
10 path = 'd:\\彼岸壁紙'
11 if not os.path.isdir(path):
12     os.makedirs(path)
13 #目錄
14 big_title = []
15 
16 #首頁打開
17 url = 'http://www.netbian.com/' 
18 headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0'}
19 request = urllib2.Request(url,headers = headers)
20 response = urllib2.urlopen(request)
21 
22 #首頁目錄源代碼獲取
23 pat_menu = re.compile('<ul class="menu">(.*?)</a></div>',re.S)
24 code_menu = re.search(pat_menu,response.read())

 如圖:

2.進行分類的標題與鏈接的匹配。

 1 #目錄標題
 2 pat_menu_title = re.compile('<a href=".*?" title="(.*?)">',re.S)
 3 menu_title = re.findall(pat_menu_title,code_menu.group(1))
 4 for a_item in menu_title:
 5     big_title.append(a_item)
 6     print a_item
 7     
 8 #目錄鏈接
 9 pat_menu_link = re.compile('<a href="(.*?)" title=".*?">',re.S)
10 menu_link = re.findall(pat_menu_link,code_menu.group(1))

 如下圖所示:

3.從爬取到的目錄進入,獲得該目錄下所有壁紙的標題與鏈接.

 1 #進入目錄
 2 j = 0
 3 for b_item in menu_link:
 4     url_menu = 'http://www.netbian.com/' + b_item
 5     request_son = urllib2.Request(url_menu,headers = headers)
 6     response_son = urllib2.urlopen(request_son)
 7     #獲得每個目錄的圖片標題,鏈接
 8     
 9     #獲得子目錄標題
10     title_son = []
11     pat_title_son = re.compile('<img src=".*?" data-src=".*?" alt="(.*?)"/>',re.S)
12     res_title = re.findall(pat_title_son,response_son.read())
13     for c_item in res_title:
14         title_son.append(c_item)
15 
16     #篩選出子目錄代碼
17     pat_code_son = re.compile('<ul>(.*?)</ul>',re.S)
18     middle_pattern = urllib2.Request(url_menu,headers = headers)
19     middle_response = urllib2.urlopen(middle_pattern)
20     res_code_son = re.search(pat_code_son,middle_response.read())
21     
22     #獲得子目錄鏈接,合成大圖網頁鏈接
23     pat_link_son = re.compile('<li><a href="(.*?)" target="_blank"><img',re.S)
24     res_link = re.findall(pat_link_son,res_code_son.group(1))

 如下圖所示:

4.根據上一步爬取到的鏈接,合成真正的1080p壁紙鏈接.

因為我們從上圖標題點進去後是這樣:

還需要點擊下載按鈕才能打開1080p壁紙的鏈接。為了方便,我們直接合成1080p壁紙的鏈接.

例如: http://www.netbian.com/desk/9805.htm

對應的1080p網址:http://www.netbian.com/desk/9805-1920x1080.htm

代碼:

 1     i = 0
 2     #顯示進度
 3     print big_title[j]
 4     for d_item in res_link:
 5         #獲得大圖下載鏈接
 6         if d_item == 'http://www.mmmwu.com/':
 7             pass
 8         else:
 9             new_link = 'http://www.netbian.com/' + d_item[:-4] + '-1920x1080.htm'
10             print new_link

(ps:由於‘美女’分類中的第一個標題鏈接到了其他網站,為了簡單一點,所以我直接跳過了)

5.進入1080p壁紙鏈接,下載壁紙.

 1 request_real = urllib2.Request(new_link,headers = headers)
 2             response_real = urllib2.urlopen(request_real)
 3             pat_real = re.compile('<img src="(.*?)" alt=".*?"/></td></tr>')
 4             
 5             link_real = re.search(pat_real,response_real.read())
 6             #跳過vip壁紙
 7             if link_real:
 8                 fina_link = link_real.group(1)
 9                 #創建下載目錄
10                 path_final = 'd:\\彼岸壁紙\\' + big_title[j] + '\\'
11                 if not os.path.isdir(path_final):
12                     os.makedirs(path_final)
13                 path_pic = path_final + title_son[i] + '.jpg'
14                 f = open(path_pic,'wb')
15                 data = urllib.urlopen(fina_link)
16                 f.write(data.read())
17                 f.close()
18                 if not data:
19                     print "Download Failed."
20             i += 1
21     print 'One menu download OK.'
22     j += 1

6.下載完成.

二、所有的源代碼。

 1 #coding=gbk
 2 #目標:下載各目錄的壁紙(大圖)
 3 __author__ = 'CQC'
 4 import urllib2
 5 import urllib
 6 import re
 7 import os
 8 
 9 #創建壁紙下載文件夾
10 path = 'd:\\彼岸壁紙'
11 if not os.path.isdir(path):
12     os.makedirs(path)
13 #目錄
14 big_title = []
15 
16 #首頁打開
17 url = 'http://www.netbian.com/' 
18 headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0'}
19 request = urllib2.Request(url,headers = headers)
20 response = urllib2.urlopen(request)
21 
22 #首頁目錄源代碼獲取
23 pat_menu = re.compile('<ul class="menu">(.*?)</a></div>',re.S)
24 code_menu = re.search(pat_menu,response.read())
25 
26 #目錄標題
27 pat_menu_title = re.compile('<a href=".*?" title="(.*?)">',re.S)
28 menu_title = re.findall(pat_menu_title,code_menu.group(1))
29 for a_item in menu_title:
30     big_title.append(a_item)
31     print a_item
32     
33 #目錄鏈接
34 pat_menu_link = re.compile('<a href="(.*?)" title=".*?">',re.S)
35 menu_link = re.findall(pat_menu_link,code_menu.group(1))
36 
37 #進入目錄
38 j = 0
39 for b_item in menu_link:
40     url_menu = 'http://www.netbian.com/' + b_item
41     request_son = urllib2.Request(url_menu,headers = headers)
42     response_son = urllib2.urlopen(request_son)
43     #獲得每個目錄的圖片標題,鏈接
44     
45     #獲得子目錄標題
46     title_son = []
47     pat_title_son = re.compile('<img src=".*?" data-src=".*?" alt="(.*?)"/>',re.S)
48     res_title = re.findall(pat_title_son,response_son.read())
49     for c_item in res_title:
50         title_son.append(c_item)
51 
52     #篩選出子目錄代碼
53     pat_code_son = re.compile('<ul>(.*?)</ul>',re.S)
54     middle_pattern = urllib2.Request(url_menu,headers = headers)
55     middle_response = urllib2.urlopen(middle_pattern)
56     res_code_son = re.search(pat_code_son,middle_response.read())
57     
58     #獲得子目錄鏈接,合成大圖網頁鏈接
59     pat_link_son = re.compile('<li><a href="(.*?)" target="_blank"><img',re.S)
60     res_link = re.findall(pat_link_son,res_code_son.group(1))
61     i = 0
62     #顯示進度
63     print big_title[j]
64     for d_item in res_link:
65         #獲得大圖下載鏈接
66         if d_item == 'http://www.mmmwu.com/':
67             pass
68         else:
69             new_link = 'http://www.netbian.com/' + d_item[:-4] + '-1920x1080.htm'
70             print new_link
71             request_real = urllib2.Request(new_link,headers = headers)
72             response_real = urllib2.urlopen(request_real)
73             pat_real = re.compile('<img src="(.*?)" alt=".*?"/></td></tr>')
74             
75             link_real = re.search(pat_real,response_real.read())
76             #跳過vip壁紙
77             if link_real:
78                 fina_link = link_real.group(1)
79                 #創建下載目錄
80                 path_final = 'd:\\彼岸壁紙\\' + big_title[j] + '\\'
81                 if not os.path.isdir(path_final):
82                     os.makedirs(path_final)
83                 path_pic = path_final + title_son[i] + '.jpg'
84                 f = open(path_pic,'wb')
85                 data = urllib.urlopen(fina_link)
86                 f.write(data.read())
87                 f.close()
88                 if not data:
89                     print "Download Failed."
90             i += 1
91     print 'One menu download OK.'
92     j += 1

初學爬蟲,歡迎指導~


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

-Advertisement-
Play Games
更多相關文章
  • Atitit.獲取某個服務 網路鄰居列表 解決方案 原理,帶入某個ip掃描從0 255 很快,多線程幾秒就可以出來。 使用CountDownLatch來join線程.. 返回 [{ "ip":"192.168.2.114", "url":"http://@ip@:8080/cms/list_deta ...
  • 我是在前年的時候開始深入接觸C#的,所以,為什麼說是深入呢,大學裡面學過C#,但是,大學的學習你們是懂。剛進公司的三個多月,一直都是在熟悉C#的語法,後來我的頭就讓我做一個計算器的例子(基本上大家都做過這個例子),然後就直接做了,結果可想而知,運行時可以運行,但是只有一個class,頭看了之後,就讓 ...
  • 雙重鎖實現單例時遭到質疑,既是:雙重鎖也無法保證單例模式! 果然,答案又是對方對的,汗顏! 原因是:指令會重排序,普通的變數僅僅會保證該方法在執行時,所有依賴的賦值結果是正確的,但不會保證執行順序! 為什麼會重排序:指令重排序是指cpu採用了允許將多條指令不按照程式的順序分開發送各相應電路單元處理, ...
  • 最近在學習建模工具(StarUML)發現 其他功能一切正常 但是無法顯示代碼導出功能, 正常界面如下: 我的安裝確沒有導出功能缺少C++,C# ,Java等導出功能 解決辦法: 到StarUML安裝目錄下 找到需要導入語言文件夾, 例如c#對應文件夾staruml-csharp 打開文件夾 找到un ...
  • 裝飾模式是為已有功能動態的添加更多功能的一種方式。 當系統需要新功能的時候,是向舊的類中添加新的代碼,而這些新的代碼通常裝飾了原有類的核心職責或者主要行為, 這些新的邏輯增加了主類的複雜度,但是它們僅僅是滿足一些只在某這特定情況下才會執行的特殊行為的需要,且先後執行順序不確定。 這樣,每個要裝飾的功 ...
  • 最近使用關係型資料庫實現了用戶之間的關註,於是思考換一種思路,使用Redis實現用戶之間的關註關係。 綜合考慮了一下Redis的幾種數據結構後,覺得可以用集合實現一下。 假設“我”的ID是1,“別人”的ID是2。 一、添加關註 添加關註分為兩步:1、將對方id添加到自己的關註列表中;2、將自己的id ...
  • 第一節 CountDownLatch (1)初識CountDownLatch (2)詳述CountDownLatch CountDownLatch是通過一個計數器來實現的,計數器的初始值為線程的數量。每當一個線程完成了自己的任務後,計數器的值就會減1,當計數器值到達0時,它表示所有的線程已經完成了任 ...
  • 單鏈表的結構有多種 這裡介紹的鏈表有頭結點、有尾節點並且尾節點指向頭結點 單鏈表的每個結點的地址存放在其直接前驅結點的指針域中。其中第一個結點沒有前驅結點,因此需要一個頭指針指向第一個節點,便於我們對整個鏈表進行操作;這裡的單鏈表的最後一個節點的指針域存放的是頭結點的地址。 單鏈表不能隨意存取,必要 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...