python爬虫之百度贴吧

摘要
Python是一种计算机程序设计语言,是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分,网络爬虫为搜索引擎从万维网下载网页。本文是基于python语言编写的,通过对Html捉取数据,完成对图片的保存的百度贴吧爬虫项目。
本文主要是对爬虫项目的设计和实现分析,程序主要包括三个模块:URL解析,Html抓取,本地输出。Python的开发过程中,主要调用了Python中的urllib库中的request和parse模块,random库中的choice函数,lxml库中的 etree模块。
最终的程序可以实现对百度贴吧的指定贴吧,抓取指定页面的图片,并将图片保存到本地的功能。
1.引言
互联网是一个庞大的非结构化的数据库,将数据有效的检索并组织呈现出来有着巨大的应用前景。搜索引擎作为一个辅助人们检索信息的工具,用户可以从中获得想要的数据,但是也存在者一定的局限性,用户要通过浏览过多不必要的网页查找信息,并不能够快速获得指定数据。从百度贴吧中保存图片,需要打开每一个帖子的链接,然后逐张图片的保存,而保存大量的图片是比较困难的,浪费时间和精力。为了解决这个问题,我编写了这个爬虫程序,用于爬取指定贴吧的指定页面的所有图片。在这个程序中,只要输入想要爬取的贴吧名和想要爬取的起始页、终止页,后台就会自动将指定的图片全部保存到特定的文件中。
2.系统结构

图1 爬虫架构
(1)爬虫的基本流程:
①发起请求:通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers、data等信息,然后等待服务器响应。
②获取响应内容:如果服务器能正常响应,我们会得到一个Response,Response的内容便是所要获取的内容,类型可能有HTML、Json字符串,二进制数据(图片,视频等)等类型。这个过程就是服务器接收客户端的请求,进过解析发送给浏览器的网页HTML文件。
③解析内容:得到的内容可能是HTML,可以使用正则表达式,网页解析库进行解析。也可能是Json,可以直接转为Json对象解析。可能是二进制数据,可以做保存或者进一步处理。
④保存数据:保存的方式可以是把数据存为文本,也可以把数据保存到数据库,或者保存为特定的jpg,mp4 等格式的文件。
(2)工具:
Python软件、Fiddler抓包工具
Fiddler抓包工具:能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据、设置断点、调试web应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是web调试的利器。
(3)原理:
①urllib是python自带的一个包,无需安装,导入即可使用。urllib.request模块主要用来打开或者读取url,urllib.parse模块主要用来解析url。urllib.request这个模块的urlopen函数,会返回一个二进制的对象,对这个对象进行read()操作可以得到一个包含网页的二进制字符串,可以用decode()解码成一段html代码。
②random库中的random.choice()函数可以从任何序列,比如list列表中选取一个随机的元素返回,可以用于字符串、列表、元组等。
③XPath使用路径表达式来选取XML文档中的节点或节点集。节点是通过沿着路径 (path)或者步(steps)来选取的。在Python中使用xpath规则,需要安装LXML库,然后导入etree模块。
④以下为某个贴吧第1页到第4页的URL地址:
https://tieba.baidu.com/f?kw=%E7%8C%AB&ie=utf-8&pn=0
https://tieba.baidu.com/f?kw=%E7%8C%AB&ie=utf-8&pn=50
https://tieba.baidu.com/f?kw=%E7%8C%AB&ie=utf-8&pn=100
https://tieba.baidu.com/f?kw=%E7%8C%AB&ie=utf-8&pn=150
其中ie=utf-8表示用 UTF-8 字符集显示页面,无影响;
通过url编码解码测试,可以看出kw表示贴吧名;
通过分析,可以发现pn用来表示页数,将输入的页数数字转为pn值,即可形成完整的页面url地址。
3.实现代码
(1)从相关库中导入所需的模块
from urllib import request,parse
import ssl
import random
from lxml import etree
(2)为了防止爬虫请求页面失败,造成封IP等后果,所以选择用不同的User-Agent
进行爬虫。用ua_list列表存放一些常见的User-Agent,用于爬虫过程中使用。
ua_list=[
‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1’,
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0’,
‘Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)’,
‘Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)’,
‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201’,
]
(3)加载一个页面
def loadPage(url):
#在ua_list列表中任意选择一个User-Agent
userAgent=random.choice(ua_list)
#请求头
headers={
‘User-Agent’:userAgent
}
#发送请求
req=request.Request(url)
#创建一个未经过验证的上下文(避开系统的验证的步骤)
context=ssl._create_unverified_context()
#打开响应的对象
response=request.urlopen(req,context=context)
#获取网页的内容
html=response.read()
#对unicode编码进行解码
content=html.decode(‘utf-8’)
#使用etree来对html的内容建立文档树
#通过xpath找出帖子的链接
link_list=content.xpath(’//a[contains(@class,“j_th_tit”)]/@href’)
for link in link_list:
fulllink=‘https://tieba.baidu.com’+link
#找出帖子中图片链接
loadImage(fulllink)
(4)加载帖子中的图片的链接
def loadImage(url):
userAgent=random.choice(ua_list)
headers={
‘User-Agent’ : userAgent
}
req=request.Request(url,headers=headers)
context=ssl._create_unverified_context()
response=request.urlopen(req,context=context)
html=response.read()
content=html.decode(‘utf-8’)
# 使用etree来对html的内容建立文档树
content=etree.HTML(content)
#通过xpath找出帖子中图片链接
link_list=content.xpath(’//img[@class=“BDE_Image”]/@src’)
for link in link_list:
#把图片保存到文件中
writeImage(link)
(5)下载图片并保存到本地文件中
def writeImage(url):
userAgent = random.choice(ua_list)
headers={
‘User-Agent’ : userAgent
}
req = request.Request(url,headers=headers)
context=ssl._create_unverified_context()
response = request.urlopen(req,context=context)
image = response.read()
#将图片链接的hash值的后15位设置为文件名
filename = url[-15:]
#输出保存图片的动态过程
print(“正在保存图片”, filename)
#'img/‘表示路径,‘wb’表示以二进制写模式打开文件
f = open(‘img/’ + filename, ‘wb’ )
#往图片写入文件中
f.write(image)
f.close()
(6)设置起始页和终止页
#URL地址中pn与页数page相关,通过转换可以完成完整的链接
def tiebaSpider(url,beginPage,endPage):
for page in range(beginPage,endPage + 1):
pn=(page-1)*50
url+=’&pn=’+str(pn)
loadPage(url)
(7)爬虫入口
if name == ‘main’:
#输入贴吧的名称
kw=input(‘请输入要爬取的贴吧:’)
#输入贴吧要爬取的起始页
beginPage=int(input(‘请输入起始页:’))
endPage=int(input(‘请输入终止页:’))
# 把用户输入的中文通过urlencode进行编码
key=parse.urlencode({‘kw’:kw})
url=‘https://tieba.baidu.com/f?’+ key
#跳转
tiebaSpider(url,beginPage,endPage)

4.实验结果
(1)爬虫猫贴吧



(2)爬虫狗贴吧



5.总结和展望
在这个项目中,我通过对之前学习的Python基础知识的运用,还运用了爬虫过程需要使用的相关模块,下载使用了相关软件,最终完成了项目。项目的目标基本实现,比如可以成功的保存了猫贴吧和狗贴吧中第一页的所有图片到电脑文件夹中。但是程序比较简单,只是单纯的将数据保存到本地中。希望通过之后的学习,可以学习到更多有关爬虫的知识或者Python其他功能的知识。
参考文献:
[1] Python 基础教程 https://www.runoob.com/python/python-tutorial.html
[2] Python爬虫教程 https://www.51zxw.net/list.aspx?cid=732

python爬虫之百度贴吧相关推荐

  1. python爬虫案例——百度贴吧数据采集

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python爬虫案例--百度贴吧数据采集 通过python实现百度贴吧页面的内容采集是相对来说比较容易的,因为百度贴吧不需要登陆,不需要coo ...

  2. python爬虫获取百度贴吧内容

    python爬虫获取百度贴吧内容 python爬虫获取百度贴吧内容 *声明:本文仅供学习交流使用,请勿用于商业用途,违者后果自负.* python爬虫获取百度贴吧内容 博主是一个比较懒的人,不会按时更 ...

  3. Python 爬虫 - 获取百度关键字搜索内容

    Python 爬虫 获取百度关键字搜索内容 https://www.cnblogs.com/w0000/p/bd_search_page.html Github headers内的参数,仅有UA时,返 ...

  4. 爬虫python下载-如何用Python爬虫实现百度图片自动下载?

    制作爬虫的步骤 制作一个爬虫一般分以下几个步骤: 分析需求 分析网页源代码,配合开发者工具 编写正则表达式或者XPath表达式 正式编写 python 爬虫代码 效果预览 运行效果如下: 存放图片的文 ...

  5. 【python 爬虫】百度手机助手爬虫

    一.需求分析: 抓取百度手机助手软件应用,导出EXCEL和插入mysql.字段包括: 1. app_name:应用名称2. app_pic:应用logo3. app_score:应用评分4. app_ ...

  6. 简单几步实现网络音乐播放器(Python爬虫版百度FM)

    Python入门之爬取百度音乐 先说一下为什么会有这篇文章,首先肯定是有这个需求了,本人出差在外地,这里的网速卡到爆,根本支撑不了在线听歌的要求,所以就想下载到本地来慢慢听.这可是python的绝活, ...

  7. python爬虫--【百度知道】自动答题

    做的第一个python爬虫类项目,刚开始学,如有错误,指出无妨 百度知道自动答题 功能 访问百度知道,我们会看到有很多新的提问. 其实很多提问已经有人做了解释或者网上可以找到现成的答案. 因此,一方面 ...

  8. 利用Python爬虫从百度百科获取全国所有县区的地理信息

      最近因为工作需要,需要从百度百科获得全国近3000个县区的位置.地貌.气候.水文等地理信息.因为自己对爬虫有些兴趣,就尝试用Python爬虫来获得这些数据,也算是自己对爬虫的学习过程吧.因为学习爬 ...

  9. 用Python爬虫获取百度企业信用中企业基本信息!太厉害了!

    一.背景 希望根据企业名称查询其经纬度,所在的省份.城市等信息.直接将企业名称传给百度地图提供的API,得到的经纬度是非常不准确的,因此希望获取企业完整的地理位置,这样传给API后结果会更加准确.百度 ...

  10. python爬百度翻译-python爬虫实现百度翻译

    简述: 最近在学习python,就开始研究爬虫,写了个简单的程序 实现功能: 百度翻译 思路: 通过浏览器的开发者工具,发现百度翻译的接口和翻译所需要发送的数据包,通过python实现模拟浏览器进行百 ...

最新文章

  1. linux 终端什么意思,请问我的终端显示的是什么意思
  2. I/O端口和I/O内存
  3. VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...
  4. SQL(四) - 子查询和union以及limit分页
  5. 游族网络回应被新浪财团收购:有相关计划 但对方身份尚不知情
  6. 常用的php.ini 配置选项
  7. iOS中转义后的html标签如何还原
  8. 几种分页方法效率比较
  9. win10桌面显示计算机及网上邻居,Win10网上邻居在哪? Win10桌面显示网上邻居网络图方法...
  10. UEFI Shell编程和使用
  11. 【css】fa图标变细
  12. Firefox 使用常见问题和解决方法
  13. 从零开始搭建 Filecoin 主网挖矿集群
  14. Calendar 获取指定时间
  15. 从零起步认识XAML
  16. [1]无线通信--介绍基本概念
  17. html中写meta会乱码,网页html代码不可缺少的5个meta标签属性
  18. c语言——do……while循环
  19. 什么是 APN、CMWAP、CMNET?
  20. android 图像对比度,关于opengl-es:Android-OpenGL-ES-反相曝光对比度饱和度色调滤镜

热门文章

  1. 【NOIP2017】宝藏
  2. 【常见c语言笔试题嵌入式软件开发1】
  3. json html api文档,插件 jQuery.jsonview 中文 API 文档
  4. 变频器调试工具:ABB Drive Composer
  5. linux安装yum报错Unable to locate package yum解决方案
  6. HowNet介绍及相关API的使用方法
  7. HowNet文件介绍
  8. 多人语音聊天社交app源码,语音聊天的优势是什么,语音系统源码开发
  9. c语言 16进制编辑器,十六进制编辑器(010 Editor 32位)
  10. 蜗牛星际D款安装黑群晖教程