Python初試-requests/re實現圖片多頁爬取,順序編號

0 前言

最近看完Python基本知識與正則表達式,嘗試寫下爬蟲,發現不知怎么入手,就上網查了下,看到了一片文章,感覺還不錯,根據上面的代碼嘗試寫了下,雖然是別人的代碼(代碼并不是完全可以運行,有點問題),自己敲一遍也算練習了下,中間也嘗試改動了一些。

參考文章:(http://www.lxweimin.com/p/384bfb49cdd6

1 功能與實現

1.1 功能:

爬取一個網站( url = 'http://jandan.net/ooxx/',爬完發現是個***網站)的圖片,實現多頁爬取,把爬取的圖片按照1,2,3...編號

1.2 代碼實現

首先貼出主程序:

def main():
    if not os.path.exists('folder'):#判斷是否存在‘folder’文件夾
        os.mkdir('folder') #不存在則建立
    os.chdir('folder') #改變工作目錄
    pages = 3 #選擇爬取頁數,也可以用imput,在程序運行時輸入
    url = 'http://jandan.net/ooxx/'
    page_num = int(get_page(url)) #通過get_page(url)函數得到初始頁碼,便于爬取其他頁碼
    num = 0   # num是圖片編碼,在save_imgs函數中用到
    for i in range(pages): #逐一爬取每個網頁
        page_num -= i #改變頁碼,選擇上一網頁
        page_url = url + 'page-' + str(page_num) + '#comments' #獲取該網頁的URL
        img_addrs = find_images(page_url) #獲取該網頁所有圖片地址
        save_imgs(num, img_addrs) #保存圖片
        num += len(img_addrs) #num作為圖片編碼,每次加上本次網頁的圖片數
if __name__ == '__main__':
    main()

接下來,逐一寫出子函數
首先寫出常用獲取頁面內容的函數(獲取 text),可作為常用函數

#獲取URL返回網頁的text,圖片的信息存在content中
def getHTMLText(url):
    try:
        r = requests.get(url) #request get命令
        r.raise_for_status() 
        r.encoding = r.apparent_encoding 
        return r.text
    except:
        return ""

獲取首頁頁碼值

def get_page(url):
    html = getHTMLText(url) #獲取網頁內容
    page = re.search(r'page-[0-9]{3}#', html).group() #找出含有本頁網址的那一段字符串
    page_number = re.search(r'[0-9]{3}', page).group() #從這一段字符串提取出頁碼
    return page_number #返回頁碼

獲取網頁的所有圖片地址

def find_images(url):
    html = getHTMLText(url) #獲取網頁內容
    img_src1 = [] 
    img_src0 = re.findall(r'<img\ssrc=\".*?(?:\.jpg|\.png|\.gif)', html) #獲取該頁面所有包含圖片源地址的字符串
    for img_src in img_src0:
        img_src1.append(img_src[10:])  #獲取該頁面所有圖片地址
    return img_src1

保存圖片

def save_imgs(num, img_addrs):
    for img_addr in img_addrs: #圖片網址循環
        num += 1 #每次加1 實現編碼
        filename = str(num) + '.' + img_addr.split('.')[-1]  #圖片名稱,img_addr.split('.')[-1]是用于獲取jpg,png,gif等格式,例如,名稱為1.jpg
        img = requests.get('http:{}'.format(img_addr)).content #獲取圖片網址的內容,以二進制內容保存圖片內容
        with open(filename, 'wb') as f:  
            f.write(img)

3 問題:

編寫過程中,存在一個問題
正則表達式,r'<img\ssrc=\".*?(?:\.jpg|\.png|\.gif)'可以實現獲取源地址,若去掉?:改為r'<img\ssrc=\".*?(\.jpg|\.png|\.gif)',則獲取的字符串是.jpg,不包含源地址

4 總結

  1. 開始時,學習別人的代碼,自己嘗試修改,可以盡快熟悉
  2. 入門后,盡快多寫代碼,爬不同的網站
  3. 有時候,一個小錯誤,查找了半天,編程要仔細
  4. 待續。。。。。。。。。。。。。。。。。。。。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容