【开门见山】
懒癌一犯,能拖一天是一天。
好了,亲爱的小伙伴们,我又回来了!今天带来的是抓取输入的任意贴吧,抓取指定范围页数内的源代码。
工具:
依旧是 PyCharm 和 Google 浏览器,python 版本为3.6.6
任务目标:
输入爬取的起始页:1
输入爬取的终止页:5
预期运行结果:
工程目录下会出现 5个 html 文本文档
教学开始:
第一步,打开 PyCharm
第二步,打开 百度贴吧
第三步,这特喵的我得先瞅瞅
…
…
抓取百度贴吧,我们要分 6步走:
1、先获取爬取的贴吧名称
2、对贴吧名称进行 url 编码
3、拼接完整的贴吧 url
4、获取爬取的起始和终止页
5、通过页码得到翻页参数(pn)的值,然后拼接每页的 url
6、循环抓取每页的源代码,保存在本地
此次项目,用面向对象来完成。所以我得先磨叽几嘴python 的面向对象编程。
我们的面向对象应该包含:
· 构造函数
· 获取网页源代码的函数
· 翻页的函数
· 保存在本地文件的函数
下面是友好的基础教学,emmm···源代码在最后的。
一、面向对象编程
这东西,我就直接当做工具用了。【装死】
1)类
类:具有相同属性或行为的对象在一个集合即为一个类
2)对象(实例)
对象:类产生的。
如果把类比作机器人工厂,对象就是机器人工厂生产的机器人。所有的机器人都有同一个母版。推荐去看 斯坦福的Java ,其中用卡尔机器人讲解类和对象的关系,讲的,特别好。【张亚松特别好】【狗鼓掌】
3)属性
属性:等同于名词,如机器人有两条腿,维克托有三只手。
4)行为
行为:等同于动词,代表方法(函数),如盖伦的跳舞
5)实例方法
所有类中的对象或者实例都可以调用的方法,可以让某个实例具有某些行为
行为是抽象的,方法是具体的。例如,跳舞是行为,而具体怎么跳是实例方法。
语法格式:
class 类名(object):
def 实例方法名(self, ..):
pass
6)类的构造函数
类的构造函数是类的初始化方法,里面包含了类产生的实例所具有的共同属性,此方法会在类产生实例时自动调用
类的构造函数 就是机器人工厂生产机器人的模板
语法格式:
class Car:
def __init__(self, [参数; 列表]):
pass
运行结果:
下面开始教学进阶!
开头我们也说了,爬取百度贴吧分六步走,六步可以分为两块,类和主函数,类负责各种功能的定义实现,主函数负责调用。
类,包含构造函数、获取网页源代码函数、翻页函数、保存在本地文件的函数。我们一步一步的说~
一、构造函数
等等,我看到了什么
哈哈哈哈哈哈哈哈哈哈,又一个被海妈打自闭的。
我们来获取下网址:
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
冷静分析,不难看出:
所以我们的构造函数就出来了,挡当挡当当,这样我们计划的第一步
二、获取网页源代码函数
应该都能看懂吧,看不懂的话,看一看上一篇文章吧,那篇讲 urllib 了。
【传送门】百度篇·手把手教你抓取百度搜索关键词后的页面源代码
三、翻页函数
没错没错就这玩意,这六步我们全部都将在这个函数里完成
我们先不急着写,分析最重要
云顶之弈贴吧第二页网址: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 这个参数是用来控制页数的,通过计算推倒 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):
好了,思路有了,不过这么拆了看,估计你们想打人。毕竟,我自己都看着难受。
以下是函数源代码:
五、主函数
我们需要的仅仅是创建一个对象并调用它的 change_page() 函数就好啦
项目代码:
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 和类的使用。