都0202年了,還在找電腦壁紙資源嗎?還在右鍵另存圖片嗎?還要自己費事費力做這些事情嗎?好啦,現在有這個python程序,都省了。
因爲我之前也在爲找電腦壁紙資源而苦惱,一是沒有好看的圖片,二是沒有什麼特別好的固定地方讓我下載圖片,聽說bing(必應)的首頁好看,我這去一看,果不其然,漂亮,所以我就編寫一個小爬蟲來爬取這個圖片,但是轉念一想,每天都要手動運行嗎?太難爲人了(好吧,是我懶了),我就去找辦法看看能不能每天定時執行這個程序,皇天不負有心人,找到了方法,而且不止一種,廢話不多說了,下面進入正題。
手動分割線:
emm,昨天剛發的就要微調一下,我今天早上8點上電腦看看效果,然鵝突然發現國內版的bing要比國際版的bing更新的早,於是乎,我微調一下哈,大體結構是不會變的,就是 url 改了一下,代碼已修改。——2020.01.03
使用到的庫,requests庫 和 lxml庫需要自己在cmd窗口裏安裝,下載安裝命令在後面的括號裏
requests (pip install requests)
lxml (pip install lxml)
datetime
time
運行環境
python版本:Anaconda3(python3)
編輯器:PyCharm
瀏覽器:Chrome
1.分析網頁
bing有國際版和國內版之分,其實網頁結構沒有什麼區別,只是一箇中文一個英文而已,我這選擇了國內版,國內版要比國際版更新更早,更符合國人的時間。
下面打開開發者工具(F12),分析具體的結構
下面這是正常的分析情況
但是那個背景圖太難標記到了,換種思路
我們想個辦法複製上圖左側列表中所找到的正確文件名,然後點擊Elements這個按鈕,接着按Ctrl+F鍵查找,得到其網頁結構的位置
在上圖箭頭指着的位置右鍵,然後依次點擊Copy —> Copy Xpath,複製它的Xpath路徑。這樣我們的代碼就來了
2.爬取圖片
首先請求主頁面
url = "https://cn.bing.com"
rs = requests.get(url=url)
然後使用Xpath對網頁進行解析
html = etree.HTML(rs.content)
imgUrl = 'https://cn.bing.com' + html.xpath('//*[@id="bgLink"]/@href')[0]
接着獲取圖片內容
imgRs = requests.get(url=imgUrl)
我們在該python文件的同級目錄下手動新建一個bgImg的文件夾存放爬取下來的圖片,然後使用datetime庫,使用當前時間作爲文件名。
time = datetime.datetime.now()
str_time = datetime.datetime.strftime(time, "%Y-%m-%d")
最後我們將圖片存在文件夾中
path = "./bgImg/{}.jpg".format(str_time)
with open(path, "wb") as f:
f.write(imgRs.content)
3.每間隔一天爬取一次
這裏的話,我自己的相關博文還沒寫好,我參考的資料傳送門Python3.x:定時任務實現方式,有七八種方法。
我這裏就用最簡單的time.sleep(),在外層寫一個永真的while循環,裏面寫一句time.sleep(24 * 60 * 60)
讓程序休眠24小時*60分鐘*60秒,這裏是休眠的,所以也不必擔心它會擠佔電腦的內存。
while 1:
main()
time.sleep(24 * 60 * 60)
4.完整代碼
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
from lxml import etree
import datetime
import time
def main():
# 請求主頁面
url = "https://cn.bing.com"
rs = requests.get(url=url)
# 對網頁解析
html = etree.HTML(rs.content)
imgUrl = 'https://cn.bing.com' + html.xpath('//*[@id="bgLink"]/@href')[0]
# 獲取圖片內容
imgRs = requests.get(url=imgUrl)
time = datetime.datetime.now()
str_time = datetime.datetime.strftime(time, "%Y-%m-%d")
print(time)
path = "./bgImg/{}.jpg".format(str_time)
with open(path, "wb") as f:
f.write(imgRs.content)
if __name__ == '__main__':
while 1:
main()
time.sleep(24 * 60 * 60)
彩蛋
今天是2020-01-02,然後有兩張圖了,都附上啦,這些看着還是蠻精美的嘛。祝大家在新的一年裏也特別精彩特別美好!