Python系列之五_爬蟲抓圖
前面我們粗略地學習了Python語言的語法,一直學語法也挺無聊的,現在讓我們讓做一些有趣的事情。
例如你在百度貼吧里看到一篇文章,里面有很多好看的圖片,但是一張張另存比較慢,學完Python語言后,我們可以編寫一個爬蟲程序,把所有圖片全部抓下來。
我們的思路是這樣的:
首先,把這個網頁的HTML源代碼先抓下來;
然后,分析HTML源代碼,找出所有圖片的鏈接;
最后把所有圖片下載下來。
一、抓取HTML源代碼
#!/usr/bin/python# -*- coding: UTF-8 -*-import urllibdef get_html(url): page = urllib.urlopen(url) html = page.read() return htmlht = get_html("http://tieba.baidu.com/p/5004440579")PRint ht 下面我們來分析這段代碼。“import urllib”這句表示導入urllib這個庫,感覺有點像java的import。
def部分是定義一個函數,函數需要與前面隔開兩行。函數體縮進一層。
urllib.urlopen()函數用于打開一個url,并返回一個頁面對象。
page.read()函數讀取頁面的html源代碼。
運行這段代碼,可以發現控制臺打印出了html源代碼。
二、解析HTML源代碼并找出所有圖片鏈接 這里需要用到正則表達式。現在正則表達式可以說是幾乎所有編程語言必會的知識點了。
我們利用Chrome瀏覽器的開發者工具,按快捷鍵F12,在源代碼中查看圖片的鏈接:
發現圖片在HTML源代碼中,格式都有:src="http*.jpg"
下面編寫一段代碼解析其中的圖片鏈接:
#!/usr/bin/python# -*- coding: UTF-8 -*-import urllibimport redef get_html(url): page = urllib.urlopen(url) html = page.read() return htmldef get_img(html): reg = r'src="(http.+?/.jpg)"' img_re = re.compile(reg) img_list = re.findall(img_re, html) return img_listht = get_html("http://tieba.baidu.com/p/5004440579")li = get_img(ht)for i in li: print i 在這段程序中,編寫了另一個函數get_img,用于根據html源代碼,解析圖片鏈接。由于使用到正則表達式,所以引入了re庫。
在get_img函數中,首先定義一個正則表達式reg,其中r前綴表示它是一個正則表達式。
src="(http.+?/.jpg)"這串字符表示我們要在html源代碼中查找的匹配項,正則表達式定義一些規則,可以通配。
其中:
. 匹配任意字符
+ 表示前面的內容出現1次或多次
* 表示前面的內容出現0次或多次
? 匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式 如果正則表達式中出現以上通配符,則用反斜杠進行轉義。
所以,src="(http.+?/.jpg)"就表示http后可以帶任意字符,任意字符出現1次或多次,后綴名為.jpg。一對小括號表示里面的內容是我們要截取的信息。
上述程序運行后,發現還有一些問題,它把一些不是圖片的片斷也取出來了,所以后來我把正則表達式修改為:
reg = r'src="(http[^"]+?/.jpg)"'
其中[^"]表示http后的字符不能是雙引號,^符號表示排除,除了雙引號外其它任意字符都匹配。
三、下載所有圖片
在上一步拿到圖片鏈接之后,剩下的工作就很簡單了,Python中下載數據很簡單,有非常簡單好用的庫。
def get_img(html): reg = r'src="(http[^"]+?/.jpg)"' img_re = re.compile(reg) img_list = re.findall(img_re, html) n = 0 for img_url in img_list: urllib.urlretrieve(img_url, 'E:/tmp/%s.jpg' % n) n += 1 return img_list 我們修改了一下get_img()函數,并添加了幾句代碼?! ≡诖a中,主要調用了urllib的urlretrieve()函數,這個函數的兩個參數,第1個參數表示要下載的url,第2個參數表示要保存的本地文件名。由于我們想讓圖片依次命名為1.jpg、2.jpg、...,所以定義了一個變量n,讓它遞增。
還有一個用法可能比較陌生:'E:/tmp/%s.jpg' % n,在Python的字符串中可以定義一個占位符,就象C語言一樣,有%d、%s等,其后,跟上實際用到的變量,如果有兩個以上占位符,需要用一個小括號,例如:'%s: %d' % ('張三', 22)
運行結束,查看一下本地的E:/tmp文件夾,圖片都下來啦:
四、結尾
在寫這篇文章時,由于本人是Python語言初學者,所以參考了一些網上的文章,特別感謝“蟲師”的一篇文章,把文章的鏈接貼出,大家參照學習:
http://www.cnblogs.com/fnng/p/3576154.html
在此,也將我的完整源代碼貼出來:
#!/usr/bin/python# -*- coding: UTF-8 -*-import urllibimport redef get_html(url): page = urllib.urlopen(url) html = page.read() return htmldef get_img(html): reg = r'src="(http[^"]+?/.jpg)"' img_re = re.compile(reg) img_list = re.findall(img_re, html) n = 0 for img_url in img_list: urllib.urlretrieve(img_url, 'E:/tmp/%s.jpg' % n) n += 1 return img_listht = get_html("http://tieba.baidu.com/p/5004440579")for i in get_img(ht): print i
新聞熱點
疑難解答