Python《爬蟲初實踐》

星海千尋發表於2020-12-11

今天轉轉悠悠,突然不知道該學些什麼,偶然的一瞬間腦子裡想到了爬蟲,這個我很早就瞭解的技術,我卻沒有親自實踐過,於是這次想好好地去了解下,學習下簡單的使用方法,畢竟自以後的深度學習中也是有用處的,爬取圖片來做資料來源。

一:簡單入手
網路的上的圖片都有所在伺服器URL。
我們首先得獲得一個可以發起HTTP請求的辦法,我們使用requests包的方法。
做個簡單的實驗,把www.baidu.com的首頁HTML請求下來。

import requests   #匯入模組

def run():        #宣告一個run方法
    response = requests.get("http://www.baidu.com")
    print(response.text)

if __name__ == "__main__":   #主程式入口
    run()    #呼叫上面的run方法

發現是可以的。
在這裡插入圖片描述

然後我們去一個圖片網站上去爬取一些圖片下來,剛剛我們是爬取HTML,現在我們嘗試爬取圖片

import requests   #匯入模組

def run2():
    response = requests.get("http://wx3.sinaimg.cn/large/0076BSS5ly1gliowcgks1j30u0112wjn.jpg")
    with open("D:/estimages/mn.jpg", "wb") as f :
        f.write(response.content)
        f.close

if __name__ == "__main__":   #主程式入口
    run2()    #呼叫上面的run方法

圖片也是順利下載了,我們看一看
在這裡插入圖片描述

二:實戰操作
我們今天要爬取的是網站http://jandan.net/ooxx,這裡有很多評論內容,每個評論下都是有一張圖片的,而且評論內容很多,都有分頁了,有分頁也不怕,因為分頁的內容都是一樣的,我們來細看。

網頁內容有分頁
在這裡插入圖片描述

檢查原始碼如下:
在這裡插入圖片描述

也就是如果我們想跳到下一頁面,只需要把這個“下一頁”的< a>的herf連結值得到,重新使用request請求一下這個連結值就能調到下一頁面,迴圈執行的話,就能不斷根據連線進行爬取。

經過觀察,每個下一頁的< a>標籤都屬於一個previous-comment-page的calss,這個很重要,能方便BeautifulSoup直接能獲取該元素。

每個頁面分頁欄下面接著就是一個大的評論區,每個評論都是有一張圖片,很規律。
在這裡插入圖片描述

檢查原始碼如下:
在這裡插入圖片描述

可以看出來這是一個comment列表,每一個comment都有一個ID。
我們需要進去每一個ID去看看圖片的位置和內容,如下:
在這裡插入圖片描述

經過觀察,每個圖片的src url值和【檢視原圖】的herf url值是一樣的,【檢視原圖】的< a>值都是屬於一個view-img-link的calss,這個很重要,能方便BeautifulSoup直接能獲取該元素。

BeautifulSoup是一個方便能直接訪問HTML元素的包。
配合上requests就能實現一個簡單的圖片爬取功能了。

完整原始碼如下:
直接上程式碼學習BeautifulSoup和request的用法吧。

import os
import requests
from bs4 import BeautifulSoup

class Config:
    page_num = 3
    save_dir = 'D:\estimages'

opt = Config()

if not os.path.exists(opt.save_dir):
    os.mkdir(opt.save_dir)

# 設定URL的請求頭
headers = {'referer': 'http://jandan.net/',
           'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0'}

# 這是一個集合,不能重複,也就是不能重複設定
image_cache = set()
index = len(image_cache)

# 儲存圖片
def save_all_images(html, idx):
    global index
    for link in html.find_all('a', {'class': 'view_img_link'}):
        href = link.get('href')
        if href not in image_cache:
            print("image: http:" + href)

            with open(
                    '{}/{}'.format(opt.save_dir, href.split("/")[-1]), 'wb') as jpg:  # 請求圖片並寫進去到本地檔案
                jpg.write(requests.get("http:" + href).content)

            image_cache.add(href)
            print("正在抓取第%s條資料" % index)
            index += 1

def findAnotherPage(html):
    ahref = html.find('a', {'class': 'previous-comment-page'})  # 找到導航條的位置,獲得下一個連線網頁的位置
    if ahref is None:
        print('no more page')
        exit(0)
    else:
        url = "http:" + ahref.get('href')
        print("next page: " + url)
        return url

if __name__ == '__main__':
    url = 'http://jandan.net/ooxx'
    for i in range(0, opt.page_num):
        html = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser")
        save_all_images(html, i)
        url = findAnotherPage(html)

程式碼步驟如下:
1:設定必要的引數,比如我們需要爬取幾個頁面,圖片在本地的儲存位置。
2:設定一個set集合,圖片不能重複,因此每下載一張圖片就記錄這個圖片的url。
3:真正下載的時候,每調到一個頁面就把該頁面的comment區域的所有圖片請求下;來。
4:根據分頁欄的下一頁面地址,調到新的頁面,重複執行第三步驟。

下載的時候我們把原始檔名完整儲存了下來,並且把url記錄在set,避免重複下載。

效果如下:
在這裡插入圖片描述
在這裡插入圖片描述

相關文章