本文同步發(fā)表于我的微信公眾號(hào)晓避,掃一掃文章底部的二維碼或在微信搜索 極客導(dǎo)航 即可關(guān)注,每個(gè)工作日都有文章更新只壳。
一俏拱、概況
我們終于把Request網(wǎng)絡(luò)請(qǐng)求庫(kù)和Xpath解析庫(kù)的基本用法學(xué)的差不多了,終于可以爬一些自己想爬的網(wǎng)站了吼句。那我們拿什么網(wǎng)站做入門(mén)案例呢锅必?好像刷圖表情挺火的,那么從爬取表情的網(wǎng)站入手惕艳,爬取我們自己想要的表情搞隐,做一個(gè)刷圖達(dá)人驹愚。我想讓我的硬盤(pán)這樣:
因?yàn)槲姨脒M(jìn)步了。
二尔许、分析
我們爬取一個(gè)叫斗圖啦(https://www.doutula.com/photo/list/)的網(wǎng)站么鹤,來(lái)爬取他們的最新表情。
URL分析
因?yàn)楸砬橛泻芏辔独龋W(wǎng)站都會(huì)做分頁(yè)處理蒸甜,首先我們先分析出URL地址的變化,就是下面這個(gè)樣子:
第一頁(yè):https://www.doutula.com/photo/list/?page=1
第二頁(yè):https://www.doutula.com/photo/list/?page=2
第三頁(yè):https://www.doutula.com/photo/list/?page=3-
表情圖片地址提取分析
通過(guò)查看瀏覽器源代碼余佛,我們大概發(fā)現(xiàn)了圖片所在的標(biāo)簽以及圖片的地址柠新。
注意:有的圖片是GIF類型,而有的圖片是JPG類型辉巡。
通過(guò)在瀏覽器Xpath插件分析恨憎,提取了下面圖片地址:
但是我們發(fā)現(xiàn)里面有些是靜態(tài)圖片資源,我們?cè)谏厦嬉部吹綀D片地址有三個(gè)郊楣,那么我們?cè)趤?lái)看看其他屬性是否能提取出網(wǎng)絡(luò)圖片地址憔恳。
通過(guò)用data-original
屬性提取,這次我們發(fā)現(xiàn)里面沒(méi)了靜態(tài)資源,都是網(wǎng)絡(luò)圖片地址净蚤,這個(gè)好像可以用钥组。
三、實(shí)現(xiàn)
下面是大概邏輯實(shí)現(xiàn):
import requests
from lxml import etree
class DouTuLaSpider():
def __init__(self):
# 默認(rèn)第一頁(yè)開(kāi)始
self.pn = 1
# 默認(rèn)URL
self.url = 'https://www.doutula.com/photo/list/?page='
# 添加請(qǐng)求頭,模擬瀏覽器
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'
}
# 發(fā)起請(qǐng)求
def loadpage(self):
# 拼接請(qǐng)求地址
req_url = self.url + str(self.pn) # https://www.doutula.com/photo/list/?page=1
# 發(fā)起請(qǐng)求
reponse = requests.get(url=req_url, headers=self.headers)
# 用UTF-8進(jìn)行編碼
content = reponse.content.decode('utf-8')
# 構(gòu)造xpath解析對(duì)象
html = etree.HTML(content)
# 先取出這個(gè)div下面的所有a標(biāo)簽
a_list = html.xpath('//div[@class="page-content text-center"]//a')
for a in a_list:
# 在從當(dāng)前的a標(biāo)簽取下面的img標(biāo)簽的data-original屬性今瀑,取返回列表的第一個(gè)值程梦。注意前面有個(gè).
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
......
第一頁(yè)所有的表情圖片地址,我們已經(jīng)全部爬取下來(lái)了橘荠,接下來(lái)就是把爬取圖片地址通過(guò)發(fā)送網(wǎng)絡(luò)請(qǐng)求下載到本地屿附,這個(gè)時(shí)候我們需要考慮兩個(gè)問(wèn)題:
- 圖片的名字怎么命名?
我們?cè)谌タ戳艘幌略创a哥童,發(fā)現(xiàn)alt
屬性的值可以當(dāng)做圖片的名字挺份,所以在爬取圖片地址的時(shí)候也需要把alt
屬性的值提取出來(lái)。 - 圖片的后綴是什么如蚜?
因?yàn)槲覀冇袌D片的網(wǎng)絡(luò)地址压恒,我們可以通過(guò)字符串截取,把圖片地址的后綴截取下來(lái)错邦。
兩個(gè)問(wèn)題實(shí)現(xiàn):
import requests
from lxml import etree
import os
class DouTuLaSpider():
def __init__(self):
# 默認(rèn)第一頁(yè)開(kāi)始
self.pn = 1
# 默認(rèn)URL
self.url = 'https://www.doutula.com/photo/list/?page='
# 添加請(qǐng)求頭,模擬瀏覽器
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'
}
# 發(fā)起請(qǐng)求
def loadpage(self):
# 拼接請(qǐng)求地址
req_url = self.url + str(self.pn) # https://www.doutula.com/photo/list/?page=1
# 發(fā)起請(qǐng)求
reponse = requests.get(url=req_url, headers=self.headers)
# 用UTF-8進(jìn)行編碼
content = reponse.content.decode('utf-8')
# 構(gòu)造xpath解析對(duì)象
html = etree.HTML(content)
# 先取出這個(gè)div下面的所有a標(biāo)簽
a_list = html.xpath('//div[@class="page-content text-center"]//a')
for a in a_list:
# 在從當(dāng)前的a標(biāo)簽取下面的img標(biāo)簽的data-original屬性,取返回列表的第一個(gè)值型宙。注意前面有個(gè).
img_url = a.xpath('./img/@data-original')[0]
# 圖片名字
img_name = a.xpath('./img/@alt')[0]
print(img_url)
#下載圖片
self.loadimg(img_url, img_name)
#發(fā)起圖片請(qǐng)求
def loadimg(self, img_url, img_name):
folder = 'doutu'#本地文件夾名字
if not os.path.exists(folder):#如果文件夾不存在
os.mkdir(folder)#創(chuàng)建文件夾
# 拼接本地圖片路徑
path = folder + "/" + img_name + img_url[-4::]
# 發(fā)起圖片請(qǐng)求
reponse = requests.get(url=img_url, headers=self.headers)
# 圖片二進(jìn)制數(shù)據(jù)
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()
最終的我的本地文件夾撬呢,裝了許多我日思夜想的表情。這只是第一頁(yè)妆兑,我們需要硬盤(pán)被裝紅的那種感覺(jué)魂拦,我們要實(shí)現(xiàn)多頁(yè)爬取毛仪,先用循環(huán)代替吧~
我們?cè)诖a最下面加了一個(gè)循環(huán),把每次的數(shù)值賦值給頁(yè)碼芯勘。這樣就會(huì)不停的發(fā)送請(qǐng)求了箱靴。
if __name__ == "__main__":
dtls = DouTuLaSpider()
for i in range(1,100):#1-100頁(yè)
print('爬取第%d頁(yè)'%i)
dtls.pn = i #把每頁(yè)賦值給pn
dtls.loadpage()
不爬了,不爬了荷愕,圖片太多衡怀。我的硬盤(pán)好像有點(diǎn)裝不下了,最終我們讓媽媽不用擔(dān)心了安疗。
四抛杨、總結(jié)
我們用一個(gè)簡(jiǎn)單的例子,入門(mén)了爬蟲(chóng)荐类。爬蟲(chóng)入門(mén)相對(duì)比較簡(jiǎn)單怖现,但是在爬取的時(shí)候也許我們需要考慮的幾個(gè)點(diǎn):
- URL地址怎么變化?(動(dòng)態(tài)網(wǎng)站先不考慮)
- 提取內(nèi)容在哪里?(先用xpath大概獲取位置)
- 請(qǐng)求的網(wǎng)站源代碼跟瀏覽器里面的源代碼是否有區(qū)別(以請(qǐng)求下來(lái)的源碼為準(zhǔn))
歡迎關(guān)注我的公眾號(hào)玉罐,我們一起學(xué)習(xí)屈嗤。