目录
一、需求分析
二、案例
1、斗图拉
①验证获取到的响应信息
②获取图片地址
③下载图片
④保存到文件中
⑤项目源码
2、XX荣耀英雄皮肤
①需求
②详情页链接获取
③检验详情页响应数据
④保存到文件
⑤源码
三、总结
一、需求分析
通过两个案例分析比较并对爬虫的整体步骤及方法的小总结
二、案例
1、斗图拉
①验证获取到的响应信息
①验证获取到的响应信息
在之前的文章中提到过,有两种方式
一种是通过获取网页的步骤得到返回的信息,然后检查信息是否是想要的信息(不建议),当数据复杂时此方法不仅耗时而且其结果并不明显;
另一种就是通过浏览器自带的抓包工具(也就是右键的检查),通过抓包得到的响应数据去验证其页面的信息是否符合
②获取图片地址
通过抓包工具中找到了图片地址所在的标签,然后再通过寻找规律去用xpath去获得其表达式(前提条件是通过爬虫得到的数据就是此数据,如果爬取到的数据不是此数据,那么其表达式就是无效的)
仔细对比发现,元素中的图片地址存储在img标签下的src中,但是响应的图片地址的数据在img的original,此时就出现了差别,这时就要以爬取到的响应信息为主;此时的xpath插件就失效了,因为它所查找的是元素里面的信息,而得到的是响应的数据,会有偏差;
③下载图片
获取图片的地址只是第一步,目的是为了图片;得到的图片地址并不是完整的,需要对其进行拼接,拼接之后才能作为url去重新获取其图片的信息;
④保存到文件中
根据得到的图片地址,以及图片名称将图片存储到文件中
⑤项目源码
# -*- coding: utf-8 -*-
from lxml import etree
import requests
import os
if __name__ == '__main__':
if not os.path.exists('./doutu'):
os.mkdir('./doutu')
url = 'https://dou.yuanmazg.com/doutu?page=1'
headers = {
'User-Agent': 'Mozilla /5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).content
tree = etree.HTML(page_text)
all = tree.xpath('//div[@]/a')
for i in all[1:]:
img_url = 'https://dou.yuanmazg.com/' + i.xpath('./img/@data-original')[0]
name = i.xpath('./img/@alt')[0] + '.jpg'
if img_url.endswith('.jpg'):#获取图片为.jpg的不要gif的
img_data = requests.get(url=img_url,headers=headers).content
img_path = 'doutu/'+ name
with open(img_path,'wb') as fp:
fp.write(img_data)
print(name,'下载成功')
2、XX荣耀英雄皮肤
①需求
从全部英雄页开始,得到英雄的图片
②详情页链接获取
通过观察发现,每个详情页链接只有细微的差别,也就是一个编号的差距;
通过对响应的数据的判断,我们想要的数据并不在其中,所以还需要继续查找所需要的编号
最后在一个json文件中找到了想要的数据(提示:很多的网页的图片加载都不是直接写在网页源码中的,而是通过动态加载的方式来呈现的,而动态加载就要在XHR中去寻找了)
③检验详情页响应数据
通过对比发现,页面源码和请求到的页面信息并不一致,所以此时用XPATH并不能得到想要的效果(大多数情况返回的是空值)
通过比较两张图的信息,以及验证图片地址,发现其URL是有规律的,得到URL之后就可以得到其图片数据了
④保存到文件
因为图片保存的是英雄的皮肤信息,每个英雄会有多个皮肤,所以要分别对每个英雄建立一个文件夹,然后将皮肤信息保存到其中
⑤源码
# -*- coding: utf-8 -*-
from lxml import etree
import requests
import os
if __name__ == '__main__':
if not os.path.exists('./wangzhe'):#判断文件是否存在
os.mkdir('./wangzhe')
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/101.0.4951.67 Safari/537.36'
}
page_list = requests.get(url=url,headers=headers).json()#得到JSON数据
for page in page_list:
url = 'https://pvp.qq.com/web201605/herodetail/' + str(page['ename']) +'.shtml'#得到详情页的URL
url_page = requests.get(url=url,headers=headers).content
tree = etree.HTML(url_page)
num = tree.xpath('//div[@]//ul/@data-imgname')[0]
a = str(num).split('|')
names = tree.xpath('//div[@]//h2/text()')[0]
file_path = './wangzhe/' + names
if not os.path.exists(file_path):#创建每个英雄的文件夹
os.mkdir(file_path)
for index,j in enumerate(a):
url = 'https://game.gtimg.cn/images/yxzj/img201606/heroimg/'+ str(page['ename'])+'/'+str(page['ename'])+'-smallskin-'+str(index+1)+'.jpg'#拼接图片的URL
img_data = requests.get(url=url,headers=headers).content
name = j.split('&')[0] +'.jpg'
img_path = file_path + '/'+name
with open(img_path, 'wb') as fp:#保存到对应的文件中
fp.write(img_data)
print(name, '爬取完成')
三、总结
①首先根据想要的内容去寻找到对应的URL(有可能是动态加载的)
②检查响应页面的数据与页面源码是否一致(数据解析时很关键,特别是使用xpath时)
③仔细观察,寻找其中的规律,然后得到想要的结果



