【Python】爬蟲實戰,零基礎初試爬蟲下載圖片(附原始碼和分析過程)

2021-07-25 09:00:01

前言

爬蟲,全稱網路爬蟲,就是通過技術手段從網路獲取資料的程式或者指令碼

人生苦短,我選python。本次就用python來進行實現對一個桌布網站的圖片下載

本篇文章就是直接爬蟲實戰。通過本文,帶你瞭解requests庫的基本使用,並且完成桌布網站的圖片爬取

宣告:博主攻城獅白玉的本篇博文只用於對於爬蟲技術的學習交流。如果侵犯到相關網站利益,請聯絡我刪除博文。造成不便還請見諒。希望各位同學在學習的時候不要過於頻繁的去請求。

一、requests庫介紹

Requests庫是python一個很好用的http請求庫。封裝得很好~在我們爬蟲的時候常常也會用到。

Requests的官方介紹說到,讓HTTP服務人類。有一說一,這是個非常容易使用的庫。本次咱們的爬蟲也會用到這個庫。

關於requests庫的介紹,可以看一下官方檔案

Requests: 讓 HTTP 服務人類 - Requests 2.18.1 檔案

使用前記得安裝requests庫

pip install requests

二、網站分析

進入目標網站

隨便點開一張圖,檢視它的url,http://www.netbian.com/desk/23744.htm

先留意一下這個網址,後面會用到

 回到瀏覽器,開啟F12,通過目標元素檢查工具,點選剛剛我們點過的圖片。通過它的元素我們可以知道a標籤裡的屬性值href的連結就是上面我們存取圖片的連結地址

我們在大圖的頁面,同樣用f12點選一下,找到圖片的連結地址

存取圖片連結髮現是咱們要的大圖。至此,對於網站的分析完畢。

三、任務分析

綜上所述,咱們目標網站是一個桌布圖片網站,程式設計做到的步驟如下:

  1. 存取首頁
  2. 定位到每個圖片的詳情連結
  3. 存取詳情連結
  4. 定位到圖片對應的大圖連結。下載,儲存圖片

看起來是不是很容易,開幹

四、程式設計實現

4.1 存取首頁

import requests
url = 'http://www.netbian.com/meinv/'
resp = requests.get(url)
resp.encoding = 'gbk'
#
with open('index.html', 'wb') as f:
    f.write(resp.content)

通過requests庫發起get請求,請求桌布網站的首頁。並把結果儲存在index.html檔案裡面

開啟儲存的檔案一看,我們把首頁給下載下來了。

4.2 定位元素

這裡我們通過xpath方式。這裡用到的是lxml庫。不懂lxml庫的話,參考下文

【Python】爬蟲解析利器Xpath,由淺入深快速掌握(附原始碼例子)

PS:谷歌渲染的頁面的xpath和requests請求回來的xpath會有不一樣。有時需要儲存下來進行xpath分析

對於元素進行定位。把a標籤的href值全部拿出來,而且也把對應的名稱取出來

tree = etree.HTML(resp.content)

node_list = tree.xpath('/html/body/div[2]/div[2]/div[3]/ul/li')

sub_url_list = []
for node in node_list:
    if len(node.xpath('./a/@href')) > 0:
        sub_url = node.xpath('./a/@href')[0]
    if len(node.xpath('./a/@href')) > 0:
        title = node.xpath('./a/b/text()')[0]
        sub_url_list.append((sub_url, title))

4.3 存取詳情頁

base_url = 'http://www.netbian.com/'
for sub_url, title in sub_url_list:
    s_page = base_url + sub_url
    s_resp = requests.get(s_page)
    with open('s.html', 'wb') as f:
        f.write(s_resp.content)

4.4 定點陣圖片連結並下載

img = s_tree.xpath('/html/body/div[2]/div[2]/div[3]/div/p/a/img/@src')[0]
suffix = img.split('.')[-1]
img_content = requests.get(img).content
with open(f'./image/{title}.{suffix}', 'wb') as f:
    f.write(img_content)
    f.close()

下載完效果圖

4.5 完整原始碼

import requests
from lxml import etree
import time

'''
目標網站是一個圖片網站
1.存取首頁
2.定位到每個圖片的下載連結
3.定位到每個圖片對應的大圖連結
4.下載,儲存圖片
'''

if __name__ == '__main__':
    t1 = time.time()
    url = 'http://www.netbian.com/meinv/'
    resp = requests.get(url)
    resp.encoding = 'gbk'
    with open('index.html', 'wb') as f:
        f.write(resp.content)
    tree = etree.HTML(resp.content)

    node_list = tree.xpath('/html/body/div[2]/div[2]/div[3]/ul/li')

    sub_url_list = []
    for node in node_list:
        if len(node.xpath('./a/@href')) > 0:
            sub_url = node.xpath('./a/@href')[0]
        if len(node.xpath('./a/@href')) > 0:
            title = node.xpath('./a/b/text()')[0]
            sub_url_list.append((sub_url, title))
    #
    base_url = 'http://www.netbian.com/'
    for sub_url, title in sub_url_list:
        s_page = base_url + sub_url
        s_resp = requests.get(s_page)
        s_tree = etree.HTML(s_resp.content)
        img = s_tree.xpath('/html/body/div[2]/div[2]/div[3]/div/p/a/img/@src')[0]
        suffix = img.split('.')[-1]
        img_content = requests.get(img).content
        with open(f'./image/{title}.{suffix}', 'wb') as f:
            f.write(img_content)
            f.close()
    t2 = time.time()
    print(t2-t1)

總結

媽媽再也不用擔心我的學習了。

寫在後面

如果覺得有用的話,麻煩一鍵三連支援一下攻城獅白玉並把本文分享給更多的小夥伴。你的簡單支援,我的無限創作動力