本文同步發表於個人微信公衆號,掃一掃文章底部的二維碼或在微信搜索 極客導航 便可關注,每一個工做日都有文章更新。html
咱們終於把Request網絡請求庫和Xpath解析庫的基本用法學的差很少了,終於能夠爬一些本身想爬的網站了。那咱們拿什麼網站作入門案例呢?好像刷圖表情挺火的,那麼從爬取表情的網站入手,爬取咱們本身想要的表情,作一個刷圖達人。我想讓個人硬盤這樣: python
咱們爬取一個叫鬥圖啦(https://www.doutula.com/photo/list/)的網站,來爬取他們的最新表情。 瀏覽器
URL分析 由於表情有不少,網站都會作分頁處理,首先咱們先分析出URL地址的變化,就是下面這個樣子: 第一頁:https://www.doutula.com/photo/list/?page=1 第二頁:https://www.doutula.com/photo/list/?page=2 第三頁:https://www.doutula.com/photo/list/?page=3微信
表情圖片地址提取分析網絡
經過查看瀏覽器源代碼,咱們大概發現了圖片所在的標籤以及圖片的地址。 注意:有的圖片是GIF類型,而有的圖片是JPG類型。 ide
data-original
屬性提取,此次咱們發現裏面沒了靜態資源,都是網絡圖片地址,這個好像能夠用。 下面是大概邏輯實現:學習
import requests
from lxml import etree
class DouTuLaSpider():
def __init__(self):
# 默認第一頁開始
self.pn = 1
# 默認URL
self.url = 'https://www.doutula.com/photo/list/?page='
# 添加請求頭,模擬瀏覽器
self.headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
# 發起請求
def loadpage(self):
# 拼接請求地址
req_url = self.url + str(self.pn) # https://www.doutula.com/photo/list/?page=1
# 發起請求
reponse = requests.get(url=req_url, headers=self.headers)
# 用UTF-8進行編碼
content = reponse.content.decode('utf-8')
# 構造xpath解析對象
html = etree.HTML(content)
# 先取出這個div下面的全部a標籤
a_list = html.xpath('//div[@class="page-content text-center"]//a')
for a in a_list:
# 在從當前的a標籤取下面的img標籤的data-original屬性,取返回列表的第一個值。注意前面有個.
img_url = a.xpath('./img/@data-original')[0]
print(img_url)
if __name__ == "__main__":
dtls = DouTuLaSpider()
dtls.loadpage()
#打印
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sad0axupj204t0410sj.jpg
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sad1qossg206o06ca9x.gif
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sacyw5wwj207806mmxc.jpg
https://ws1.sinaimg.cn/bmiddle/9150e4e5gy1g0sacxbehoj205d05dq2w.jpg
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sacu8fy7j20b40b40sv.jpg
https://ws1.sinaimg.cn/bmiddle/9150e4e5gy1g0sacqc75fj205i058aaz.jpg
https://ws3.sinaimg.cn/bmiddle/9150e4e5gy1g0sacso1lbj20u00tamyx.jpg
https://ws1.sinaimg.cn/bmiddle/9150e4e5gy1g0sacod9zzg206o06o40v.gif
https://ws4.sinaimg.cn/bmiddle/9150e4e5gy1g0sachx559j20zk0k0wgo.jpg
......
複製代碼
第一頁全部的表情圖片地址,咱們已經所有爬取下來了,接下來就是把爬取圖片地址經過發送網絡請求下載到本地,這個時候咱們須要考慮兩個問題:網站
alt
屬性的值能夠當作圖片的名字,因此在爬取圖片地址的時候也須要把alt
屬性的值提取出來。兩個問題實現:編碼
import requests
from lxml import etree
import os
class DouTuLaSpider():
def __init__(self):
# 默認第一頁開始
self.pn = 1
# 默認URL
self.url = 'https://www.doutula.com/photo/list/?page='
# 添加請求頭,模擬瀏覽器
self.headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
# 發起請求
def loadpage(self):
# 拼接請求地址
req_url = self.url + str(self.pn) # https://www.doutula.com/photo/list/?page=1
# 發起請求
reponse = requests.get(url=req_url, headers=self.headers)
# 用UTF-8進行編碼
content = reponse.content.decode('utf-8')
# 構造xpath解析對象
html = etree.HTML(content)
# 先取出這個div下面的全部a標籤
a_list = html.xpath('//div[@class="page-content text-center"]//a')
for a in a_list:
# 在從當前的a標籤取下面的img標籤的data-original屬性,取返回列表的第一個值。注意前面有個.
img_url = a.xpath('./img/@data-original')[0]
# 圖片名字
img_name = a.xpath('./img/@alt')[0]
print(img_url)
#下載圖片
self.loadimg(img_url, img_name)
#發起圖片請求
def loadimg(self, img_url, img_name):
folder = 'doutu'#本地文件夾名字
if not os.path.exists(folder):#若是文件夾不存在
os.mkdir(folder)#建立文件夾
# 拼接本地圖片路徑
path = folder + "/" + img_name + img_url[-4::]
# 發起圖片請求
reponse = requests.get(url=img_url, headers=self.headers)
# 圖片二進制數據
content = reponse.content
#保存圖片
self.saveimg(path,content)
#保存圖片
def saveimg(self,path,content):
with open(path,'wb') as f:
f.write(content)
if __name__ == "__main__":
dtls = DouTuLaSpider()
dtls.loadpage()
複製代碼
最終的個人本地文件夾,裝了許多我日思夜想的表情。這只是第一頁,咱們須要硬盤被裝紅的那種感受,咱們要實現多頁爬取,先用循環代替吧~ url
if __name__ == "__main__":
dtls = DouTuLaSpider()
for i in range(1,100):#1-100頁
print('爬取第%d頁'%i)
dtls.pn = i #把每頁賦值給pn
dtls.loadpage()
複製代碼
不爬了,不爬了,圖片太多。個人硬盤好像有點裝不下了,最終咱們讓媽媽不用擔憂了。
咱們用一個簡單的例子,入門了爬蟲。爬蟲入門相對比較簡單,可是在爬取的時候也許咱們須要考慮的幾個點:
歡迎關注個人公衆號,咱們一塊兒學習。