使用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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...