Python 爬蟲入門 (二) 使用Requests來爬取圖片

weixin_33727510發表於2017-02-24

參考資料:

  1. 論一隻爬蟲的自我修養 http://blog.fishc.com/category/python/spider
  2. Requests: 讓 HTTP 服務人類 http://docs.python-requests.org/zh_CN/latest/

Requests庫使用方法與urrlib用法較為類似,但更為簡單,下面使用requests來進行圖片的抓取.

1. 先寫出主函式的程式碼
import requests
import os
import re

def download_mm(folder='mmImages', pages=10):
      """
     下載十個頁面的圖片,並將其儲存進folder目錄
      """
     
      #建立儲存圖片的資料夾
      os.mkdir('folder')
      os.chdir('folder')
      #下載圖片頁面初始地址
      url = 'http://jandan.net/ooxx/'
      #圖片頁面地址全名為http://jandan.net/ooxx/page-2364#comments,可看出圖片地址為'url'+'頁面數'+ '#comments',先定義一個函式get_page(url)來獲取page_num
      page_num = int(get_page(url))

      #有了圖片所在頁面的全名地址就可以爬取圖片的源地址了,這裡我們僅下載十個頁面的圖片
      for i in range(pages):
        page_num -= i
        #獲得十個網頁的圖片地址,進入頁面時我們處於最新頁面,因此最終得到的是此頁以及前九頁的地址
        page_url = url+'page-'+str(page_num)+'#comments'
        #獲得多個圖片網址後還需獲得每一個圖片的源地址才能下載到每一張圖片,此處定義一個函式find_images來獲取每張圖片源地址
        img_addrs = find_images(page_url)
        #從每張圖片源地址下載圖片到folder資料夾
        save_imgs(folder, img_addrs)     
2. 編寫在主函式中需要用到的功能函式的程式碼

(1)先在url = 'http://jandan.net/ooxx/' 頁面爬出最新頁面數(即page_num)

def get_page(url):
    """
    返回單前網頁page數,也即url = 'http://jandan.net/ooxx/'的page數
    """
    #爬取html頁面內容
    html= url_open(url).text
    #找出含有本頁網址的那一段字串
    page=re.search(r'>\[[0-9]{4}\]<',html).group()
    #從這一段字串提取出頁面數
    page_number=re.search(r'[0-9]{4}',page).group()
    
    return page_number

(2)主函式中利用for迴圈拼接出十個頁面的url,然後利用find_images函式找出每一個頁面的的每一張圖片的源地址

def find_images(url):
    """
    找到圖片的源地址
    """
    #爬取當前html頁面內容
    html=url_open(url).text
    #找出包含圖片源地址的這一段字串
    img_src0=re.findall(r'<img\ssrc=.{,80}.[jpg|png|gif]',html)
    #從包含圖片源地址的這一段字串中提取圖片的源地址
    img_src1=[img_src[10:] for img_src in img_src0]

    return img_src1

(3)找出圖片源地址後利用再去下載圖片

def save_imgs(folder, img_addrs):
    """
    儲存圖片
    """
    for img_addr in img_addrs:
        #將圖片地址的倒數第二個字串作為圖片名
        filename=img_addr.split('/')[-1]
        #以二進位制的方式(content而非text)儲存圖片源地址內容
        img=url_open('http:{}'.format(img_addr)).content
        with open(filename,'wb') as f:
            f.write(img)

(4)由於開啟網頁這一步被反覆用到,因此可編寫一個函式直接呼叫即可

def url_open(url):
    """
    爬取網頁
    """
    headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
    req = requests.get(url,headers=headers)
    return req 

3.總結

(1)在這個爬蟲程式中我們想要爬取多個頁面內容,因此需要找出這些頁面地址的關聯,否則只能一個個輸入地址來爬取,因此一開始我們需要先爬取第一個頁面對其html內容進行分析,找出page_num.
(2)找出規律後利用一個簡單的迴圈便可以爬取多個頁面.
(3)對於每一個含有多個圖片的頁面,需要分析爬取每一張圖片的地址才能進行下載
(4)爬取到圖片源地址後便可以進行下載(爬取網頁並以二進位制方式儲存)
(5)編寫程式碼的過程中應儘量使得每一個函式僅執行一個功能,如此既方便呼叫出錯時也方便除錯查詢bug.

4. 利用requests實現Python爬蟲入門 (一)中以urllib編寫的 互動式有道翻譯請求:
import requests
import json

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/'

data = dict()
data = dict()
data['type'] = 'AUTO'
data['i'] = input("Plz input what you want to translate: ")
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'

r = requests.post(url, data=data)
trans_response = r.json()['translateResult'][0][0]['tgt']
print('翻譯結果: ', trans_response)

相關文章