import requests
from lxml import etree
獲取NBA成員信息
# 發(fā)送的地址
url = 'https://nba.hupu.com/stats/players'
# UA 偽裝 google
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
}
r = requests.get(url)
# print(r.text) # jupyter 打印可以看到格式化的html數(shù)據(jù)
# 將HTML文本解析成Element對象
e = etree.HTML(r.text)
players = e.xpath('//*[@id="data_js"]/div[4]/div/table/tbody/tr/td[2]/a/text()')
teams = e.xpath('//*[@id="data_js"]/div[4]/div/table/tbody/tr/td[3]/a/text()')
# 保存到txt文件
with open('nba.txt','w',encoding='utf-8') as f:
for player,team in zip(players,teams):
f.write(f'球員:{player} - - - 球隊:{team}\n')
球員:喬爾-恩比德 - - - 球隊:76人
球員:盧卡-東契奇 - - - 球隊:獨行俠
球員:達米安-利拉德 - - - 球隊:開拓者
批量爬取王者榮耀皮膚圖片
- 爬取一張圖片
url = 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/505/505-bigskin-7.jpg'
r = requests.get(url)
# 保存圖片
# w write b 二進制
with open('a.jpg','wb') as f:
f.write(r.content)
- 該角色有7個皮膚 爬取7個圖片
for i in range(1,8):
url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/505/505-bigskin-{i}.jpg'
r = requests.get(url)
with open(f'{i}.jpg','wb') as f:
f.write(r.content)
- 獲取這7個皮膚的名字 保存圖片
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69'
}
url = 'https://pvp.qq.com/web201605/herodetail/505.shtml'
r = requests.get(url,headers=headers)
r.encoding='gbk'
e = etree.HTML(r.text)
# e.xpath 返回一個列表 使用索引[0]變?yōu)閟tr
names = e.xpath('//ul[@class="pic-pf-list pic-pf-list3"]/@data-imgname')[0] # '鹿靈守心&0|森&0|遇見神鹿&71|時之祈愿&94|時之愿境&42|山?!け滩ㄐ?amp;109|真我赫茲&117'
# names.split('|') # split只能用于str,不能用于list # ['鹿靈守心&0', '森&0', '遇見神鹿&71', '時之祈愿&94', '時之愿境&42', '山海·碧波行&109', '真我赫茲&117']
names = [name[0:name.index('&')] for name in names.split('|')] # ['鹿靈守心', '森', '遇見神鹿', '時之祈愿', '時之愿境', '山?!け滩ㄐ?, '真我赫茲']
for i,n in enumerate(names):
url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/505/505-bigskin-{i+1}.jpg'
r = requests.get(url)
with open(f'{n}.jpg','wb') as f:
f.write(r.content)
- 獲取所有英雄皮膚
把該行網(wǎng)址復制到網(wǎng)址欄,會自動下載該文件
https://pvp.qq.com/web201605/js/herolist.json
該文件內(nèi)容如下,有英雄的各種信息
每個花括號 { } 是一個json數(shù)據(jù)
import requests
from lxml import etree
import os
from time import sleep
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69'
}
url = 'https://pvp.qq.com/web201605/js/herolist.json'
r = requests.get(url,headers=headers)
for x in r.json():
ename = x.get('ename') # 數(shù)字 url里面變化的那個數(shù)字
cname = x.get('cname') # 英雄的名字
if not os.path.exists(cname):
os.makedirs(cname)
urlone = f'https://pvp.qq.com/web201605/herodetail/{ename}.shtml'
r = requests.get(url=urlone,headers=headers)
r.encoding='gbk'
e = etree.HTML(r.text)
# e.xpath 返回一個列表 使用索引[0]變?yōu)閟tr
names = e.xpath('//ul[@class="pic-pf-list pic-pf-list3"]/@data-imgname')[0] # '鹿靈守心&0|森&0|遇見神鹿&71|時之祈愿&94|時之愿境&42|山海·碧波行&109|真我赫茲&117'
# names.split('|') # split只能用于str,不能用于list # ['鹿靈守心&0', '森&0', '遇見神鹿&71', '時之祈愿&94', '時之愿境&42', '山?!け滩ㄐ?amp;109', '真我赫茲&117']
names = [name[0:name.index('&')] for name in names.split('|')] # ['鹿靈守心', '森', '遇見神鹿', '時之祈愿', '時之愿境', '山?!け滩ㄐ?, '真我赫茲']
for i,n in enumerate(names):
url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{i+1}.jpg'
r = requests.get(url)
with open(f'{cname}/{n}.jpg','wb') as f:
f.write(r.content)
print(f'{n}已下載')
sleep(1)
部分圖片展示
xpath分析
//ul[@class=“pic-pf-list pic-pf-list3”]/@data-imgname
asd = '鹿靈守心&0'
asd.index('心') # 3 # 心在index3的位置
<generator object at 0x0000029394AFACF0> 迭代器 在最左和最右加上方括號[ ]就會變成str
os.makedirs and os.mkdir
os.makedirs和os.mkdir都是用于創(chuàng)建目錄的函數(shù),但有以下區(qū)別:
-
os.mkdir只能創(chuàng)建一級目錄,而os.makedirs可以同時創(chuàng)建多級目錄。
-
如果要創(chuàng)建的目錄已經(jīng)存在,os.mkdir會拋出FileExistsError異常,而os.makedirs不會拋出異常。
-
os.makedirs還可以通過設(shè)置exist_ok參數(shù)來控制是否拋出異常。如果exist_ok為True,表示即使目錄已經(jīng)存在也不會拋出異常,如果為False,則會拋出異常。
示例代碼:
import os
# 創(chuàng)建單級目錄
os.mkdir('dir1')
# 創(chuàng)建多級目錄
os.makedirs('dir2/subdir1/subdir2')
# 創(chuàng)建已存在的目錄
os.mkdir('dir1') # 會拋出異常
os.makedirs('dir2/subdir1/subdir2') # 不會拋出異常
# 創(chuàng)建已存在的目錄時,設(shè)置exist_ok參數(shù)
os.makedirs('dir2/subdir1/subdir2', exist_ok=True) # 不會拋出異常
os.makedirs('dir2/subdir1/subdir2', exist_ok=False) # 會拋出異常
xpath工具
# 將HTML文檔加載進來
html = etree.parse('demo.html')
# 將HTML文檔解析成Element對象
root = html.getroot()
Python爬蟲中,使用xpath提取HTML或XML文檔中的元素是非常常見的操作。下面是etree庫中xpath常用的方法:
-
xpath()
:在文檔中使用xpath表達式進行查找,返回匹配的元素列表。 -
find()
:在文檔中查找匹配xpath表達式的第一個元素,返回元素對象。 -
findall()
:在文檔中查找匹配xpath表達式的所有元素,返回元素對象列表。 -
text
屬性:獲取元素的文本內(nèi)容。 -
attrib
屬性:獲取元素的屬性。 -
get()
方法:獲取指定屬性的值。 -
iter()
方法:獲取文檔中所有匹配xpath表達式的元素,返回迭代器對象。 -
Element()
方法:創(chuàng)建一個新的元素對象。 -
SubElement()
方法:在指定元素下創(chuàng)建一個新的子元素。 -
ElementTree()
方法:創(chuàng)建一個新的XML文檔樹對象。文章來源:http://www.zghlxwxcb.cn/news/detail-698312.html
以上這些方法是在使用xpath提取HTML或XML文檔中的元素時經(jīng)常使用的方法,掌握了這些方法,就可以方便地對文檔進行操作了。文章來源地址http://www.zghlxwxcb.cn/news/detail-698312.html
到了這里,關(guān)于python-爬蟲-xpath方法-批量爬取王者皮膚圖片的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!