国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python系列之五_爬蟲抓圖

2019-11-06 07:51:42
字體:
來源:轉載
供稿:網友

  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()函數,并添加了幾句代碼。  在代碼中,主要調用了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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 冷水江市| 温泉县| 荣昌县| 新竹市| 曲周县| 宁陕县| 应用必备| 寿宁县| 喀喇沁旗| 玛沁县| 芦溪县| 揭阳市| 山阴县| 北安市| 利辛县| 徐汇区| 南和县| 永兴县| 贵德县| 来安县| 三江| 永福县| 嵊泗县| 泾川县| 冀州市| 嫩江县| 广灵县| 浠水县| 定安县| 商河县| 上林县| 平遥县| 思茅市| 凤冈县| 利辛县| 榕江县| 瓮安县| 阿拉善盟| 高邮市| 奉贤区| 宁晋县|