实现方法:
首先在P站日榜页面找到每个图片的data-id,然后进入相应图片的页面,找到图源url爬取原图。
import urllib.request
import ssl
import requests
import re
import time
import os
dir = '/Users/doudou/Desktop/pixiv'
def getPixiv():
dir_content = os.listdir(dir) # 获取文件夹内容
ssl._create_default_https_context = ssl._create_unverified_context # 解决不受信任SSL证书问题
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.2 Safari/605.1.15'
} # 定义headers
response_1 = requests.get("https://www.pixiv.net/ranking.php", headers=headers)
daily_list = response_1.text # 获取pixiv日榜的html文字
with open("daily.txt", "w") as f:
f.write(daily_list)
ID = re.findall('"data-type=".*?"data-id="(.*?)"',daily_list) #取括号内的片段
#print(ID)#获取日榜图片的id
part = "https://www.pixiv.net/artworks/" # 定义除ID外的部分
for site in ID:
URL = part + str(site)
#print(URL)
opener = urllib.request.build_opener()
opener.addheaders = [('Referer', URL)]
response_2 = requests.get(URL,headers = headers) # 获取展示页面的html文字
html = response_2.text # 得到文字
with open("daily.txt", "w") as f:
f.write(html)
download_links = "".join(re.findall('"original":"(.*?)"}', html)) # 使用正则表达式得到下载链接
download_name = "".join(re.findall('#(.*?) - pixiv ', html))
download_name = re.sub('[\\\/\*\?\"\:\<\>\|]', '_', download_name) + download_links[-4:] # 获取图片名字和格式
#print(download_links)
print(download_name)
if download_name in dir_content:
print('Image already exists.') # 本地文件夹中已存在的图片不再爬取
continue
urllib.request.install_opener(opener)
time.sleep(5)
'''增加重连的次数防止报错'''
requests.DEFAULT_RETRIES = 100 # 增加重试连接次数
s = requests.session()
s.keep_alive = False # 关闭多余连接
'''需要提前创建好文件夹'''
urllib.request.urlretrieve(download_links, ("/Users/doudou/Desktop/pixiv/" + download_name)) # 将URL文件复制到本地
图片存在本地有丢失的风险,而且存储量大了管理起来麻烦,于是写了一个python shell脚本即时将爬到的图片更新到Github。
实现方法:
使用os库中的os.system()方法,运行shell命令(我写的是Mac的终端命令,根据os不同需进行调整)。将本地Desktop/pixiv里的图片push到关联的远端仓库。
import os
import time
def push2git():
cmd = 'cd;cd Desktop/pixiv;ls;git add .;git commit -m ' + '"' + time.strftime('%Y-%m-%d', time.localtime(time.time()))+ '"' +';git push'
print(cmd)
return os.system(cmd)
完整代码如下:
import urllib.request
import ssl
import requests
import re
import time
import os
dir = '/Users/doudou/Desktop/pixiv'
def push2git():
cmd = 'cd;cd Desktop/pixiv;ls;git add .;git commit -m ' + '"' + \
time.strftime('%Y-%m-%d', time.localtime(time.time())) + \
'"' + ';git push'
print(cmd)
return os.system(cmd)
def getPixiv():
dir_content = os.listdir(dir) # 获取文件夹内容
ssl._create_default_https_context = ssl._create_unverified_context # 解决不受信任SSL证书问题
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.2 Safari/605.1.15'
} # 定义headers
response_1 = requests.get("https://www.pixiv.net/ranking.php", headers=headers)
daily_list = response_1.text # 获取pixiv日榜的html文字
with open("daily.txt", "w") as f:
f.write(daily_list)
ID = re.findall('"data-type=".*?"data-id="(.*?)"',daily_list) #取括号内的片段
#print(ID)#获取日榜图片的id
part = "https://www.pixiv.net/artworks/" # 定义除ID外的部分
for site in ID:
URL = part + str(site)
#print(URL)
opener = urllib.request.build_opener()
opener.addheaders = [('Referer', URL)]
response_2 = requests.get(URL,headers = headers) # 获取展示页面的html文字
html = response_2.text # 得到文字
with open("daily.txt", "w") as f:
f.write(html)
download_links = "".join(re.findall('"original":"(.*?)"}', html)) # 使用正则表达式得到下载链接
download_name = "".join(re.findall('#(.*?) - pixiv ', html))
download_name = re.sub('[\\\/\*\?\"\:\<\>\|]', '_', download_name) + download_links[-4:] # 获取图片名字和格式
#print(download_links)
print(download_name)
if download_name in dir_content:
print('Image already exists.') # 本地文件夹中已存在的图片不再爬取
continue
urllib.request.install_opener(opener)
time.sleep(5)
'''增加重连的次数防止报错'''
requests.DEFAULT_RETRIES = 100 # 增加重试连接次数
s = requests.session()
s.keep_alive = False # 关闭多余连接
'''需要提前创建好文件夹'''
urllib.request.urlretrieve(download_links, ("/Users/doudou/Desktop/pixiv/" + download_name)) # 将URL文件复制到本地
if push2git() == 0:
print('----FINISH----')
if __name__ == "__main__":
getPixiv()
每天爬取日榜都要运行.py很麻烦,就想着把它弄成一个Mac上的可执行脚本。对应Windows的.exe文件。
打开Mac自带的脚本编辑器
新建脚本写下以下代码:
tell application "Terminal"
do script with command "python3 /path/to/your/script.py"
end tell
把/path/to/your/script.py替换成自己写的python代码的绝对路径。
然后储存脚本为应用程序
,即可在桌面上找到了。
虽然应用程序做好了,也可以直接执行了,但是Mac的默认图标很丑,于是决定替换成刚爬下来了パワー小姐~
首先找一个心仪的图片如下:
裁剪成1:1的正方形,分辨率调成1024,另存为pic.png
:
呼出终端,新建临时文件夹$ mkdir tmp.iconset
,并依次执行如下指令,基于pic.png生成10个不同大小的图片:
sips -z 16 16 pic.png --out tmp.iconset/icon_16x16.png
sips -z 32 32 pic.png --out tmp.iconset/[email protected]
sips -z 32 32 pic.png --out tmp.iconset/icon_32x32.png
sips -z 64 64 pic.png --out tmp.iconset/[email protected]
sips -z 128 128 pic.png --out tmp.iconset/icon_128x128.png
sips -z 256 256 pic.png --out tmp.iconset/[email protected]
sips -z 256 256 pic.png --out tmp.iconset/icon_256x256.png
sips -z 512 512 pic.png --out tmp.iconset/[email protected]
sips -z 512 512 pic.png --out tmp.iconset/icon_512x512.png
sips -z 1024 1024 pic.png --out tmp.iconset/[email protected]
然后输入$ iconutil -c icns tmp.iconset -o applet.icns
生成一个.icns应用图标。
获得图标以后就可以进行替换了,方法如下:
显示包内容
,进入文件夹。Contents/Resources
,将其中的applet.icns
替换成我们新做好的。脚本编辑器
打开该应用,什么都不做点击存储,会发现桌面上的应用图标改变了!
这样一来就可以每天愉快地欣赏P站日榜了~
灵感来源这里
爬虫代码基本参考这里
另一处爬虫参考
一个P站爬虫错误的解决方法
Mac图标生成参考