Python爬虫抓取百度贴吧数据

Posted 梦子mengy7762

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫抓取百度贴吧数据相关的知识,希望对你有一定的参考价值。

本节继续讲解 Python 爬虫实战案例:抓取百度贴吧(https://tieba.baidu.com/)页面,比如 Python爬虫吧、编程吧,只抓取贴吧的前 5 个页面即可。本节我们将使用面向对象的编程方法来编写程序。

判断页面类型

通过简单的分析可以得知,待抓取的百度贴吧页面属于静态网页,分析方法非常简单:打开百度贴吧,搜索“Python爬虫”,在出现的页面中复制任意一段信息,比如“爬虫需要 http 代理的原因”,然后点击右键选择查看源码,并使用 Ctrl+F 快捷键在源码页面搜索刚刚复制的数据,如下所示:

图1:静态网页分析判断(点击看高清图)

由上图可知,页面内的所有信息都包含在源码页中,数据并不需要从数据库另行加载,因此该页面属于静态页面。

寻找URL变化规律

接下来寻找要爬取页面的 URL 规律,搜索“Python爬虫”后,此时贴吧第一页的的 url 如下所示:

https://tieba.baidu.com/f?ie=utf-8&kw=python爬虫&fr=search

点击第二页,其 url 信息如下:

https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=50

点击第三页,url 信息如下:

https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=100

重新点击第一页,url 信息如下:

https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=0

如果还不确定,您可以继续多浏览几页。最后您发现 url 具有两个查询参数,分别是 kw 和 pn,并且 pn 参数具有规律性,如下所示:

第n页:pn=(n-1)*50

#参数params
pn=(page-1)*50
params=
         'kw':name,
         'pn':str(pn)
        

url 地址可以简写为:

https://tieba.baidu.com/f?kw=python爬虫&pn=450

编写爬虫程序

下面以类的形式编写爬虫程序,并在类下编写不同的功能函数,代码如下所示:


1.  from urllib import request,parse
2.  import time
3.  import random
4.  from ua_info import ua_list #使用自定义的ua池

6.  #定义一个爬虫类
7.  class TiebaSpider(object):
8.  #初始化url属性
9.  def __init__(self):
10.  self.url='http://tieba.baidu.com/f?'

12.  # 1.请求函数,得到页面,传统三步
13.  def get_html(self,url):
14.  req=request.Request(url=url,headers='User-Agent':random.choice(ua_list))
15.  res=request.urlopen(req)
16.  #windows会存在乱码问题,需要使用 gbk解码,并使用ignore忽略不能处理的字节
17.  #linux不会存在上述问题,可以直接使用decode('utf-8')解码
18.  html=res.read().decode("gbk","ignore")
19.  return html
20.  # 2.解析函数,此处代码暂时省略,还没介绍解析模块
21.  def parse_html(self):
22.  pass
23.  # 3.保存文件函数
24.  def save_html(self,filename,html):
25.  with open(filename,'w') as f:
26.  f.write(html)
27.  # 4.入口函数
28.  def run(self):
29.  name=input('输入贴吧名:')
30.  begin=int(input('输入起始页:'))
31.  stop=int(input('输入终止页:'))
32.  # +1 操作保证能够取到整数
33.  for page in range(begin,stop+1):
34.  pn=(page-1)*50
35.  params=
36.  'kw':name,
37.  'pn':str(pn)
38.  
39.  #拼接URL地址 
40.  params=parse.urlencode(params)
41.  url=self.url.format(params)
42.  #发请求
43.  html=self.get_html(url)
44.  #定义路径
45.  filename='-页.html'.format(name,page)
46.  self.save_html(filename,html)
47.  #提示
48.  print('第%d页抓取成功'%page)
49.  #每爬取一个页面随机休眠1-2秒钟的时间
50.  time.sleep(random.randint(1,2))
51.  #以脚本的形式启动爬虫
52.  if __name__=='__main__': 
53.  start=time.time()
54.  spider=TiebaSpider() #实例化一个对象spider
55.  spider.run() #调用入口函数
56.  end=time.time()
57.  #查看程序执行时间
58.  print('执行时间:%.2f'%(end-start))  #爬虫执行时间

程序执行后,爬取的文件将会保存至 Pycharm 当前工作目录,输出结果:

输入贴吧名:python爬虫
输入起始页:1
输入终止页:2
第1页抓取成功
第2页抓取成功
执行时间:12.25

以面向对象方法编写爬虫程序时,思路简单、逻辑清楚,非常容易理解,上述代码主要包含了四个功能函数,它们分别负责了不同的功能,总结如下:

1) 请求函数

请求函数最终的结果是返回一个 HTML 对象,以方便后续的函数调用它。

2) 解析函数

解析函数用来解析 HTML 页面,常用的解析模块有正则解析模块、bs4 解析模块。通过分析页面,提取出所需的数据,在后续内容会做详细介绍。

3) 保存数据函数

该函数负责将抓取下来的数据保至数据库中,比如 mysql、MongoDB 等,或者将其保存为文件格式,比如 csv、txt、excel 等。

4) 入口函数

入口函数充当整个爬虫程序的桥梁,通过调用不同的功能函数,实现数据的最终抓取。入口函数的主要任务是组织数据,比如要搜索的贴吧名、编码 url 参数、拼接 url 地址、定义文件保存路径。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架群:【832357663】 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

爬虫程序结构

用面向对象的方法编写爬虫程序时,逻辑结构较为固定,总结如下:


1.  # 程序结构
2.  class xxxSpider(object):
3.  def __init__(self):
4.  # 定义常用变量,比如url或计数变量等

6.  def get_html(self):
7.  # 获取响应内容函数,使用随机User-Agent

9.  def parse_html(self):
10.  # 使用正则表达式来解析页面,提取数据

12.  def write_html(self):
13.  # 将提取的数据按要求保存,csv、MySQL数据库等

15.  def run(self):
16.  # 主函数,用来控制整体逻辑

18.  if __name__ == '__main__':
19.  # 程序开始运行时间
20.  spider = xxxSpider()
21.  spider.run()

注意:掌握以上编程逻辑有助于您后续的学习。

爬虫程序随机休眠

在入口函数代码中,包含了以下代码:


1.  #每爬取一个页面随机休眠1-2秒钟的时间
2.  time.sleep(random.randint(1,2))

爬虫程序访问网站会非常快,这与正常人类的点击行为非常不符。因此,通过随机休眠可以使爬虫程序模仿成人类的样子点击网站,从而让网站不易察觉是爬虫访问网站,但这样做的代价就是影响程序的执行效率。在学习Python的道路上,经常会碰到许多的问题,而我们在一起问题就不是问题了,可以在小编找到冠一哒,一起学习,也可以私信“01”获取学习干货,碰到什么问题也可以及时来问小编哒。

聚焦爬虫是一种执行效率较低的程序,提升其性能,是业界一直关注的问题,由此也诞生了效率较高的 Python 爬虫框架 Scrapy。

以上是关于Python爬虫抓取百度贴吧数据的主要内容,如果未能解决你的问题,请参考以下文章

如何用python抓取百度地图数据

python爬取百度搜索页面,得到内容不全,求教,why

Python爬虫——抓取贴吧帖子

Python爬虫实战二之爬取百度贴吧帖子

python-简单爬虫抓取贴吧图片

Python爬虫实战之如何爬取百度贴吧帖子?案例详解