獲取網(wǎng)站表情包
運(yùn)行環(huán)境:
#環(huán)境:win10
import requests #發(fā)送請(qǐng)求
from lxml import etree #獲取html主頁樹狀代碼
import os #創(chuàng)建本地文件夾用來存儲(chǔ)圖片
1.分析:
目標(biāo)網(wǎng)址:https://www.runoob.com/
首先想要獲取什么就從哪里入手,打開圖所在的網(wǎng)頁,F(xiàn)12查看代碼的內(nèi)容,此處抓取的是資源文件,爬取中發(fā)現(xiàn)ajax類型的文件加載出來的無法知道圖片的源地址所以暫時(shí)不能用這種方式獲取。因此可以生成第一步的代碼。
import request
url = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {
"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
res = requests.get(url =url ,headers = headers) #獲取了該頁面的內(nèi)容
2.篩選:
獲取的內(nèi)容是整個(gè)網(wǎng)頁的內(nèi)容,我們需要篩選出我們需要的東西,這個(gè)地方使用到了知識(shí)點(diǎn)“xpath”
,我們通過HTML的代碼已經(jīng)知道了動(dòng)態(tài)圖所放的位置,找到最外層的標(biāo)簽class=“article-intro”,然后獲取src對(duì)應(yīng)的地址就可以了
import request
from lxml import etree
url = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {
"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
res = requests.get(url =url ,headers = headers) #獲取了該頁面的內(nèi)容
# print(res.text)
tree = etree.HTML(res.text)
# print(tree.xpath("http://*[@class='article-intro']/p/@src")) #之前經(jīng)常用這個(gè)方法,出來的往往是空
print(tree.xpath("http://div[@class='article-intro']/descendant::*/@src")) #descendant::*表示的是@class='article-intro'標(biāo)簽下面所有
3.范圍擴(kuò)大:
通過上面的設(shè)計(jì),我們已經(jīng)可以獲取當(dāng)前頁面的圖片的地址了,但是我們應(yīng)該可以從下面知道這里是有很多頁的,這個(gè)地方我知道兩種方法,一種就是讀取下一頁標(biāo)簽,結(jié)束的時(shí)候標(biāo)簽已經(jīng)是消失的狀態(tài),以此來獲取下一頁的跳轉(zhuǎn)地址。另外一種就是我這次用的目測法,我直接是對(duì)比了幾個(gè)頁面的區(qū)別,就發(fā)現(xiàn)了頁面中數(shù)字參數(shù)就是控制不同頁面的。
import request
from lxml import etree
url = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {
"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
for j in range(22,28):
url = f"https://www.runoob.com/w3cnote/programmer-joke-{j}.html"
res = requests.get(url =url ,headers = headers) #獲取了該頁面的內(nèi)容
# print(res.text)
tree = etree.HTML(res.text)
# print(tree.xpath("http://*[@class='article-intro']/p/@src")) #之前經(jīng)常用這個(gè)方法,出來的往往是空
print(tree.xpath("http://div[@class='article-intro']/descendant::*/@src"))
4.存儲(chǔ):
我們已經(jīng)獲取了每個(gè)頁面的每一條圖片的鏈接,這個(gè)時(shí)候我們就可以進(jìn)行圖片的存儲(chǔ),無論是圖片還是視頻這一類的數(shù)據(jù)都需要通過二進(jìn)制的形式進(jìn)行存儲(chǔ),所以寫入的時(shí)候通常是response.content,這個(gè)地方我是首先創(chuàng)建了一個(gè)文件夾,然后在此路徑下寫入圖片的數(shù)據(jù),因?yàn)榫W(wǎng)站中獲取src相關(guān)的鏈接有些許不同,所以我在設(shè)計(jì)的時(shí)候也調(diào)整了一下我的代碼設(shè)計(jì)。文章來源:http://www.zghlxwxcb.cn/news/detail-428296.html
import requests
from lxml import etree
import os
url = "https://www.runoob.com/w3cnote/programmer-joke-22.html"
headers = {
"User-Agent" :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
if not os.path.exists('images'):
os.makedirs('images')
http = "https:"
for j in range(22,28):
url = f"https://www.runoob.com/w3cnote/programmer-joke-{j}.html"
res = requests.get(url =url ,headers = headers)
# print(res.text)
tree = etree.HTML(res.text)
# print(tree.xpath("http://*[@class='article-intro']/p/@src")) #之前經(jīng)常用這個(gè)方法,出來的往往是空
print(tree.xpath("http://div[@class='article-intro']/descendant::*/@src"))
for i in tree.xpath("http://div[@class='article-intro']/descendant::*/@src"):
try:
if "https" in i:
x = i.split("/")
print(x[-1])
res = requests.get(url=i, headers=headers)
with open(f"images/{x[-1]}","wb") as f:
f.write(res.content)
elif "http://" in i :
x = i.split("/")
y = x[-1]
y = y.replace('"',"")
print(x[-1])
res = requests.get(url=(http + i), headers=headers)
with open(f"images/{y}", "wb") as s:
s.write(res.content)
else:
continue
except:
print("跳過一個(gè)異常")
結(jié)語:
至此就實(shí)現(xiàn)了對(duì)于圖片的一個(gè)獲取,這種圖片或者文字都是比較好獲取的,通過這個(gè)方法也可以輕易的獲取某些網(wǎng)站的頭條熱點(diǎn)的文字和鏈接,也可以用scrapy框架來進(jìn)行爬取,一般情況下我是習(xí)慣先用基礎(chǔ)代碼捋清思路然后再用框架實(shí)現(xiàn)爬取的過程。學(xué)習(xí)過程中也是發(fā)現(xiàn),部分內(nèi)容無法通過request的返回值來爬取的,因?yàn)檫@些數(shù)據(jù)是動(dòng)態(tài)的,雖然可以在F12中看到他們的存在。這種通過ajax生成的內(nèi)容我們可能需要使用selenium來進(jìn)行爬取,當(dāng)然selenium的劣勢就是無法在服務(wù)器進(jìn)行部署,只能在有網(wǎng)頁實(shí)體中獲取對(duì)應(yīng)的內(nèi)容。文章來源地址http://www.zghlxwxcb.cn/news/detail-428296.html
到了這里,關(guān)于《python爬蟲練習(xí)2》爬取網(wǎng)站表情包的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!