Python:网络爬虫爬取某表情包网站

Python:网络爬虫爬取某表情包网站

参考:
爬虫基础知识点汇总(html文件基础和4个常用库 超级详细长文预警)
【爬虫教程】吐血整理,最详细的爬虫入门教程~

HTML的简单介绍

HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等。
作为爬虫初学者,我们了解HTML的基本组成、标签以及标签的属性即可,这些包含我们所要爬取的全部信息。

HTML会有head和body两大部分
标签的格式一般分为两种:双标签< p >…< /p >以及单标签< img src=…/>
标签会包含属性,一般属性会以键值对的形式存在,例如:上面< img src=…/> src就是img标签下的src属性等号后面一般会有一个网址,指向图片

requests库

requests库是Python网络爬虫最常用的库,常利用get()方法 发起URL的请求。get()方法中包含有headers属性,header可以理解为表明身份的标识一般以键值对形式存在,用于指明浏览器等信息,有些URL没有header的话可能会返回错误,下面是获取header的方法:
以Chrome浏览器、百度为例,右键检查->NetWork->刷新->单击新的请求-选择Headers下拉找到User-Agent->右键复制值
(图片尺寸不知道咋改,只能这样的大图了)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

BeatuifulSoup4库的使用

from bs4 import BeatuifulSoup
我们用BeatuifulSoup来解析请求得到的HTML,BeatuifulSoup包含四种解析器,在不要求速度的前提下用内置的’lxml’解析器即可,其他解析器需要外部导入,这里不再说明。
BeatuifulSoup含有find()和find_all()方法,内含多种属性主要如下:
在这里插入图片描述
一般需要Tag、Attribute两种属性,其他属性也可用来寻找需要的内容。
BeatuifulSoup返回Tag对象,使用find_all()或者find()方法来寻找所需信息,可匹配标签、属性、字符串等,两者用法相同,find_all返回列表包含匹配到的所有信息,两种方法都包含上面的五种属性。(详细使用:爬虫 之 BeautifulSoup4 基础教程)

实现过程

爬取的网站:https://www.laitula.com/index.php/index/index/p/1.html
在这里插入图片描述

1、爬取表面上的图片

首先分析网页的源代码,这个网站的代码比较简单。
过程如下:
在这里插入图片描述
在这里插入图片描述
如图我们找到了所需要的标签和属性,接下来就是获取标签和属性的内容,并且过滤出来有用的信息也就是图片的URL。

代码实现

首先发起请求,封装在了函数里,作为类的方法。

 class spider_doutu():

     def __init__(self):
        # header
        self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
        # 图片保存地址
        self.save_path = 'E://LearnMore//python//pycharm//somethings//spider//img//'

        self.Url = 'https://www.laitula.com/index.php/index/index/p/1.html'

    def urlGet(self, url):
        # 发起请求
        r = requests.get(url, headers= self.header)
        # 打印返回代码
        print("返回代码: ",  format(r.status_code))
        # 返回请求对象
        return r

用BeatuifulSoup解析HTML,获取本页所有表情包的URL,返回一个列表。

# 获取的是本页表面的表情包
    def urlParsing(self, r):
        # 使用BeautifulSoup解析html
        soup = BeautifulSoup(r.text, 'lxml')

        print("+++++++++++++++++++++")
        # 打印网站标题
        print("网站标题", format(soup.title))
        print("+++++++++++++++++++++")

        print('---------------------------------------------------------')
        # 打印这页表情包的主题
        print("表情包主题:")
        # 寻找<tscontent> 属性
        list = soup.find_all(attrs= {'class': 'tscontent'})
        # 寻找<random_title> 属性得到这页表情包的主题
        label_list = list[0].find_all(attrs= {'class': 'random_title'})
        for label in label_list:
            print(label.text)
        # 分界线
        print('---------------------------------------------------------')

        print("这页图片的url:")
        # 分界线
        print('---------------------------------------------------------')
        img_url = list[0].find_all(attrs= {'class': 'random_article'})
        imgUrl_list = []
        for i in img_url:
            # 寻找img 标签
            a = i.find_all('img')
            for j in a:
                # 获取img 标签中的data-original 属性
                imgUrl_list.append(j.attrs['data-original'])
        print(imgUrl_list)
        print('---------------------------------------------------------')
        # 返回图片url
        return imgUrl_list

接下来下载图片,使用requests,get()即可。

    def get_pic(self, list):
    	# 计数
        j = 0
        for i in list:
            r = requests.get(i)
            path = self.save_path + str(j) + '.jpg'
            # 报错:Permissiondenied
            # 解决:改改路径,往往是因为路径错误出问题了
            # 注意:这里相当于一个临时的文件缓冲,载入需要写入的数据
            with open(path, 'wb') as f:
                try:
                    f.write(r.content)
                except:
                    print('保存失败')
            j = j + 1

在这里插入图片描述
爬取到了20张图片,对于网站上五个主题一个主题四张的表情包。实际上有些图片是损坏的,把gif保存为了jpg图片,只要获取图片的URL最后的图片格式,保存时修改文件后缀即可。

2、爬取规定页数内详细的表情包

每个主题都含有其他的表情包,需要点进去,目标就是输入页数,爬取规定页数内每个主题内的表情包。
我们需要获取每个主题的URL,进入到主题内的网页,分析网页代码,找到图片的URL,并下载保存。
在这里插入图片描述
这个网站转到下一页的方法就是把URL最后一个’/'的1改成2。
首先找到进入主题的URL,这个URL是不完整的需要补全。
在这里插入图片描述
< a >标签一般存放的是超连接。
和爬取表面的表情包一样,需要找到保存URL的标签和属性。
在这里插入图片描述

代码实现

    def urlParsing_Multiple(self):
        m = 0
        URL = self.Url.split('/')[:-1]
        # print(URL)
        page = input('输入爬取的页数:')
        print('---------------------------------------------------------')

        URL_list = []
        # 获取所有要爬取的网页URL
        print("需要爬取网页的URL:")
        for num in range(1, int(page) + 1):
            Url = str(URL[0]) + '/' + '/'.join(URL[1:]) + '/' + str(num) + '.html'
            print(Url)
            URL_list.append(Url)
        print('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')

        url_part_1 = 'https://www.laitula.com/'
        # 遍历列表,向每个网址发起请求
        for URL in URL_list:
            print("将要爬取的URL:")
            # 打印当下要爬的URL
            print(URL)

            # 发起请求,并返回状态码和html对象
            r = self.urlGet(URL)

            # 放入BeautifulSoup 解析
            soup = BeautifulSoup(r.text, 'lxml')

            print('---------------------------------------------------------')
            # 寻找'class'='col-sm-9' 属性
            col_list = soup.find_all('div', attrs= {'class': 'col-sm-9'})
            # 因为'class'='col-sm-9' 属性只有一个所以不用循环
            # 寻找<a>标签
            a_list = col_list[0].find_all('a')
            # 遍历找到的<a> 标签
            imgUrl_list = []
            for a in a_list[:5]:
                url_part_2 = (a.attrs['href'])
                url_total = url_part_1 + url_part_2
                print(url_total)
                imgUrl_list.append(url_total)
            print('---------------------------------------------------------')
            print("开始下载")
            # 遍历找到的所有的详细表情包网页URL
            for i in imgUrl_list:
                try:
                    # 发起请求
                    r = self.urlGet(i)
                    # 解析
                    soup = BeautifulSoup(r.text, 'lxml')
                    class_list = soup.find_all(attrs= {'class': 'col-sm-9'})
                    # 寻找所有的img 标签
                    imgUrl_list = class_list[0].find_all('img')
                    print(imgUrl_list)
                    # 计数开始
                    j = 0
                    # 遍历找到的所有的图片URL
                    for i in imgUrl_list[1:-2]:
                        img = i.attrs['src']
                        print(img)
                        r = requests.get(img, headers= self.header)
                        path = self.save_path + str(m) + '//'
                        if os.path.exists(path):
                            pass
                        else:
                            os.mkdir(path)
                        path = self.save_path + str(m) + '//' +  str(j) + '.jpg'
                        print(path)
                        with open(path, 'wb') as f:
                            f.write(r.content)
                        j = j + 1
                except:
                    pass
                m += 1
            print("----------------------------此页爬取完毕-----------------------------")

运行的结果
在这里插入图片描述
部分图片URL很奇怪,无法下载。
在这里插入图片描述

完整代码

import requests
from bs4 import BeautifulSoup
import os

urll = 'https://www.laitula.com/index.php/index/index/p/1.html'

class spider_doutu():

    def __init__(self):
        # header
        self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
        # 图片保存地址
        self.save_path = 'E://LearnMore//python//pycharm//somethings//spider//img//'

        self.Url = 'https://www.laitula.com/index.php/index/index/p/1.html'

    def urlGet(self, url):
        # 发起请求
        r = requests.get(url, headers= self.header)
        # 打印返回代码
        print("返回代码: ",  format(r.status_code))
        # 返回请求对象
        return r

    # 获取的是本页表面的表情包
    def urlParsing(self, r):
        # 使用BeautifulSoup解析html
        soup = BeautifulSoup(r.text, 'lxml')

        print("+++++++++++++++++++++")
        # 打印网站标题
        print("网站标题", format(soup.title))
        print("+++++++++++++++++++++")

        print('---------------------------------------------------------')
        # 打印这页表情包的主题
        print("表情包主题:")
        # 寻找<tscontent> 属性
        list = soup.find_all(attrs= {'class': 'tscontent'})
        # 寻找<random_title> 属性得到这页表情包的主题
        label_list = list[0].find_all(attrs= {'class': 'random_title'})
        for label in label_list:
            print(label.text)
        # 分界线
        print('---------------------------------------------------------')

        print("这页图片的url:")
        # 分界线
        print('---------------------------------------------------------')
        img_url = list[0].find_all(attrs= {'class': 'random_article'})
        imgUrl_list = []
        for i in img_url:
            # 寻找img 标签
            a = i.find_all('img')
            for j in a:
                # 获取img 标签中的data-original 属性
                imgUrl_list.append(j.attrs['data-original'])
        print(imgUrl_list)
        print('---------------------------------------------------------')
        # 返回图片url
        return imgUrl_list

    def get_pic(self, list):
        j = 0
        for i in list:
            r = requests.get(i)
            path = self.save_path + str(j) + '.jpg'
            # 报错:Permissiondenied
            # 解决:改改路径,往往是因为路径错误出问题了
            # 注意:这里相当于一个临时的文件缓冲,载入需要写入的数据
            with open(path, 'wb') as f:
                try:
                    f.write(r.content)
                except:
                    print('保存失败')

            j = j + 1

    def urlParsing_Multiple(self):
        m = 0
        URL = self.Url.split('/')[:-1]
        # print(URL)
        page = input('输入爬取的页数:')
        print('---------------------------------------------------------')

        URL_list = []
        # 获取所有要爬取的网页URL
        print("需要爬取网页的URL:")
        for num in range(1, int(page) + 1):
            Url = str(URL[0]) + '/' + '/'.join(URL[1:]) + '/' + str(num) + '.html'
            print(Url)
            URL_list.append(Url)
        print('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')

        url_part_1 = 'https://www.laitula.com/'
        # 遍历列表,向每个网址发起请求
        for URL in URL_list:
            print("将要爬取的URL:")
            # 打印当下要爬的URL
            print(URL)

            # 发起请求,并返回状态码和html对象
            r = self.urlGet(URL)

            # 放入BeautifulSoup 解析
            soup = BeautifulSoup(r.text, 'lxml')

            print('---------------------------------------------------------')
            # 寻找'class'='col-sm-9' 属性
            col_list = soup.find_all('div', attrs= {'class': 'col-sm-9'})
            # 因为'class'='col-sm-9' 属性只有一个所以不用循环
            # 寻找<a>标签
            a_list = col_list[0].find_all('a')
            # 遍历找到的<a> 标签
            imgUrl_list = []
            for a in a_list[:5]:
                url_part_2 = (a.attrs['href'])
                url_total = url_part_1 + url_part_2
                print(url_total)
                imgUrl_list.append(url_total)
            print('---------------------------------------------------------')
            print("开始下载")
            # 遍历找到的所有的详细表情包网页URL
            for i in imgUrl_list:
                try:
                    # 发起请求
                    r = self.urlGet(i)
                    # 解析
                    soup = BeautifulSoup(r.text, 'lxml')
                    class_list = soup.find_all(attrs= {'class': 'col-sm-9'})
                    # 寻找所有的img 标签
                    imgUrl_list = class_list[0].find_all('img')
                    print(imgUrl_list)
                    # 计数开始
                    j = 0
                    # 遍历找到的所有的图片URL
                    for i in imgUrl_list[1:-2]:
                        img = i.attrs['src']
                        print(img)
                        r = requests.get(img, headers= self.header)
                        path = self.save_path + str(m) + '//'
                        if os.path.exists(path):
                            pass
                        else:
                            os.mkdir(path)
                        path = self.save_path + str(m) + '//' +  str(j) + '.jpg'
                        print(path)
                        with open(path, 'wb') as f:
                            f.write(r.content)
                        j = j + 1
                except:
                    pass
                m += 1
            print("----------------------------此页爬取完毕-----------------------------")



if __name__ == '__main__':
    spider = spider_doutu()
    # r = spider.urlGet(urll)
    # List = spider.urlParsing(r)
    # spider.get_pic(List)
    spider.urlParsing_Multiple()



结语

刚开始学Python的时候接触到的爬虫,但是被搁置,现在重新学了下,写的第一个爬虫(有点捞)。
如有错误,还请评论指出。
共同进步

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ydon?tkwhmeIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值