小白菜學爬蟲(三):第一個小爬蟲

向右奔跑老師寫了《007 - Python簡單爬蟲 - 正則表達式》爬取了貼吧中的圖片,留了一個任務是爬取花瓣上面的圖片

實現步驟

根據老師的貼吧示例,簡單分析花瓣爬蟲的如下:
1、獲取url對應的網頁源代碼
2、根據網頁圖片的網址特征,確定正則表達式
3、利用正則中的findall方法進行圖片地址的提取
4、遍歷圖片地址用urlretrieve獲取

分析過程:

老師文章中已經給出了正則表達式

<img src="([.\S])"

仔細分析發現,這種匹配無法區分圖片跟頭像。下載下來有很多無用的信息。


示意圖
頭像示意圖

對比圖片和頭像的img標簽,發現圖片都有指定寬度width


主圖
縮略圖

而頭像怎沒有指定width

頭像

故修改正則為: r'<img src="([.\S])" width' 去除掉沒有width的img標簽。

實現代碼

# coding:utf-8
from urllib import request
import re

# 獲取網頁源代碼的方法
def getHtml(url):
    page = request.urlopen(url)
    html = page.read().decode('utf-8') # Python3需要decode
    return html

html =  getHtml('http://huaban.com/pins/1120072731/')
reg = r'<img src="([.*\S]*)" width'
imgurls = re.findall(reg, html)  #用正則匹配到的圖片路徑的集合

x = 1
for imgurl in imgurls:
    imgurl ='http:'+ str(imgurl)
    print (imgurl)  # 打印查看一下是不是 每個圖片的URL
    request.urlretrieve(imgurl, 'images2/%s.jpg' % x)
    print ("正在下載第 %d 張"%x)
    x +=1

注意事項

因為我用的版本是python3版本,代碼存在些許差異,比方說:
1、在Python3中print為函數:print (imgurl)
2、urlopen在request下:request.urlopen(url)
修改完成后運行程序,報錯:TypeError: cannot use a string pattern on a bytes-like object
查詢資料得知python3中urllib.read返回的是bytes對象,不是string,得把它decode轉換成string對象:page.read().decode('utf-8')

運行結果

采集結果

存在缺陷

現在采集到的還只是圖片的縮略圖,沒有能夠深入到畫板的主頁面去采集原圖。后面考慮獲取到畫板縮略圖的源地址,去源地址進行原圖片的獲取。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1 前言 作為一名合格的數據分析師,其完整的技術知識體系必須貫穿數據獲取、數據存儲、數據提取、數據分析、數據挖掘、...
    whenif閱讀 18,105評論 45 523
  • 聲明:本文講解的實戰內容,均僅用于學習交流,請勿用于任何商業用途! 一、前言 強烈建議:請在電腦的陪同下,閱讀本文...
    Bruce_Szh閱讀 12,783評論 6 28
  • 一、前言 這是我第一次寫文章,作為一個非計算機,編程類專業的大二學生,我希望能夠給像我這樣的入門的朋友一些幫助,也...
    梅花鹿數據閱讀 2,586評論 5 11
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • 文件切換 導航 目錄樹 分屏操作 書簽 選取 編輯和刪除文本 大小寫轉換 刪除和剪切 多光標和多處選取 括號跳轉 ...
    _Never_閱讀 640評論 0 2