Python爬虫实践(入门篇)——抓取《天使降临到我身边》图片

今天就学了一下Python爬虫,于是想实践一下。刚好一周前在B站补完番《天使降临到我身边》——里面的小学生特可爱、情节也不错,心里就比较喜欢这部漫画,所以就想扒一些图片当壁纸。刚好,Python爬虫解决了批量抓取问题。

(C)椋木ななつ・一迅社/わたてん製作委員会。《天使降临到我身边》三大主角。

我就有个定向思维——官方的东西会好一些,所以目标直接打向官网(http://watatentv.com/story.html)。

13集的图片全扒!(别说我正在开车!)

不说了,现在就开始工作。

前提

如果你想顺利地完成,你得有一定的Python爬虫基础、HTML语言基础,会使用网页调试工具。要不然你会感觉很困难。

其次我希望各位不要先去看代码,尝试自己思考解决方案,按照提示自己去写代码。Python爬虫是需要日积月累才能很好的去使用。

先试着分析第一集网页吧!(超喜欢白咲花)

然后鼠标放在图片上,右键点击“检查”(各个浏览器操作方法可能不一样,推荐使用Google Chrome),就会弹开调试工具,并指向图片的元素。

扫描二维码关注公众号,回复: 9965564 查看本文章

通过分析,就发现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://twiani.com/%e3%80%90%e7%a7%81%e3%81%ab%e5%a4%a9%e4%bd%bf%e3%81%8c%e8%88%9e%e3%81%84%e9%99%8d%e3%82%8a%e3%81%9f%e3%80%912%e8%a9%b1%e6%84%9f%e6%83%b3-%e3%82%b5%e3%82%a4%e3%82%ad%e3%83%a7%e3%83%bc%e3%81%ab%e3%82%ab/(图片像素低)

https://originalnews.nico/163331

可以在Google搜索更多链接(启用支持日文搜索可以获得更好结果)

由于本人也是在知道怎么用的地步,所以可能有点问题,希望各位发现问题后反馈问题给我。

希望各位在Python学习之路顺利度过、收获颇多!

最后再来一句:“喵内!”。

(C)椋木ななつ・一迅社/わたてん製作委員会

题外话

  • 根据官方信息,《天使降临到我身边》会出第二季,目前官方已在官网发布第二季PV。预计2022年发出。

官方站点首页。右下角就是PV,由于视频来自Youtube,所以观看需要梯子。 

  • 官方联系方式。

Twitter:@watatentv @doko_kanri(动画工房)

站点:watatentv.com www.dogakobo.com

  • 发个动画里面没有的照片,还挺好看的

(C)椋木ななつ・一迅社/わたてん製作委員会。

关于题外话的东西就别在这里评论了,直接在B站找我(250王牌) ,毕竟这里本身是编程猿的地方,题外话的东西本身不应该发,但也希望越来越多和我一样喜欢《天使降临到我身边》的人了解更多信息。

发布了4 篇原创文章 · 获赞 0 · 访问量 262

猜你喜欢

转载自blog.csdn.net/weixin_39523487/article/details/104926555