一起学爬虫(Python) — 19 年轻人,进来学自动化
大家好鸭,又是新的一天!
无论做什么事情,都要恪守初心,要知道我们是为了什么才学爬虫的,比如我,就是为了爬取一些好看的图片……
所以,今天带大家一起爬一些好看的,图片~
话不多说,直接高速!
http://www.win4000.com/zt/dongman.html
作为一个老二刺猿,当然是直接找动漫图片~
打开页面后往下拉,发现图片是真滴好看……
里面还有我的02老婆~
认真分析,看到这一张张的图片,我们是不是可以认为这些图片是放在一个列表里的,所以一会我们爬取这个列表,然后把每一张图片遍历出来就可以了,对吧!(遍历大意:用循环把列表中每一个元素列出来)
好,打开我们的抓包工具!(审查元素 或 检查)
找到图片所对应的位置,发现直接就有图片了,那我们直接爬取整个页面,再把爬取到的数据筛选一下,只要图片的网址然后再单独下载不就好啦~
这个想法是对的,但是打开那个网址会发现……
我们上当了!
这只是一个缩略图,那么真正的图片在哪里呢?学过html的同学应该能直接找到,没学过的呢,就跟着小泽一起往下走。
我们点开某一张图片,会发现跳到了另一个页面。
在新的页面,我们会发现有个下载按钮,还有个左右切换的按钮。
先点击一下下载按钮试试……
好家伙,直接好家伙。
一看后缀名就知道,我们又上当了!
这个按钮或许会给你一种错觉,跟昨天的翻译按钮一样,会不会返回一个图片,我们只要接收了再保存就好了。
这个想法是没错的,但是奈何这个网站太狡猾,实在是狡猾!
这个时候打开抓包工具看一下我们要的东西还有没有。
找到你啦,色图 美图!
我们再打开这个链接,看一下是不是真正的大图。
可以了可以了,够大了!
那么我们现在就是找到了真正存放图片的地址,但是还有一个地方不能忽略,来回切换的那个按钮,到底有什么用?
我们点一下,注意观察网址的变化!
发现规律了没,网址每一次都会在177098_后面加1,那么177098_1是不是就是第一张图片呢?大家可以试一下。
试完你就会发现还真的是诶,好神奇!
但是还有个问题,这一组图片是8张,也就是177098_1到177098_8,那么其他的图组是不是呢(一开始还以为是一张一张图片,上当啦,hh)
好的,果然让我们发现一个,那就是说每组图组里面图片的数量是不固定的,只爬第一张怎么会满足呢!
这样想,如果我们上面那个图组出现177098_9会怎么样?
程序不出意外应该会报错,那我们只要建立一个死循环,在报错的时候就终止循环,就可以不用管它有多少张,我全都要的下载下来啦!
思路很明确,但是实现起来…
嗨,先硬着头皮上吧,啃!
import requests
url = 'http://www.win4000.com/zt/dongman.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
首先导入我们的requests模块,先设好url和响应头信息。
通过抓包工具我们发现,这些图片确确实实可以当做一个列表,每一个li标签都在class为clearfix的ul标签里。
那我们有没有办法只获取这一部分数据呢?
办法是有的,但是突然告诉你可能会很迷茫,不过不要纠结,先用着。
from lxml import etree
这就是我们的解决方法,etree,我是这样理解的,把网页变成一棵树,很easy的就找到我们要的树叶。
当然你也可以百度一下这个模块,多了解一下~
response = requests.get(url=url,headers=headers).text
tree = etree.HTML(response)
leaf = tree.xpath('//div[@class="tab_tj"]//ul[@class="clearfix"]/li/a/@href')
第一句大家应该能看懂吧,把响应的页面数据以文本的形式给response。
第二句的意思呢,就是把文本形式的网页数据给变成大树!可以这么理解哦,因为我们要找的是某一片叶子,所以要用etree.HTML()把它大树化~
第三句里的leaf是叶子的意思哦,要记住这个xpath,查帕斯查帕斯查帕斯,这是我们找叶子的一种方法,一般来说是可以直接在抓包工具那里直接右键复制xpath,就是你要找的地方的xpath,但是这个网站复制过来的xpath并不怎么管用,这也说明了方便不一定好用哈~
所以这里小泽就手打了xpath语句。
// 的意思是不用从根目录开始,如果只打一个斜线就是要从/html开始了,但是我们直接找class为tab_tj的div就行了,中间的//意思就是div和ul中间不是还有东西嘛,直接跳过了,不一一打出来了,一个下划线就是跳一级,最后的@href就是直接艾特我们要的数据,他就会乖乖过来啦!
上图~
这就是xpath方法哦,记住了,查帕斯!
那我们一会肯定要给图片起名的嘛,就可以再弄一个叶子,最后改成@alt就行啦~
这里小泽是遍历了一下叶子,记住喽,爬下来的是个列表~
不过爬下来的网址里混入了几个不明物体,这个小泽也不知道是为什么诶,有会的大佬欢迎留言一下~
一会用处理报错的那个东西,try和except~
很多同学可能会还处于懵逼状态,如果是因为对xpath那块不理解的话,留言一下,如果点赞留言的人多的话,后续会专门写一篇关于我们去找我们要的数据的方法相关的文章!(谁不喜欢偷懒呢,hhh)
import requests
from lxml import etree
import os
# 指定第一个url
url = 'http://www.win4000.com/zt/dongman.html'
# 指定伪装头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
# 读取第一个url
response = requests.get(url=url,headers=headers).text
# 树化第一个页面
tree = etree.HTML(response)
# 找到图片对应的第二个页面(li列表)
leaf = tree.xpath('//div[@class="tab_tj"]//ul[@class="clearfix"]/li/a/@href')
# 创建一个文件夹
if not os.path.exists('./setu'): # 如果该文件夹不存在,则创建
os.mkdir('./setu')
# 遍历每一张图片所对应的第二个页面
for a in leaf:
# 防止出错中止程序
try:
# 设置局部变量,177105_b
b = 1
# 循环获取图集里的每一张图片,默认最多10张
while b < 11:
# 切割-->拼接
c = a.split('.html')[0]
d = c+'_'+str(b)+'.html'
# 当前图集的下一张
b += 1
# 对第二个页面开始读取,前面的都是为了方便找url
e = requests.get(url=d,headers=headers).text
# 树化第二个页面
f = etree.HTML(e)
# 在第二个页面里找到我们要的图片地址 [0]是指把列表里第一个元素提取出来,可以这么拼接!!
g = f.xpath('//div[@class="main"]//div[@class="pic-meinv"]/a/img/@src')[0]
# 获取图片的二进制数据
h = requests.get(url=g,headers=headers).content
# 给图片起名
i = 'setu/'+g.split('/')[-1]
# 持久化存储
with open(i,'wb') as fp:
fp.write(h)
except:
print('出错啦')
废话不多说,直接把全部代码都弄上来啦!
其实都是刚敲的,网站也是刚找的,还有点怕翻车,hhh
上面代码里跟爬虫有关的知识已经跟大家说的差不多了,看着注释应该也能大概明白,要学的不是上面的代码哦,是思路。
有了思路,就很容易有目标的去学习啦~
由于很多代码是跟基础有关的,而且思路也跟大家分析明白了,所以就不多说了,如果你真的真的哪里看不懂,搞不明白的话,不要怕,没有什么别人都会我不会不好意思问什么的,放心大胆的留言,留言的时候最好带上自己出错的代码或者不明白的代码,一定鼎力相助!
一起变得更厉害吧!
话说今天没有加表情包诶……
这是小泽刚才爬下来的图片,都是可以直接当屏幕壁纸的那种哦!
不乏春光乍露之图,哇哦~
那么,各位晚安喽~
最后的最后,给个赞和关注再走好不好QAQ
还有已经关注了小泽的粉丝可以任性的提问题和请求哦,比如想爬哪个网站,或者想学哪方面的知识,粉丝专利哦!!!
ByeBye~