昨天和妹子聊天,她说她现在很苦恼,“仙草哥哥,我最近没有头像可以用了。”
我感到了非常不可思议,我说,“你不是天天都换头像吗?怎么会没有头像用了呢?”
她说,“仙草哥哥你是笨蛋吗?就是因为天天都要换新头像,好看的头像都用光了,所以才没有头像可以用了啊!”
我说,“那也不要紧啊,你把去年的历史头像每个再用一天,不就又可以够用一年了吗?”
妹子非常不开心,“哼,和你这种直男没什么可聊的。”,然后她就不理我了
怎么办,为了能让妹子开心起来,就做一个能够爬取头像的爬虫程序吧!
虽然我之前在文章中还从没写过图片的爬取,但是实际上图片的爬取也很简单,和普通的爬虫程序没有很大的区别
最大的不同在于,一般在爬取一个页面的时候,都是通过r.text直接获取到解码后的文本内容。但是如果你要保存一个图片,就不需要对其解码了,只要把二进制的响应内容,原封不动的保存下来就可以了,使用r.content就可以满足了
其他的和普通的爬虫程序一样,也还是先发起请求,提取出图片地址,然后对图片发起请求,保存二进制的响应内容
不过这次在爬取的时候,也遇到了一点小的困难。直接使用r.text的解码是错误的,也就是说,我们的requests错误的判断了编码,这种时候怎么办呢?不要着急,我们可以先去查看一下浏览器是使用什么编码去解析的,如图所示

可以看到,上边写的编码为,charset=gb2312,这个大概就是实际的编码了,我们可以尝试一下
- r = requests.get(url)
-
- r.encoding = "gb2312"
- print(r.text)
如此操作以后,文字的显示就正常了,说明网站的编码确实是gb2312,这样的一个问题就得到了解决,然后就可以正常提取出图片地址,然后请求保存了
- img_url = "xxx"
- r = requests.get(img_url)
-
- with open("图片.png", "wb") as f:
- f.write(r.content)
- import requests
- import time
- from base64 import b64decode
- from lxml import etree
-
- headers = {"user-agent": "Mozilla/5.0"}
- url = b64decode("aHR0cDovL3d3dy5pbWVpdG91LmNvbS9kb25nbWFuLw==").decode()
-
- r = requests.get(url, headers=headers)
- r.encoding = "gb2312"
-
- html = etree.HTML(r.text)
-
- urls = html.xpath("//ul[@class='g-gxlist-imgbox']//a/@href")
- titles = html.xpath("//ul[@class='g-gxlist-imgbox']//a/@title")
-
- for i in range(len(urls)):
- title = titles[i][0:6] + "头像"
- url = urls[i]
- r = requests.get(url, headers=headers)
- r.encoding = "gb2312"
- html = etree.HTML(r.text)
- img = html.xpath("//div[@class='img-list3']//img/@src")
- num = 1
- for u in img:
- r = requests.get(u, headers=headers)
- with open(title + str(num) + ".png", "wb") as f:
- f.write(r.content)
- print(title + "-" + str(num) + "已完成")
- num += 1
- time.sleep(1)
- time.sleep(1)
程序运行过程展示

程序运行结果展示

可以看到,在我们的程序运行结束以后,有很多的好看头像就都已经被保存下来了
虽然爬取头像的程序是给妹子做的,但是我自己看完以后也很心动,我也是挑选了一个我喜欢的新头像换上了,怎么样,好看吗?
现在我把程序分享给你,你也可以通过运行该程序来挑选你自己心仪的头像哦。喜欢请收藏加关注,每天带你用新的爬虫程序