GlidedSky爬虫雪碧图-1

在这里插入图片描述
上图就是这次爬虫练习的介绍了。下面可以直接开始了,因为知道是全部都是图片拼成,我们可以直接看一下谷歌浏览器的开发者工具。

看到真的什么都没有啊,没有数字,只有一个class的属性,因为我们前提是知道是有图片组成的, 所以我们可以看下他的css的组成都是什么意思。
在这里我的想法是看css的样式,可以通过浏览器对css的操作大概看下对网页的影响。
在这里插入图片描述
邮编可以直接看到这个class当前的属性,在我吧background-position-x这个样式的对勾取消之后,可以看到数字2变成了数字0,同时我吧width的值修改一下,改的稍微大一点,就会看到数字会多出来,其实只是图片显示的多了而已。
我吧width改成了40px
还有一个样式的属性需要注意一下,就是background-image,这个标签的说明是设置body的背景图像。把鼠标放在链接处可以看到图片的样子。
这就是背景了
可以看到是一个122*15像素的图片,这样的话我们基本可以确定,这张图片从左向右第21个像素开始,截取一个宽为11像素的图片,刚刚好显示为数字2、

这样我们基本可以确定,主要是background-position-x这个属性来控制,同时在这个页面的源码内有一段这样的style的代码。
在这里插入图片描述
可以直接搜索一下这个class的属性,然后去看下是否和我们想要得到的一致。结果肯定是没有问题的啊。这个地方可以通过正则匹配出来。
这样我们接下来可以编写代码了!!
因为每次获取的base64的编码图片大小是不一样的,所以需要每次都去解析,然后获取图片的宽度,一共是10个数字,可以除以10 得到每个数字的宽度,然后去定位当前页面下的所有的class的属性。得到这个class属性的css对应的像素。就可以取到当前位置对应的实际数字了。
首先是讲base64转换为图片,并获取图片的宽度。

def get_img_width(response):
    base_img = re.findall(r'data:image/png;base64,(.*?)"', response)
    base_img = base_img[0]
    imgdata = base64.b64decode(base_img)
    with open('./tu.jpg', 'wb') as f:
        f.write(imgdata)
    img = Image.open('./tu.jpg')
    width, height = img.size
    width = width / 10
    return width

然后去获取本页的所有的理想数字的class

# 我在这里用了xpath去提取。这句定位的是数字外层的div。
list_all = xpath_html.xpath('//*[@id="app"]/main/div[1]/div/div/div/div')

# 然后通过语句在去提取每一个数字的class属性。
for j in list_all:
    list_num = j.xpath('./div/@class')		# HAZ0cazfw sprite
    
# 之后得到第一个class的属性,然后去源码页面寻找偏移位
excursion = re.findall(f'{获取到的class的第一个属性} . background-position-x:-(\d+)px', html)

# 用偏移位去对应单个的数字
number = round(int(excursion) / width)		# 这里的width是单个图片的width,按照四舍五入去计算的。

# 因为获取到的number现在还是单个的数字,要吧当前div下的数字以字符串的形式拼接,才知道到底是几位数,
# 然后去相加就是本页所有数字的和了。

不过这里有个问题,我已经把所有的和求完了,但是去填写的时候确提示不正确。。。。尴尬。可以我随机抽取了几个页面去查看获取的数字,还都是一样的。这我就很为难了!!!后来我吧所有的数字都保存在表格内,然后继续抽查了十几个页面,还是没有错误,但是还是提示总和不对、、、
在经过了老长时间之后,发现有问题,就是四舍五入有时候是不对的。极少数情况下四舍五入会大一位数,比如160会算成150。但是不能保证1000页都不犯错。所以后续我改成了和他的css样式的width去判断,当两次计算的结果相差不是1时或者不是0时,就取第二次获取到的减去1。这样只是能加强一下对数据正确性的校验,但是感觉方法并不是很好。

最后的最后 因为一天提交多次答案 被禁止提交了。但是思路最起码在这里了、。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值