今天就学了一下Python爬虫,于是想实践一下。刚好一周前在B站补完番《天使降临到我身边》——里面的小学生特可爱、情节也不错,心里就比较喜欢这部漫画,所以就想扒一些图片当壁纸。刚好,Python爬虫解决了批量抓取问题。
(C)椋木ななつ・一迅社/わたてん製作委員会。《天使降临到我身边》三大主角。
我就有个定向思维——官方的东西会好一些,所以目标直接打向官网(http://watatentv.com/story.html)。
13集的图片全扒!(别说我正在开车!)
不说了,现在就开始工作。
前提
如果你想顺利地完成,你得有一定的Python爬虫基础、HTML语言基础,会使用网页调试工具。要不然你会感觉很困难。
其次我希望各位不要先去看代码,尝试自己思考解决方案,按照提示自己去写代码。Python爬虫是需要日积月累才能很好的去使用。
步骤
先试着分析第一集网页吧!(超喜欢白咲花)
然后鼠标放在图片上,右键点击“检查”(各个浏览器操作方法可能不一样,推荐使用Google Chrome),就会弹开调试工具,并指向图片的元素。
通过分析,就发现ol里面有若干个li,每个li就有我们想要的img,而这六张图片是通过JavaScript来控制显示与隐藏的。
把鼠标移动到调试工具的img上,按照图片所示操作。
复制到的内容是BeautifulSoup的select字符串,如果把全部img的seletor字符串复制粘贴就是这样:
body > div.wrap > div.main_wrap > div.story_wrap > div > div.story_box02 > div > div.story_bamen_wrap > div.story_box > div > ol.main > li:nth-child(1) > img
body > div.wrap > div.main_wrap > div.story_wrap > div > div.story_box02 > div > div.story_bamen_wrap > div.story_box > div > ol.main > li:nth-child(2) > img
body > div.wrap > div.main_wrap > div.story_wrap > div > div.story_box02 > div > div.story_bamen_wrap > div.story_box > div > ol.main > li:nth-child(3) > img
body > div.wrap > div.main_wrap > div.story_wrap > div > div.story_box02 > div > div.story_bamen_wrap > div.story_box > div > ol.main > li:nth-child(4) > img
body > div.wrap > div.main_wrap > div.story_wrap > div > div.story_box02 > div > div.story_bamen_wrap > div.story_box > div > ol.main > li:nth-child(5) > img
body > div.wrap > div.main_wrap > div.story_wrap > div > div.story_box02 > div > div.story_bamen_wrap > div.story_box > div > ol.main > li:nth-child(6) > img
可见就只是li.nth-child(N)发生变化,那么发现了规律后就利用循环来控制变量,且可以指向不同的li元素。
可以先扒一个网页的照片。去敲键盘。
import requests
from bs4 import BeautifulSoup
import time
import urllib.request #下载方法多种,可选其他方法
i = 1
url = "http://watatentv.com/story01.html"
resource = requests.get(url) #创建request对象
front = BeautifulSoup(resource.text, "html5lib") #创建BeautifulSoup对象,其中使用的库(html5lib)可以选择其他库
while i <= 6:
e = front.select("body > div.wrap > div.main_wrap > div.story_wrap > div > div.story_box02 > div > div.story_bamen_wrap > div.story_box > div > ol.main > li:nth-child(" + str('%05d' % i) + ") > img") #获得img元素
print("正在下载" + "http://watatentv.com/" + e[0]["src"])
urllib.request.urlretrieve("http://watatentv.com/" + e[0]["src"], "${filename}/" + str(int(time.time())) + ".jpg") #获得img元素的src属性(图片源),并下载到指定目录(${filename})。为保证文件唯一性,使用时间戳命名
time.sleep(1) #为防止被墙停止一段时间
i += 1
resource.close()
如果没有安装相应的库,你可以通过CMD(管理员身份运行),或者在PyCharm里面搜索安装,具体方法你自己找度娘吧!
效果图。速度特慢(没办法,日本站点),但最后还是成功了。
如果发现自己的文件夹有6个图片,那么就OK了。那么就解决第二个问题:如何批量扒其他12个页面的图片。
各位就试着点击其他集数的页面(也可以随便找找你喜欢的角色),并观察URL变化规律。
全部URL就是这样:
http://watatentv.com/story01.html(第一集)
http://watatentv.com/story02.html(第二集)
......
http://watatentv.com/story12.html(第十二集)
http://watatentv.com/story13.html(OVA版本)
且每个页面都差不多,就只是照片和面包导航栏不同(也可以查看每个页面的照片的BeautifulSoup select字符串)。因此每个页面要做的工作相同,可以利用循环控制变量变化,且另一个储存URL变量使其能随着规律来变化出不同的URL。
因此需要组成内嵌循环,最外面用于控制页面访问,最里面用于扒图片。
可以在原来的代码的基础上再次修改。
# 一些注释由于刚才写过,所以不重复
import requests
from bs4 import BeautifulSoup
import time
import urllib.request
i = 1
j = 1
while i <= 13:
url = "http://watatentv.com/story" + str('%02d' % i) + ".html" #动态生成URL
print("正在抓取" + url)
resource = requests.get(url)
front = BeautifulSoup(resource.text, "html5lib")
while j <= 6:
e = front.select("body > div.wrap > div.main_wrap > div.story_wrap > div > div.story_box02 > div > div.story_bamen_wrap > div.story_box > div > ol.main > li:nth-child(" + str(j) + ") > img") #获得img元素
print("正在下载" + e[0]["src"])
urllib.request.urlretrieve("http://watatentv.com/" + e[0]["src"], "${filename}/" + str(int(time.time())) + ".jpg")
time.sleep(1)
j += 1
resource.close()
i += 1
j = 1 #复位,为下一个网页做准备
效果图。自家网速慢得要命,又加上直播,程序发生假死,不得不用阿里云的Cloud Shell,用Cloud Shell特爽,速度嗖嗖嗖。
效果图。如果使用Cloud Shell,你手速就得快点啦,因为半小时后空间会失效。建议压缩打包后再下载到本地。
好了,这次就把图给扒完了。终于可以看到这些可爱的小天使了。
搭配自己写的桌面壁纸切换程序,更香!(即将完工,敬请期待)
常见问题
- 网速好慢,因此发生假死,应该如何解决?
尝试用别的连接方式,例如有线连接、无线连接、手机网络共享(手机也可以用移动数据嘛,用USB连接共享也好),如果实在没有办法,可以尝试使用阿里云的Cloud Shell来抓取,速度也比较快(马bb的平台肯定有保障)。
因此在执行之前一定要确保网速没问题。要不然全部图片白扒了。(除非你愿意改变变量)
- Cloud Shell如何使用?
这个可以参考官方文档,关键是你得注册一个阿里云账号。
实质上你正在操控一个远程Linux主机。当然,你没法用root(别人的主机,还给你为所欲为呀!),但它本身已经有了Python,pip可以不用root使用。你手速得快点,因为如果你长时间没有任何操作主机就会被释放,因此程序里面的sleep()可以适当调小一点(不要小于1,除非你有别的文件命名方法),最好你在打开Cloud Shell之前做好相关准备。
上传代码和下载图片要根据官方方法操作,因此你不能使用SFTP工具上下传文件(毕竟IP、密码都不知道,弄个锤子)。上传代码没有问题。主要解决如何下载扒到的图片,这时你应该把扒到的图片统一放在一个文件夹(最好在程序那边设置下载到的目录),再执行压缩命令(因为不支持文件下载),然后下载就OK了。
由于主机本身没有beautifulsoup和html5lib库(可选其他库),所以要安装。
pip install html5lib
pip install beautifulsoup4
mkdir ${filename} //新建一个文件夹
python ./${python_program_name}
zip -r ${zip_name} ${filename} //${zip_name}为打包后的ZIP的名字,一定要有.zip后缀
目前遇到的问题就这么多,有问题可以留言,我有空可以解决。
选做
如果想继续扒,以下链接可以扒一下
https://originalnews.nico/163331
可以在Google搜索更多链接(启用支持日文搜索可以获得更好结果)
由于本人也是在知道怎么用的地步,所以可能有点问题,希望各位发现问题后反馈给我。
希望各位在Python学习之路顺利度过、收获颇多!
最后再来一句:“喵内!”
(C)椋木ななつ・一迅社/わたてん製作委員会