欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一起学爬虫(Python)

程序员文章站 2022-03-18 21:50:58
今天我们爬图片开始分析实践开始大家好鸭,又是新的一天!无论做什么事情,都要恪守初心,要知道我们是为了什么才学爬虫的,比如我,就是为了爬取一些好看的图片……所以,今天带大家一起爬一些好看的,图片~话不多说,直接高速!http://www.win4000.com/zt/dongman.html作为一个老二刺猿,当然是直接找动漫图片~分析打开页面后往下拉,发现图片是真滴好看……里面还有我的02老婆~认真分析,看到这一张张的图片,我们是不是可以认为这些图片是放在一个列表里的,所以一会我们爬取...

今天我们爬图片

开始

大家好鸭,又是新的一天!
无论做什么事情,都要恪守初心,要知道我们是为了什么才学爬虫的,比如我,就是为了爬取一些好看的图片……
所以,今天带大家一起爬一些好看的,图片~
话不多说,直接高速!
http://www.win4000.com/zt/dongman.html
作为一个老二刺猿,当然是直接找动漫图片~

分析

一起学爬虫(Python)
打开页面后往下拉,发现图片是真滴好看……
里面还有我的02老婆~
认真分析,看到这一张张的图片,我们是不是可以认为这些图片是放在一个列表里的,所以一会我们爬取这个列表,然后把每一张图片遍历出来就可以了,对吧!(遍历大意:用循环把列表中每一个元素列出来)
好,打开我们的抓包工具!(审查元素 或 检查)
一起学爬虫(Python)
找到图片所对应的位置,发现直接就有图片了,那我们直接爬取整个页面,再把爬取到的数据筛选一下,只要图片的网址然后再单独下载不就好啦~
这个想法是对的,但是打开那个网址会发现……
一起学爬虫(Python)
我们上当了!
这只是一个缩略图,那么真正的图片在哪里呢?学过html的同学应该能直接找到,没学过的呢,就跟着小泽一起往下走。
我们点开某一张图片,会发现跳到了另一个页面。

一起学爬虫(Python)
在新的页面,我们会发现有个下载按钮,还有个左右切换的按钮。
先点击一下下载按钮试试……
一起学爬虫(Python)
好家伙,直接好家伙。
一看后缀名就知道,我们又上当了!
这个按钮或许会给你一种错觉,跟昨天的翻译按钮一样,会不会返回一个图片,我们只要接收了再保存就好了。
这个想法是没错的,但是奈何这个网站太狡猾,实在是狡猾!
这个时候打开抓包工具看一下我们要的东西还有没有。
一起学爬虫(Python)
找到你啦,色图 美图!
我们再打开这个链接,看一下是不是真正的大图。
一起学爬虫(Python)
可以了可以了,够大了!
那么我们现在就是找到了真正存放图片的地址,但是还有一个地方不能忽略,来回切换的那个按钮,到底有什么用?
我们点一下,注意观察网址的变化!
一起学爬虫(Python)
一起学爬虫(Python)
一起学爬虫(Python)
一起学爬虫(Python)
发现规律了没,网址每一次都会在177098_后面加1,那么177098_1是不是就是第一张图片呢?大家可以试一下。
试完你就会发现还真的是诶,好神奇!
但是还有个问题,这一组图片是8张,也就是177098_1到177098_8,那么其他的图组是不是呢(一开始还以为是一张一张图片,上当啦,hh)
一起学爬虫(Python)
好的,果然让我们发现一个,那就是说每组图组里面图片的数量是不固定的,只爬第一张怎么会满足呢!
这样想,如果我们上面那个图组出现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和响应头信息。
一起学爬虫(Python)
通过抓包工具我们发现,这些图片确确实实可以当做一个列表,每一个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就是直接艾特我们要的数据,他就会乖乖过来啦!
上图~
一起学爬虫(Python)
这就是xpath方法哦,记住了,查帕斯!
那我们一会肯定要给图片起名的嘛,就可以再弄一个叶子,最后改成@alt就行啦~

一起学爬虫(Python)
这里小泽是遍历了一下叶子,记住喽,爬下来的是个列表~
一起学爬虫(Python)
不过爬下来的网址里混入了几个不明物体,这个小泽也不知道是为什么诶,有会的大佬欢迎留言一下~
一会用处理报错的那个东西,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
上面代码里跟爬虫有关的知识已经跟大家说的差不多了,看着注释应该也能大概明白,要学的不是上面的代码哦,是思路。
有了思路,就很容易有目标的去学习啦~
由于很多代码是跟基础有关的,而且思路也跟大家分析明白了,所以就不多说了,如果你真的真的哪里看不懂,搞不明白的话,不要怕,没有什么别人都会我不会不好意思问什么的,放心大胆的留言,留言的时候最好带上自己出错的代码或者不明白的代码,一定鼎力相助!
一起变得更厉害吧!
话说今天没有加表情包诶……
一起学爬虫(Python)
这是小泽刚才爬下来的图片,都是可以直接当屏幕壁纸的那种哦!
不乏春光乍露之图,哇哦~
一起学爬虫(Python)

那么,各位晚安喽~
最后的最后,给个赞和关注再走好不好QAQ
还有已经关注了小泽的粉丝可以任性的提问题和请求哦,比如想爬哪个网站,或者想学哪方面的知识,粉丝专利哦!!!
ByeBye~

本文地址:https://blog.csdn.net/BcXbHello/article/details/110333446?utm_medium=distribute.pc_category.none-task-blog-hot-6.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-6.nonecase