007 - Python簡單爬蟲 - 正則表達式

用正則表達式匹配字符串,篩選出所需要的內(nèi)容,加上簡單網(wǎng)絡(luò)訪問代碼,實現(xiàn)一個最簡單的爬蟲。

目標(biāo)網(wǎng)頁:

https://tieba.baidu.com/p/3205263090

實現(xiàn)一個圖片批量下載的功能。把這個頁面上發(fā)表的圖表全部下載下來。

雖然拿到這個頁面上的圖片有多種方式,我們練習(xí)的是用Python+正則表達式 來下載圖片。

一、獲取網(wǎng)頁源代碼

直接上代碼:

import urllib
page = urllib.urlopen('https://tieba.baidu.com/p/3205263090')
print page.read()

運行一下,就是看到控制臺上打印出來的網(wǎng)頁的代碼。
解釋一下:urllib是Python提供的基礎(chǔ)網(wǎng)絡(luò)訪問模塊。urlopen() 創(chuàng)建一個表示遠程url的類文件對象,然后可以像本地文件一樣,操作這個類文件對象來獲取遠程數(shù)據(jù)。
read() 方法是讀取這個文件,打印出來就是所要訪問網(wǎng)頁的源代碼。

二、用正則表達式匹配出所需要的圖片URL

通過chrome右鍵檢查 -- Elements 查看圖片對應(yīng)的代碼:

找到這些圖片url的共同特點(頁面上還有其他的圖片),是src=后面一串字符到 .jpg為止,如果加上列多特征 pic_ext="jpeg",這樣可以把跟頁面上的其他圖片區(qū)別出來。

src="([.*\S]*\.jpg)" pic_ext="jpeg"

寫出正則表達式,.代表不包括\n的任意字符,*表示有多個字符,\S表示非空字符(防止向后包含空字符匹配了很長的字符串),()表示我們所需要匹配出來的內(nèi)容。

reg = r'src="([.*\S]*\.jpg)" pic_ext="jpeg"'  
imgurls = re.findall(reg, html)   #匹配出所有url

#遍歷
for imgurl in imgurls:
     print imgurl

三、保存下載圖片

urlretrieve() 方法直接將遠程數(shù)據(jù)下載到本地。

#coding=utf-8
import re
import urllib


# 獲取網(wǎng)頁源代碼的方法
def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

html =  getHtml('http://tieba.baidu.com/p/3205263090')

reg = r'src="([.*\S]*\.jpg)" pic_ext="jpeg"'
imgurls = re.findall(reg, html)  #用正則匹配到的圖片路徑的集合

x = 1
for imgurl in imgurls:
    print imgurl  # 打印查看一下是不是 每個圖片的URL
    urllib.urlretrieve(imgurl, '你機器上要保存圖片的路徑/%s.jpg' % x)

    print "正在下載第 %d 張"%x
    x +=1

快去看一下下載的圖片吧。



你可能發(fā)現(xiàn)圖片下載的并不快,有網(wǎng)絡(luò)原因,也有正則表達式匹配的原因。這段小代碼只是一個檢驗,繼續(xù)學(xué)習(xí)吧,后面會有更簡單、快速的方式,好用的第三方庫requests,xpath可以更快速定位到你需要的內(nèi)容。

==============
練習(xí)問題:
有同學(xué)看完上面代碼,馬上想嘗試另一個網(wǎng)站(網(wǎng)頁)的圖片爬取,這是一個很好的學(xué)習(xí)思路和方法。我們來看一下,花瓣網(wǎng)

http://huaban.com/pins/1120072731/
  1. 這個頁面上圖片很多,你先要確定要抓取哪網(wǎng)頁什么地方的圖片
    當(dāng)然可以是頁面所有圖片,也可以是網(wǎng)頁下部的瀑布流布局的圖片。(實際上以后這一步就是確定,你需要抓取的數(shù)據(jù)字段)
  2. 找到數(shù)據(jù)(圖片)對應(yīng)的源代碼進行分析,這篇文章的方式就是寫一個正則表達式(以后會使用如BeautifulSoup, XPath)
    不要“右鍵 -- 源代碼”去搜索找到對應(yīng)的內(nèi)容,使用Chrome -- 右鍵 -- 檢查 ,就是定位到 網(wǎng)頁元素對應(yīng)的代碼。
  3. 檢查審核
    這里要檢查,1)圖片src對應(yīng)的是不是一個完整URL(因為可以用相對文件引用的方式),如果不是要補全。2)檢查 正則表達式是不是能“準(zhǔn)確特征匹配”-- 就是用正則表達式匹配到的都是你所需要的內(nèi)容。

分析和對比幾處圖片,要想匹配出圖片的URL

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

檢查一下,這個正則匹配到的頁面所有圖片URL。想一想如果是某一個區(qū)域,某一個類型的圖片,正則要怎么寫。

總結(jié)一下:用正則就是要找到你要數(shù)據(jù)的共同特征,而且要能與其他數(shù)據(jù)區(qū)別開來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • 正則表達式到底是什么東西?字符是計算機軟件處理文字時最基本的單位,可能是字母,數(shù)字,標(biāo)點符號,空格,換行符,漢字等...
    獅子挽歌閱讀 2,271評論 0 9
  • 20170531 這幾天重新拾起了爬蟲,算起來有將近5個月不碰python爬蟲了。 對照著網(wǎng)上的程序和自己以前寫的...
    八神蒼月閱讀 14,372評論 3 44
  • 這學(xué)期,好像至少一個師弟和一個師妹跟我說,很高興認識你。現(xiàn)在年輕人都這么打招呼?哈哈哈哈哈哈但還是挺高興的。
    去社閱讀 266評論 0 0
  • 原來你是我最想留住的幸運。 讓我捧著腦袋瓜子好好想想和你認識多久了,7.25叭和我一起打王者叭記得你用的猴子然后呢...
    小逸睡不醒閱讀 1,596評論 0 0

友情鏈接更多精彩內(nèi)容