[Python爬蟲]爬蟲例項:三種方式爬取PEXELS圖片
阿新 • • 發佈:2018-11-16
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
中取出下載地址,也能從第二個a
的href
中取出.
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
進入article
的a
,然後選取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) # 緩衝
輸出結果