【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码

【开门见山】

懒癌一犯,能拖一天是一天。
好了,亲爱的小伙伴们,我又回来了!今天带来的是抓取输入的任意贴吧,抓取指定范围页数内的源代码。
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第1张图片

工具

依旧是 PyCharm 和 Google 浏览器,python 版本为3.6.6

任务目标:

输入爬取的贴吧名称:如,云顶之弈
在这里插入图片描述
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第2张图片

输入爬取的起始页:1

输入爬取的终止页:5

预期运行结果:

工程目录下会出现 5个 html 文本文档

最近玩云顶有点上头,自打出了海克斯,快乐的一批。
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第3张图片

教学开始:

第一步,打开 PyCharm

第二步,打开 百度贴吧

第三步,这特喵的我得先瞅瞅


抓取百度贴吧,我们要分 6步走:

1、先获取爬取的贴吧名称

2、对贴吧名称进行 url 编码

3、拼接完整的贴吧 url

4、获取爬取的起始和终止页

5、通过页码得到翻页参数(pn)的值,然后拼接每页的 url

6、循环抓取每页的源代码,保存在本地

此次项目,用面向对象来完成。所以我得先磨叽几嘴python 的面向对象编程。

我们的面向对象应该包含:

· 构造函数

· 获取网页源代码的函数

· 翻页的函数

· 保存在本地文件的函数

下面是友好的基础教学,emmm···源代码在最后的。
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第4张图片
一、面向对象编程

这东西,我就直接当做工具用了。【装死】

1)类

类:具有相同属性或行为的对象在一个集合即为一个类

2)对象(实例)

对象:类产生的。

如果把类比作机器人工厂,对象就是机器人工厂生产的机器人。所有的机器人都有同一个母版。推荐去看 斯坦福的Java ,其中用卡尔机器人讲解类和对象的关系,讲的,特别好。【张亚松特别好】【狗鼓掌】

3)属性

属性:等同于名词,如机器人有两条腿,维克托有三只手。

4)行为

行为:等同于动词,代表方法(函数),如盖伦的跳舞

5)实例方法

所有类中的对象或者实例都可以调用的方法,可以让某个实例具有某些行为

行为是抽象的,方法是具体的。例如,跳舞是行为,而具体怎么跳是实例方法。

语法格式:

    class 类名(object):

        def 实例方法名(self, ..):

            pass

示例代码:
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第5张图片
运行结果:
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第6张图片

6)类的构造函数

类的构造函数是类的初始化方法,里面包含了类产生的实例所具有的共同属性,此方法会在类产生实例时自动调用

类的构造函数 就是机器人工厂生产机器人的模板

语法格式:

    class Car:

        def __init__(self, [参数; 列表]):

            pass

示例代码:
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第7张图片

运行结果:
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第8张图片
下面开始教学进阶!
开头我们也说了,爬取百度贴吧分六步走,六步可以分为两块,类和主函数,类负责各种功能的定义实现,主函数负责调用。

类,包含构造函数、获取网页源代码函数、翻页函数、保存在本地文件的函数。我们一步一步的说~
在这里插入图片描述
一、构造函数

构造函数都应该写点啥玩意?
在这里插入图片描述
在这里插入图片描述

等等,我看到了什么
在这里插入图片描述
哈哈哈哈哈哈哈哈哈哈,又一个被海妈打自闭的。
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第9张图片

我们来获取下网址:

https://tieba.baidu.com/f?ie=utf-8&kw=%E4%BA%91%E9%A1%B6%E4%B9%8B%E5%BC%88&fr=search

https://tieba.baidu.com/f?ie=utf-8&kw=%E4%BF%84%E6%B4%9B%E4%BC%8A&fr=search

冷静分析,不难看出:
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第10张图片
所以我们的构造函数就出来了,挡当挡当当,这样我们计划的第一步
在这里插入图片描述二、获取网页源代码函数
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第11张图片
应该都能看懂吧,看不懂的话,看一看上一篇文章吧,那篇讲 urllib 了。

=-=在这里插入图片描述

【传送门】百度篇·手把手教你抓取百度搜索关键词后的页面源代码

三、翻页函数

还记得开头分析获取源代码的六步嘛!
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第12张图片

没错没错就这玩意,这六步我们全部都将在这个函数里完成

我们先不急着写,分析最重要

云顶之弈贴吧第二页网址:https://tieba.baidu.com/f?kw=%E4%BA%91%E9%A1%B6%E4%B9%8B%E5%BC%88&ie=utf-8&pn=50

云顶之弈贴吧第五页网址:https://tieba.baidu.com/f?kw=%E4%BA%91%E9%A1%B6%E4%B9%8B%E5%BC%88&ie=utf-8&pn=200

我们不难看出,唯一的变化就是,后面的参数 pn
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第13张图片

也就是说,pn 这个参数是用来控制页数的,通过计算推倒 pn = (页数-1) * 50

· 获取爬取的贴吧名称

  name=input("请输入您要抓取的贴吧名称:")

· 获取爬取的起始和终止页

    begin=int(input("请输入抓取的起始页:"))

    end=int(input("请输入抓取的终止页:"))

· 通过页码得到翻页参数 (pn) 的值,然后拼接每页的 url

     pn="&pn="+str((page-1)*50) #得到翻页参数pn的值

· 对贴吧名称进行 url 编码

     data=urllib.parse.urlencode(key) #对贴吧名称进行url编码

· 拼接完整的贴吧 url

      url=self.base_url+data+pn  #拼接得到完整的url

· 循环!

      for page in range(begin,end+1):

好了,思路有了,不过这么拆了看,估计你们想打人。毕竟,我自己都看着难受。
以下是函数源代码:
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第14张图片

四、保存在本地文件的函数
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第15张图片

五、主函数

我们需要的仅仅是创建一个对象并调用它的 change_page() 函数就好啦
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第16张图片

项目代码:

import urllib.request
import urllib.parse

class Tieba():

    def __init__(self):

        self.base_url="https://tieba.baidu.com/f?"  #默认url

        self.headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}

    def get_html(self,url,filename):  #获取网页源代码的函数

        req=urllib.request.Request(url,headers=self.headers) #创建实例对象

        res=urllib.request.urlopen(req) #对网页发起请求并获取响应

        html=res.read().decode("utf-8")

        self.save_info(html,filename)#调用保存函数存储数据

  
    def change_page(self): #进行翻页的函数

        name=input("请输入您要抓取的贴吧名称:")

        begin=int(input("请输入抓取的起始页:"))

        end=int(input("请输入抓取的终止页:"))

        for page in range(begin,end+1):

            pn="&pn="+str((page-1)*50) #得到翻页参数pn的值

            key={"kw":name}

            filename="第"+str(page)+"页.html" #给每页的文件起名

            data=urllib.parse.urlencode(key) #对贴吧名称进行url编码

            url=self.base_url+data+pn  #拼接得到完整的url

            self.get_html(url,filename) #调用上层函数获取网页源代码



    def save_info(self,html,filename):

        with open(filename,"w",encoding="utf-8") as f:

            f.write(html)



tieba=Tieba()

tieba.change_page()

总结:

项目虽然不是很难,重点是回忆上一篇的 urllib 和类的使用。

本期就到这里啦~
【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码_第17张图片

你可能感兴趣的:(【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码)