小仙女的私人订制爬虫教学(2)--图片爬虫实战

前言

​ 今天提前完成任务,闲来无事,继续我们的爬虫教程吧,考虑到学妹对python语法不是很熟悉,如果有不会的推荐参考一个python自学网站(廖雪峰官网),看过好几个教程,只有他说的比较好。

​ 当初学爬虫为的就是爬取一些学(piao)习(liang)资(mei)料(zi),所以我们今天就爬一个比较容易的图片网站作为练手,50行代码就能完成:http://www.konachan.net/post

PS: 敲黑板,注意一哈,不用在意网站图片内容,我们只关注技术,技术是无罪的(无辜状)。

1.创建工程并加载环境

  • 打开pycharm,File->New Project->选择一个文件夹->create,接着下图操作,右键你的文件夹->New->Python File->填个名字

  • 这时你应该已经创建了一个空的.py文件了,接着继续File->Settings->Project:Server Code->Project Interpreter(这是为了给我们python配置运行环境)

  • 接下来按照下图操作(昨天安装的Anaconda就是专门管理python包的一个工具,这时只要帮昨天创建的环境添加进来就行了,剩下就都可以在这里管理python环境了,非常方便):

接着在4那一步添加PATH\TO\Anaconda\python.exe

  • 然后确认,返回,你会看到你当前python环境下的所有包,如下图,点击Apply->OK即可(-_-||,终于可以讲有点技术含量的了...)

2.爬虫(获取页面->特征定位->获得所需->处理数据->下一页面)

  • 获取页面 主要是获取网页的HTML(编写网页的语言)源代码,在你的浏览器打开一个网页,按F12可以看到,如下图所示,我们这一步要做的就是活动右边的内容,你会发现这里有许多标签(网页的组成元素),而每个标签元素(div,img,span等)的一些属性就是所要爬取的对象。

  • 特征定位 上面说到,其实网页由一个一个标签组成,比如一段文本一般放在这样的标签里

    <span>文本内容</span>

    ,图片放在这样的标签里

    <img src='图片url地址'></img>

    等等...我们爬虫主要就是通过定位标签来获得所需标签属性值,但并不是所有标签都是所需,这时就需要通过标签的一些特征来寻找它们,同时过滤不要的标签。

  • 获得所需 那么如何查看我们所需标签属性从而获得所需呢呢?

    随便在张图片(我们任何需要的内容都行,这里需要图片)上右键,选择查看元素,

你会发现它会自动定位到F12窗口的蓝色底区域,红色框就是那张图片的Html标签,里面的src内容就是这张图片本身,

你可以将这个链接复制到浏览器地址栏,然后就可以得到这张图片了,只是没有下载罢了,所以爬虫其实就是模拟我们在浏览器的右键另存为操作,得到这个图片url就基本完成爬虫最难得一部分了,虽然不知道你懂不懂,但是我感觉我讲明白了。。。

  • 处理数据 当获得标签后,就可以对其进行相应处理来获得我们想要的图片或者文字了,文字很好处理,图片和视频主要是获取他们的url(类似网址一样的东西),通过url就可以下载它们了。

  • 下一页面 一个网站不止有一个页面,每一页都是不同的地址,我们不可能预知所有页面地址内容,这时需要分析他们之间的关系以便我们用循环来爬取。

    对这一网站来说,我们点击下一页,可以看下地址栏变化,

https://konachan.net/post?page=2&tags=

https://konachan.net/post?page=3&tags=

.................其实第x页她的就是url的page=x,而tages=空是因为没选种类,选了original就是:

https://konachan.net/post?page=2&tags=original

https://konachan.net/post?page=3&tags=original

一个循环很容易就能构造这些url,这里不再多说了。

3.代码讲解

'''
从网站爬一些图片,总结网页结构特点,制定匹配机制,爬取网站:https://konachan.net/post
'''
import os
import requests
from bs4 import BeautifulSoup

def download(url, filename):
    """
    下载图片
    :param url: 从<img src='url'>获取的图片url用作下载
    :param filename: 图片名称
    :return:
    """
    if os.path.exists(filename):                            # 若图片名称重复那么已经下载过
        print('file exists!')
        return
    try:
        r = requests.get(url, stream=True, timeout=60)      # 对服务器发送请求,返回图片的数据
        r.raise_for_status()                                # 返回的请求状态码用作判断是否向服务器请求url成功

        with open(filename, 'wb') as f:                     # 将请求图片的数据写入我们新建的文件中,不需要深究
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    f.flush()
    except Exception:                                       # 处理一些请求异常
        if os.path.exists(filename):
            os.remove(filename)
        pass


if os.path.exists('imgs') is False:                         # 创建保存图片的文件夹
    os.makedirs('imgs')
end = 1000                                                  # 要爬多少页自己定义
for i in range(1, end + 1):                                 # 从第一页开始爬
    url = 'http://konachan.net/post?page=%d&tags=' % i      # 构建爬取网页的网址
    html = requests.get(url).text                           # 获取网址的html源码用于提取网页标签
    soup = BeautifulSoup(html, 'html.parser')               # 用BeautifulSoup解析html源码,通过soup来定位标签
    # 查找class属性为preview的<img>标签元素,注意因为class是python的关键字,所以这里需要加个下划线'_'
    # 这里为什么要这样,不是find_all('img'), 1.因为你可以右键图片查看源码,发现每一张图片都是类似<img class="preview" src="xxx">,在某些情况下,一个网页上
    # 有很多图片,但是他们的class不一样,这时我们可能只需要特定class的图片来过滤不要的图片
    # 2. 有时如果标签都有同样的id话,你也可以这样find_all('img', id='id'),这只是个例子,每个标签有多个属性值,你要找他们的规律,通过统一属性值定位自己所需标签
    for img in soup.find_all('img', class_="preview"):
        target_url = img['src']                                         # 获取图片标签的src属性值
        filename = os.path.join('imgs', target_url.split('/')[-1])      # 这里用url的最后作为图片名
        download(target_url, filename)                                  # 下载图片
    print('%d / %d' % (i, end))

这是我爬的一部分,注意这里爬到并不是原图,原图并不能通过这种方法,需要另一个库才能完成。。

4.总结

​ 当然这只是一个很简单的爬虫代码,我觉得那这个作为初学者试手很有价值,而且这家网站没有反爬,但是所有的爬虫思路基本都是那几步,只要掌握好那个流程,那基本上所有的网站就都能爬了。

接下来还有2个内容,一个是多线程爬虫(加快爬虫速度),另一个是模拟浏览器操作,使用selenium库爬虫(这个方法是万能的方法,基本可以完成所有网站的爬取,不论你是不是有反爬还是啥妖魔鬼怪,缺点是较普通爬虫慢很多)

​ 虽然不知道是不是我的错觉,但我已经感觉你已经放弃了,果不其然,《爬虫--从入门到放弃》

猜你喜欢

转载自www.cnblogs.com/huxiaozhouzhou/p/10510659.html
今日推荐