python爬虫
爬虫广泛应用于各个领域,如搜索引擎索引网页、新闻聚合网站抓取新闻内容、价格比较网站获取商品信息等。它们可以帮助我们自动化获取大量的数据,并且可以在短时间内完成大量的工作。爬虫可以通过获取网页的源代码,解析其中的信息,并提取所需的数据。它们模拟了人类用户在网页上的行为,自动访问链接、点击按钮、填写表单等操作,以便能够收集需要的数据cname=h.get('cname')遍历json对象中的每个元素,
前言
爬虫广泛应用于各个领域,如搜索引擎索引网页、新闻聚合网站抓取新闻内容、价格比较网站获取商品信息等。它们可以帮助我们自动化获取大量的数据,并且可以在短时间内完成大量的工作。爬虫可以通过获取网页的源代码,解析其中的信息,并提取所需的数据。它们模拟了人类用户在网页上的行为,自动访问链接、点击按钮、填写表单等操作,以便能够收集需要的数据
一、etree.HTML()和.json()分别是什么?
新学到的有.json(),它是用于解析JSON格式数据的方法,JSON(javaScript Object Nation)是一种常用的数据交换格式,用于存储和传输结构化的数据。在python中,使用requests库发送HTTP请求并获取响应后,使用.json()方法将响应的JSON数据解析为python对象。
类似于etree.HTML()函数将HTML字符串解析为一个可操作的树形结构,以便进一步处理和提取数据
但是,在这段代码中,etree.HTML(hero_info_resp.text),这里hero_info_resp作为一个响应对象。它包含了虚许多与HTTP响应相关的信息,如状态码,头部信息和响应内容,为了获取响应内容,使用.text属性
二、步骤
1.请求英雄列表
代码如下(示例):
hero_list_url='https://pvp.qq.com/web201605/js/herolist.json'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203'
}
hero_list_resp=requests.get(hero_list_url,headers=headers)
for h in hero_list_resp.json():
ename=h.get('ename')
cname=h.get('cname')
2.请求单个英雄皮肤数据并保存在文件夹中
代码如下(示例):
if not os.path.exists(cname):
os.makedirs(cname)
hero_info_url='https://pvp.qq.com/web201605/herodetail/194.shtml'
hero_info_resp=requests.get(hero_info_url,headers=headers)
hero_info_resp.encoding='gbk'
e=etree.HTML(hero_info_resp.text)
names=e.xpath('//ul[@class="pic-pf-list pic-pf-list3"]/@data-imgname')[0]
names=[name[0:name.index('&')] for name in names.split('|')]
for i,n in enumerate(names):
resp=requests.get(f'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{i+1}.jpg')
with open(f'{cname}/{n}.jpg','wb') as f:
f.write(resp.content)
print(f'已经下载{n}的皮肤')
sleep(1)
以下是代码展示
运行结果
在左边栏目录会出现每个英雄皮肤名字的文件夹
点开每个文件夹就能看到每个英雄的皮肤图片了
总结
for h in hero_list_resp.json():
ename=h.get('ename')
cname=h.get('cname')遍历json对象中的每个元素,将每个元素赋值给变量h,通过调用字典对象的.get()方法获取键对应的值。
if not os.path.exists(cname):
os.makedirs(cname)
段是用来检查当前目录下是否存在一个名为cname的文件或文件夹,如果不存在会返回False,则继续往下执行代码,并创建名字为cname的文件夹。
在请求单个英雄皮肤响应时出现乱码情况,将响应对象编码方式设置为国标码gbk,中国国标码
names=e.xpath('//ul[@class="pic-pf-list pic-pf-list3"]/@data-imgname')[0],用xpath从已经解析的HTML中提取属性值,这里提取的是单个英雄皮肤所有的名字。对names字符串进行拆分,对拆分后的的子字符串进行切片操作,获取每个字字符串到第一个&之间的部分,并将结果存储在名为names的列表中。
for i,n in enumerate(names):遍历names中的元素,在每次迭代时获取元素索引和值。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)