Python簡易爬蟲

Python小爬蟲——貼吧圖片的爬取

在對Python有了必定的基礎學習後,進行貼吧圖片抓取小程序的編寫。html


 

  目標:  

  • 首先確定要實現圖片抓取這個基本功能
  • 而後實現對用戶所給的連接進行抓取
  • 最後要有必定的交互,程序不能太傻吧

1、頁面獲取

要讓python能夠進行對網頁的訪問,那確定要用到urllib之類的包。So先來個 import urllib python

urllib中有 urllib.urlopen(str) 方法用於打開網頁並返回一個對象,調用這個對象的read()方法後能直接得到網頁的源代碼,內容與瀏覽器右鍵查看源碼的內容同樣。正則表達式

1 #coding:utf-8
2 import urllib
3 
4 page = urllib.urlopen('http://tieba.baidu.com/p/1753935195')#打開網頁
5 htmlcode = page.read()#讀取頁面源碼
6 print htmlcode#在控制檯輸出

運行結果與查看源碼其實差很少小程序

運行結果就不放上來了瀏覽器

也能夠寫到文本文檔中:學習

複製代碼
 1 #coding:utf-8
 2 import urllib
 3 
 4 page = urllib.urlopen('http://tieba.baidu.com/p/1753935195')
 5 htmlcode = page.read()
 6 #print htmlcode
 7 
 8 pageFile = open('pageCode.txt','w')#以寫的方式打開pageCode.txt
 9 pageFile.write(htmlcode)#寫入
10 pageFile.close()#開了記得關
複製代碼

運行一遍,txt就出如今了getJpg.py的目錄下url

好了別鬧,咱們把它封裝成方法:spa

1 def get_html(url):
2     page = urllib.urlopen(url)
3     html = page.read()
4     return html

而後咱們的頁面獲取代碼就K.O.3d


 

2、圖片(目標)的提取

作完上面步驟,你打開txt一看,我去!這都是什麼跟什麼啊,根本找不到圖片在哪好伐?code

客官別急啊,我這就去給你叫咱們的小。。。圖片!圖片!

首先咱們要一個正則表達式 (什麼你不會?請看菜鳥入門教程-->Go)

而後咱們看源代碼,Yeah 咱們找到了其中一張圖片是這樣的

寫出圖片的正則表達式: reg = r'src="(.+?\.jpg)" width' 

解釋下吧——匹配以src="開頭而後接一個或多個任意字符(非貪婪),以.jpg" width結尾的字符串。好比圖中紅框內src後 雙引號裏的連接就是一個匹配的字符串。

接着咱們要作的就是從get_html方法返回的辣麼長一串字符串中 拿到 知足正則表達式的 字符串。

用到python中的re庫中的 re.findall(str) 它返回一個知足匹配的字符串組成的列表

複製代碼
 1 # coding:utf-8
 2 import urllib
 3 import re
 4 
 5 def get_html(url):
 6     page = urllib.urlopen(url)
 7     html = page.read()
 8     return html
 9 
10 reg = r'src="(.+?\.jpg)" width'#正則表達式
11 reg_img = re.compile(reg)#編譯一下,運行更快
12 imglist = reg_img.findall(get_html('http://tieba.baidu.com/p/1753935195'))#進行匹配
13 for img in imglist:
14     print img
複製代碼

打印出這麼多圖片連接

光把連接拿出來沒用啊,咱們的目標是下載下來~

urllib庫中有一個 urllib.urlretrieve(連接,名字) 方法,它的做用是以第二個參數爲名字下載連接中的內容,咱們來試用一下

在上面代碼循環中加上 urllib.urlretrieve(img, 'tieba.jpg') 

臥槽!!!怎麼只下了一張

至少它下載了不是?啪啪啪啪啪(掌聲)

檢查下問題出在哪。。。。

沒錯咱們只給了一個tieba.jpg的名字,後來的把前面的覆蓋了。

調整下代碼:

複製代碼
 1 # coding:utf-8
 2 import urllib
 3 import re
 4 
 5 def get_html(url):
 6     page = urllib.urlopen(url)
 7     html = page.read()
 8     return html
 9 
10 reg = r'src="(.+?\.jpg)" width'
11 reg_img = re.compile(reg)
12 imglist = reg_img.findall(get_html('http://tieba.baidu.com/p/1753935195'))
13 x = 0
14 for img in imglist:
15     urllib.urlretrieve(img, '%s.jpg' %x)
16     x += 1
複製代碼

啪啪啪啪啪

 第一步完成~


3、指定連接抓取

我想要抓另外一個帖子,總不能打開源代碼,而後把那段地址改了在運行吧。

只是一個小程序,那也不行欸,加一個讓用戶指定地址的交互。

先把提取圖片的那段代碼打包下:

複製代碼
1 def get_image(html_code):
2     reg = r'src="(.+?\.jpg)" width'
3     reg_img = re.compile(reg)
4     img_list = reg_img.findall(html_code)
5     x = 0
6     for img in img_list:
7         urllib.urlretrieve(img, '%s.jpg' % x)
8         x += 1
複製代碼

最後來個請輸入:

複製代碼
1 print u'請輸入url:',
2 url = raw_input()
3 if url:
4     pass
5 else:
6     url = 'http://tieba.baidu.com/p/1753935195'
7 html_code = get_html(url)
8 get_image(html_code)
複製代碼

運行一下,試試另外一個帖子:

完美~~


4、交互的添加

雖然寫的是一個簡單的小程序,但有強迫症的我仍是給他加上了交互(否則多難受啊:雙擊,屏幕一閃,下載完了。。。)

最後的代碼

複製代碼
 1 # coding:utf-8
 2 import urllib
 3 import re
 4 
 5 def get_html(url):
 6     page = urllib.urlopen(url)
 7     html_code = page.read()
 8     return html_code
 9 
10 def get_image(html_code):
11     reg = r'src="(.+?\.jpg)" width'
12     reg_img = re.compile(reg)
13     img_list = reg_img.findall(html_code)
14     x = 0
15     for img in img_list:
16         urllib.urlretrieve(img, '%s.jpg' % x)
17         x += 1
18 
19 print u'-------網頁圖片抓取-------'
20 print u'請輸入url:',
21 url = raw_input()
22 if url:
23     pass
24 else:
25     print u'---沒有地址輸入正在使用默認地址---'
26     url = 'http://tieba.baidu.com/p/1753935195'
27 print u'----------正在獲取網頁---------'
28 html_code = get_html(url)
29 print u'----------正在下載圖片---------'
30 get_image(html_code)
31 print u'-----------下載成功-----------'
32 raw_input('Press Enter to exit')
複製代碼

相對來講比較舒服的交互體驗,大功告成~

 

參考連接:https://www.cnblogs.com/Axi8/p/5757270.html

相關文章
相關標籤/搜索