简单Python爬虫获取Bing的每日封面
不知道各位小伙伴有没有注意到Bing搜索的主页每天都会有一张高清美图。但是,这张图片似乎是被某种神秘力量阻挡了,并不能像日常那样直接“右键-另存为”。
对于喜爱用高清美图做桌面的博主来说真的是煎熬,于使某天突发奇想来写一个简单的小爬虫来试试把图片扒回家当桌面啦。
今天的Bing主页是这样的
既然想要用网络爬虫,我们当然要先观察一下这个网页的源码。我们要爬的只是封面图片,所以源码中很大一部分其实与我们的爬虫并无关系。经过浏览观察,发现了我们需要的内容。
图中标黄部分是我们需要关注的图片链接
由此得到图片的URL为https://cn.bing.com/th?id=OHR.TrossachsAutumn_ZH-CN1693535266_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp
接下来我们要考虑如何自动获得这张图的链接
Python是一种功能广泛且易用的语言,有大量的模块,特别适用于解决问题。
在爬虫的应用方面有requests、bs4等常用模块。我们今天就将使用bs4和requests模块。
requests可直接使用pip安装,命令:“pip install requests”
bs4使用pip安装,命令:“pip install bs4”
(记得用管理员身份打开DOS界面哦,否则你会需要进到python安装目录下Scripts文件夹内才能使用pip)
import requests
from bs4 import BeautifulSoup
import time
一般爬取网页信息会需要如下几个步骤:
- get方法获得服务器返回信息;
- 用适当的方法编码;
- 解析网页源码。
代码段如下:
def getWebCode(url):
try:
res = requests.get(url,timeout=30) #1.使用http的get方法
res.raise_for_status() #用于在发生错误时产生异常
res.encoding=res.apparent_encoding #2.根据返回信息确定编码方式编码
print("Get Web OK.\n")
soup = BeautifulSoup(res.text,"html.parser")
#3.使用beautifulsoup内解析器解析网站服务器返回的数据
return soup
except:
print("Get Web Failed!\n")
了解过HTML的小伙伴们应该知道,其中有标签。查找标签可以方便我们找到需要的内容。回去看上图标黄的部分,是在head标签内的href参数。用如下方式查找:
(PS:有时我们要查找一些特殊格式的信息,则可以使用正则表达式方法)
def findInfo(soup):
link_list = soup.find("head").find("link")
useful_Info = link_list["href"]
return useful_Info
然后我们就只需要将useful_info这部分信息与Bing的地址拼接起来就好了。都是字符串,url_2 = url_1 + InfoPart
类似方法,通过url获取图片
然后重复getWebCode()类似的方法再次访问url_2
即可获得图片信息。
def getPhotoCode(url):
res = requests.get(url,timeout=30)
print("Get Image OK.\n")
return res.content
这里需要注意的是,我们没有同上面一样使用BeautifulSoup解析信息,返回的也不是unicode格式信息;取而代之的是res.content
即返回的是bytes形式的信息。
最后,保存图片
def Save_Image(image_source , name):
image_addr = r"C:\Users\29603\Desktop\\" + name + ".jpg"
#存储路径,可以自定义。注意要是str类型,而且最后需要注明文件格式.jpg
file = open(image_addr,mode='wb+')
#wb+:读写方式打开指定文件,如不存在则新建
file.write(image_source)
#将之前获得的信息写入文件
print("Image Saved Already.\n")
file.close()
#最后要记得关闭文件哦
用时间来命名图片
#如要使用这种方式获得时间信息,需先import time
#pip安装命令:“pip install time”
def getname():
timestr=time.strftime("%Y%m%d")
return timestr
主函数
if __name__ == "__main__":
soup = getWebCode(url_1)
InfoPart = findInfo(soup)
url_2 = url_1 + InfoPart
photo_source = getPhotoCode(url_2)
name = getname()
Save_Image(photo_source , name)
最后,提醒大家爬虫有风险。不要不停的循环运行这个程序,这可能会被认为是黑客攻击行为。
请大家在获取信息时遵守相关法律法规,不要危害他人权益。