1. 程式人生 > >[Python爬蟲]爬蟲例項:三種方式爬取PEXELS圖片

[Python爬蟲]爬蟲例項:三種方式爬取PEXELS圖片

PEXELS:Best free stock photos in one place.
Pexels是一個提供免費高品質圖片,並且可商用的圖片網站.但是因為網站時外國的,所以連線和下載速度都略慢…
這裡只是為了講解圖片爬取和下載儲存的流程.
三種方式是指:分別指使用Lxml,BeautifulSoup,正則表示式進行爬取
注意:網站的頁面是非同步載入實現分頁,需要實現逆向工程獲得對應地址,這裡暫時不實現.

觀察

通過搜尋關鍵字japan,得到
網址 https://www.pexels.com/search/japan/ ,爬取該頁面上的所有圖片
在這裡插入圖片描述
觀察圖片對應元素
在這裡插入圖片描述
得到圖片的下載地址都是包含在

<article class="photo-item ">```
<a><img src='下載地址'></a>
<a>href='下載地址'</a>
</atricle>

所以可以從第一個a中的img中取出下載地址,也能從第二個ahref中取出.
img中還有類似於data-xxx-src後面的連結用於存放更大尺寸的下載地址.

因為構造比較簡單,這裡使用第二個方式,將a中所有的下載連結存放到links即可
1.Lxml

xml_links = selector.xpath('//article/a[2]/@href'
)

2.BeautifulSoup

bs4_links = []
soup = BeautifulSoup(res.text, "html.parser")
links = soup.select('article > a')
for link in links:
    bs4_links.append(link.get('href'))

3.正則表示式

re_links=re.findall('<a href=\"(.*)\" download>',res.text)

三者對比

1.資料完整性

>>>	len(xml_links)
>>> len(bs4_links) >>> len(re_links) 15 15 15

沒問題,都獲取了15張圖片的下載地址
2.選取元素
Lxml通過xpath語法進入article內的第二個a,獲取href
正則表示式通過搜尋第二個a中的href直接獲取
BeatifulSoup通過selector進入articlea,然後選取href

爬蟲程式碼

import requests
from lxml import etree
import re
import time
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36'
}
url = 'https://www.pexels.com/search/japan/'

if __name__ == '__main__':
    res = requests.get(url, headers)
    selector = etree.HTML(res.text)
    xml_links = selector.xpath('//article/a[2]/@href')  # lxml
    bs4_links = []
    soup = BeautifulSoup(res.text, "html.parser")
    links = soup.select('article > a ')
    for link in links:
        bs4_links.append(link.get('href'))  # bs4
    re_links = re.findall('<a href=\"(.*)\" download>', res.text)  # re
    for link in links:
        pic = requests.get(link, headers)
        pic_name = re.search('(?<=&dl=).*\.jpg', link).group()
        with open('d:/1/' + pic_name, 'wb') as pf:
            pf.write(pic.content) #以二進位制流方式寫入檔案
        print("完成圖片下載:" + pic_name)
        time.sleep(1)  # 緩衝

輸出結果

在這裡插入圖片描述
在這裡插入圖片描述