python通过xpath解析网页爬取高清大图和王者荣耀英雄海报

您所在的位置:网站首页 怎么保存王者荣耀海报图片 python通过xpath解析网页爬取高清大图和王者荣耀英雄海报

python通过xpath解析网页爬取高清大图和王者荣耀英雄海报

#python通过xpath解析网页爬取高清大图和王者荣耀英雄海报| 来源: 网络整理| 查看: 265

python通过xpath解析网页

xpath XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的搜索。所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。 xpath官网 一、xpath表达式 xpath解析:常用且最便捷高效的一种解析方式,通用性 - xpath解析原理: - 实例化一个etree的对象,且需要将被解析的页面源码加载到该对象中 - 调用etree对象中的xpath方法结合xpath表达式实现标签的定位与捕获 - 环境安装: - pip install lxml 如何实例化一个etree对象 - 将本地的html文档中的源码数据加载到etree对象中 etree.parse(filepath) - 可以将从互联网上获取源码数据加载到该对象中 etree.HTML(‘response_text’) - xpath(‘xpath表达式’) -xpath表达式

- /表示的是根节点开始定位,表示的是一个层级 - // 表示的是多个层级,可以表示为任意位置开始定位 - 属性定位,//div[@class="test"] # 表示获取任意位置的div标签,且calss属性值等于test的 - 索引定位, //div[@class="test"]/p[3] # 表示任意位置开始匹配div标签calss属性等于test的,然后再获取div标签下的p标签中的第三个 - 取文本: - /text() # 获取的是标签中直系的文本内容 - //text() # 获取的是非直系的文本内容(所有的文本内容) - 取属性: /@属性名 如: '/html//link/@href' # 获取的为html标签下的所有的link标签中的href的属性值,返回为列表 tree = etree.parse('xs1.html') print(tree.xpath('/html/head/meta')) # 标签meta路径,路径类似于linux的文件路径/为根目录,html为标签 print(tree.xpath('/html//meta')) # 标签的路径,同上 print(tree.xpath('//meta')) # 标签的路径,同上 print(tree.xpath('//meta[@name="description"]')) # 属性值定位 print(tree.xpath('//meta[3]')) # 索引定位,索引是从1开始的 print(tree.xpath('//meta[last()]')) # 索引定位,第一个 print(tree.xpath('//meta[position() < 3]')) # 索引定位,前两个 print(tree.xpath('//meta[position() - 2]')) # 索引定位,最后两个 print(tree.xpath('/html/text()')) # 获取路径下当前的文本数据 print(tree.xpath('/html//text()')) # 获取当前路径下的所有文本数据 print(tree.xpath('/html//link/@href')) # 获取html标签下的所有的link标签的href属性的值 print(tree.xpath('//div[@class="post_body"]/p[not(contains(@class,"f_center"))]') # p标签的class属性值不等于f_center,不等于可以使用not(contains(@属性名,"属性值"))

二、获取示例html文件 以彼岸网图为例 url为https://pic.netbian.com/4kmeinv/ 获取网页源代码脚本示例

# encoding: utf-8 import requests def get_html(url, file_path): headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36" } response = requests.get(url=url, headers=headers) if response.status_code == 200: with open(file_path, 'a', encoding='utf-8') as f: f.write(response.text) f.close() print("网页保存成功!!!") return response.text else: print("获取网页失败!!!") return None if __name__ == '__main__': url = "https://pic.netbian.com/4kmeinv/" file_path = 'bian.html' get_html(url, file_path )

三、通过xpath解析html网页源码

得到网页源码bian.html,由于源码较多不展示,可以直接通过浏览的开发者工具查看。 在这里插入图片描述

可以看到图片对应的为class="clearfix"的ul标签下>li标签下>a标签下>img标签的src属性的值,src的值就是图片的url,可以看到一个li标签就是一张图片,索引我们将所有的li标签取出再解析,即可获取前端页面展示的所有图片的url

xpath的表达式为:

'//ul[@class="clearfix"]/li' # encoding: utf-8 import requests from lxml import etree import os headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36" } def get_html(url): response = requests.get(url=url, headers=headers) if response.status_code == 200: with open('bian.html', 'a', encoding='utf-8') as f: f.write(response.text) f.close() print("网页保存成功!!!") return response.text else: print("获取网页失败!!!") return None def get_img(url, name): """ 下载图片函数,传参为图片url,图片路径 """ if os.path.exists("./imgs"): os.mkdir('./imgs') response = requests.get(url, headers=headers).content file_path = '../imgs/' + name # print(file_path) with open(file_path, 'wb') as f: f.write(response) f.close() print("图片:{}下载完成".format(name)) if __name__ == '__main__': url = "https://pic.netbian.com/4kmeinv/" response = get_html(url) if response != None: tree = etree.HTML(response) # 创建一个xpath网页对象 jpgurl_list = tree.xpath('//ul[@class="clearfix"]/li') # 通过xpath解析网页源码获取到所有包含图片url的li标签,返回的为列表 # print(jpgurl_list) for li in jpgurl_list: # 通过for循环取出列表中每个li标签 url = "https://pic.netbian.com" + li.xpath('./a/img/@src')[0] # 通过xpath表达式取出图片的url,讲图片的url进行拼接 img_name = str(li.xpath('./a/img/@src')[0]).split('/')[-1] # 定义图片的名字,使用url中的图片名 get_img(url, img_name)

爬取王者荣耀所有英雄海报

# encoding: utf-8 # data: 2021-06-08 # author: HermanTang import requests from lxml import etree import agent_headers import random import re import os headers = { "user-agen": random.choice(agent_headers.USER_AGENTS) } sesscon = requests.Session() def get_html(url): response = sesscon.get(url, headers=headers,data={}) if response.status_code == 200: return response else: print("Error: get html failed") def analy_qq_html(): _url = "https://pvp.qq.com/web201605/herolist.shtml" # 王者荣耀官网首页 response = get_html(_url) tree = etree.HTML(response.content) url_dict = {} img_url_list = tree.xpath('//ul[@class="herolist clearfix"]/li/a/@href') # 获取到所有英雄详情界面的url for url in img_url_list: # 通过循环取出每个英雄的名字与url进行拼接,得到字典{"英雄名": "详情页url"} url_dict[tree.xpath('//ul[@class="herolist clearfix"]/li/a[@href="{}"]/text()'.format(url))[0]] = "https://pvp.qq.com/web201605/" + url hero_name = url_dict.keys() if os.path.exists("../imgs") == False: # 创建存放图片的imgs目录,首先判断文件是否存在,不存在则创建 os.mkdir('../imgs') for name in hero_name: # 遍历出每个英雄以及对应的url hero_url = url_dict[name] hero_response = get_html(hero_url) # 获取英雄详情页url hero_tree = etree.HTML(hero_response.content) # 创建一个xpath对象 hero_img_url = hero_tree.xpath('//div[@class="zk-con1 zk-con"]/@style')[0] # 解析出详情页中的海报的url h_url = "http:" + re.match(r'background:url\(\'(.*)\'\)(.*)', hero_img_url).group(1) # 再通过正则匹配到海报url file_path = '../imgs/' + name + ".jpg" # 定义影响图片的名字,这里表示上一个目录下imgs目录下 img_response = get_html(h_url).content # 再通过海报url获取到海报的图片 count = 1 with open(file_path, 'wb') as f: # 将海报图片写入保存到本地 f.write(img_response) f.close() print("第{}张图片:{}.jpg下载完成".format(count, name)) count +=1 if __name__ == '__main__': analy_qq_html()

依赖的agent_headers.py文件

""" 请求伪装头与代理ip的设置 """ USER_AGENTS = [ "Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1", "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11", "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)", "Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50", "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0", "Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)", "Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1", "Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3", "Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12 " ] #IP地址列表,用于设置IP代理 IP_AGENTS = [ "http://58.240.53.196:8080", "http://219.135.99.185:8088", "http://117.127.0.198:8080", "http://58.240.53.194:8080" ]

效果图 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3