python爬取贴吧所有帖子-python爬取贴吧帖子
一、介绍
我们常遇到一些很长的贴吧连载帖子想存到本地再看
此文就是运用python爬取指定百度贴吧的帖子并存到本地满足需求
环境:python2.7
目标网页:【长篇连载】剑网3的正史和野史——从头开始讲剧情故事
源码存放:源码github
本文参考:静觅博客python实战系列
二、页面的抓取
目标网页网址为https://tieba.baidu.com/p/2196794546
满足可以选择是否只看楼主的抓取我们点一下 只看楼主 并点一下后页的链接来获取只看楼主和翻页的参数
这时候可以看到只看楼主多出的参数 see_lz 和当前页的参数 pn
接下来定义一个DEMO类开始获取整个网页
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
class DEMO:
def __init__(self,baseUrl):
self.baseURL = baseUrl
def getPage(self):
url = baseURL
request = urllib2.Request(url)
response = urllib2.urlopen(request)
print response.read()
baseURL = 'https://tieba.baidu.com/p/2196794546?see_lz=1&pn=3'
demo = DEMO(baseURL)
demo.getPage()
运行结果:
爬取网页代码成功后我们完善一下代码,将只看楼主和页码提为参数
def __init__(self,baseUrl,seeLZ):
self.baseURL = baseUrl
self.seeLZ = '?see_lz=' +str(seeLZ)
self.tool = Tool()
def getPage(self,pageNum):
try:
url = self.baseURL+self.seeLZ + '&pn=' + str(pageNum)
request = urllib2.Request(url)
response = urllib2.urlopen(request)
return response.read().decode('utf-8')
except urllib2.URLError, e:
if hasattr(e,"reson"):
print u"链接失败,原因:",e.reason
return None
三、提取出想要的信息
打开目标网页审查元素(F12)
首先找到帖子标题的代码段:
【长篇连载】剑网3的正史和野史——从头开始讲剧情故事
我们将提取此
里的文本则正则表达式为:
(.*?)
接下来我们就可以写一个提取标题的方法:
def getTitle(self,title):
page = self.getPage(1)
pattern = re.compile('
(.*?)
',re.S)
result = re.search(pattern,page)
if result:
return result.group(1).strip()
else:
return None
同理找到帖子页数的代码段,可得出提取页数的正则:
.*?(.*?)
提取页数的方法:
def getPageNum(self,page):
page = self.getPage(1)
pattern = re.compile('
.*?(.*?)',re.S)
result = re.search(pattern,page)
if result:
return result.group(1).strip()
else:
return None
接下来是我们主要目的,提取正文,正则为:
这个正则提取出来的只是div里面的文本内容,它还会包括了图片标签,换行符,段落符等的标签。所以我们还需处理一下。
这时候添加一个类利用正则将这些标签都替换掉
class Tool:
removeImg = re.compile('| {7}|')
removeAddr = re.compile('|')
replaceLine = re.compile('
|
|')
replaceTD = re.compile('
')
replacePara = re.compile('
')
replaceBR = re.compile('
')
replaceBR = re.compile('
|
')
removeExtraTag = re.compile('<.*?')
def replace(self,x):
x = re.sub(self.removeImg,"",x)
x = re.sub(self.removeAddr,"",x)
x = re.sub(self.replaceLine," ",x)
x = re.sub(self.replaceTD," ",x)
x = re.sub(self.replacePara," ",x)
x = re.sub(self.replaceBR," ",x)
x = re.sub(self.removeExtraTag,"",x)
return x.strip()
初始化类后,我们可以写提取正文的方法:
def getContent(self,page):
pattern = re.compile('
',re.S)
items = re.findall(pattern,page)
contents = []
for item in items:
content = " " + self.tool.replace(item) + ' '
contents.append(content.encode('utf-8'))
return contents
四、写入文件,保存为txt
def setFileTitle(self,title):
if title is not None:
self.file = open(title + ".txt","w+")
else:
self.file = open(self.defaultTitle + ".txt","w+")
def writeData(self,contents):
for item in contents:
self.file.write(item)
五、完善代码
有了以上的方法作为基础,我们来写运行的方法:
def start(self):
indexPage = self.getPage(1)
pageNum = self.getPageNum(indexPage)
title = self.getTitle(indexPage)
self.setFileTitle(title)
if pageNum == None:
print "URL已失效,请重试"
return None
try:
print "该帖子共有" + str(pageNum) + "页"
for i in range(1,int(pageNum)+1):
print "正在写入第" + str(i) + "页数据"
page = self.getPage(i)
contents = self.getContent(page)
self.writeData(contents)
except IOError,e:
print "写入异常,原因" + e.message
finally:
print "写入任务完成"
此时完成的代码:
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
class Tool:
removeImg = re.compile('| {7}|')
removeAddr = re.compile('|')
replaceLine = re.compile('
|
|')
replaceTD = re.compile('
')
replacePara = re.compile('
')
replaceBR = re.compile('
')
replaceBR = re.compile('
|
')
removeExtraTag = re.compile('<.*?')
def replace(self,x):
x = re.sub(self.removeImg,"",x)
x = re.sub(self.removeAddr,"",x)
x = re.sub(self.replaceLine," ",x)
x = re.sub(self.replaceTD," ",x)
x = re.sub(self.replacePara," ",x)
x = re.sub(self.replaceBR," ",x)
x = re.sub(self.removeExtraTag,"",x)
return x.strip()
class DEMO:
def __init__(self,baseUrl,seeLZ):
self.baseURL = baseUrl
self.seeLZ = '?see_lz=' +str(seeLZ)
self.tool = Tool()
def getPage(self,pageNum):
try:
url = self.baseURL+self.seeLZ + '&pn=' + str(pageNum)
request = urllib2.Request(url)
response = urllib2.urlopen(request)
return response.read().decode('utf-8')
except urllib2.URLError, e:
if hasattr(e,"reson"):
print u"链接失败,原因:",e.reason
return None
def getTitle(self,title):
page = self.getPage(1)
pattern = re.compile('
(.*?)
',re.S)
result = re.search(pattern,page)
if result:
return result.group(1).strip()
else:
return None
def getPageNum(self,page):
page = self.getPage(1)
pattern = re.compile('
.*?(.*?)',re.S)
result = re.search(pattern,page)
if result:
return result.group(1).strip()
else:
return None
def getContent(self,page):
pattern = re.compile('
',re.S)
items = re.findall(pattern,page)
contents = []
for item in items:
content = " " + self.tool.replace(item) + ' '
contents.append(content.encode('utf-8'))
return contents
def setFileTitle(self,title):
if title is not None:
self.file = open(title + ".txt","w+")
else:
self.file = open(self.defaultTitle + ".txt","w+")
def writeData(self,contents):
for item in contents:
self.file.write(item)
def start(self):
indexPage = self.getPage(1)
pageNum = self.getPageNum(indexPage)
title = self.getTitle(indexPage)
self.setFileTitle(title)
if pageNum == None:
print "URL已失效,请重试"
return None
try:
print "该帖子共有" + str(pageNum) + "页"
for i in range(1,int(pageNum)+1):
print "正在写入第" + str(i) + "页数据"
page = self.getPage(i)
contents = self.getContent(page)
self.writeData(contents)
except IOError,e:
print "写入异常,原因" + e.message
finally:
print "写入任务完成"
print u"请输入帖子代号"
baseURL = 'http://tieba.baidu.com/p/' + str(raw_input(u'http://tieba.baidu.com/p/'))
seeLZ = raw_input("是否只获取楼主发言,是输入1,否输入0 ")
demo = DEMO(baseURL,seeLZ)
demo.start()
好我们来运行一下试试:
到这里输入目标网页的代号:
整个运行过程:
好,这时候该目录下多了这个txt文件,打开看看
文本已经成功存到本地,到这里就成功了。
python爬取贴吧所有帖子-python爬取贴吧帖子相关推荐
- python爬取贴吧所有帖子-Python爬虫实例(一)爬取百度贴吧帖子中的图片
程序功能说明:爬取百度贴吧帖子中的图片,用户输入贴吧名称和要爬取的起始和终止页数即可进行爬取. 思路分析: 一.指定贴吧url的获取 例如我们进入秦时明月吧,提取并分析其有效url如下 ?后面为查询字 ...
- python爬虫之汽车之家论坛帖子内容爬取
Datawhale爬虫 第五期 Day7 实战项目:汽车之家车型论坛帖子信息 作为国内目前第一大汽车论坛,反爬虫很恶心,中间很多坑. 新手,第一次搞这么复杂的爬虫,前期没有排查,都是遇到坑的时候再返回 ...
- python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC
首先介绍一下scrapy. Scrapy一个开源和协作的框架,是为了页面抓取所设计的,使用它可以快速.简单.可扩展(通过中间件)的方式从网站中提取所需的数据. 工作流程如下 Scrapy Engine ...
- python爬取行业数据_用Python进行Web爬取数据
介绍 我们拥有的数据太少,无法建立机器学习模型.我们需要更多数据! 如果这句话听起来很熟悉,那么你并不孤单!希望获得更多数据来训练我们的机器学习模型是一个一直困扰人们的问题.我们无法在数据科学项目中获 ...
- 如何用python爬取数据_入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法...
作者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhya 总览 Web抓取是一种从网站提取数据的高效方法(取决于网站的规定) 了解如何使用流行的BeautifulSoup ...
- python中plguba_Python量化交易进阶讲堂-爬虫抓取东方财富网股吧帖子
欢迎大家订阅<Python实战-构建基于股票的量化交易系统>小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍.本篇专栏为小册子内容的加推篇!!! 前言 ...
- python爬贴吧回复_通过python爬取贴吧数据并保存为word
前言 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发 ...
- python爬取网页书籍名称代码_python爬取亚马逊书籍信息代码分享
我有个需求就是抓取一些简单的书籍信息存储到mysql数据库,例如,封面图片,书名,类型,作者,简历,出版社,语种. 我比较之后,决定在亚马逊来实现我的需求. 我分析网站后发现,亚马逊有个高级搜索的功能 ...
- python爬虫怎么爬同一个网站的多页数据-如何用Python爬数据?(一)网页抓取
如何用Python爬数据?(一)网页抓取 你期待已久的Python网络数据爬虫教程来了.本文为你演示如何从网页里找到感兴趣的链接和说明文字,抓取并存储到Excel. 需求 我在公众号后台,经常可以收到 ...
- 在当当买了python怎么下载源代码-爬虫实战一:爬取当当网所有 Python 书籍
图片来自 unsplash 我们已经学习 urllib.re.BeautifulSoup 这三个库的用法.但只是停留在理论层面上,还需实践来检验学习成果.因此,本文主要讲解如何利用我们刚才的几个库去实 ...
最新文章
- 【ThinkPHP3.2.3】学习ThinkPHP笔记:框架中的配置文件(3)
- Pangolin在cmake时报“Could NOT find GLEW”错误
- 长方形与圆最近连线LISP_编写一个AutoLISP程序,画出一个边长为A的正方形,以及该正方形的内切圆,正方形的底边与正X轴的夹角为ANG...
- 响应QML中的用户输入
- 【数据结构总结】第四章:串、数组和广义表(线性结构)
- 面试最后HR都要问一句有没有什么问题要问我?
- Kerberos 基本命令 - 持续更新
- ubuntu 修改默认用户名_Tars框架在Ubuntu上的部署小结
- 百度seo排名规则_SEO界的潜规则(百度死不承认的SEO秘密)
- 自学单片机能找到工作吗?能有出路吗?
- caffe:将mean.binaryproto文件转化为mean.npy文件
- html5 鼠标双击,鼠标双击或触摸双击事件检测jQuery插件
- 学院开展计算机基础知识比赛,信阳师范学院顺利举办第七届计算机基础知识决赛...
- 10019---JavaWeb基础--EL
- 浅谈MySQL中优化sql语句查询常用的30种方法
- python保存requests请求的文件的实战代码
- Linux安装mysql并配置外网访问
- 【Jquery】jquery-qrcode把域名地址生成二维码图片,扫码即可访问
- php获取本机IP地址
- 使用第三方软件设置在线客服系统——iBangKF网站免费在线客服系统
热门文章
- android listview 不显示_ListView详细介绍与使用
- mac brew 安装
- Dlib——C++机器学习库,有传统机器学习的,也有深度学习的
- 卷积神经网络——本质上是在利用卷积做特征压缩,然后再全连接
- python spark 求解最大 最小 平均
- centos7 php安装
- Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)
- Java小案例——使用双重for循环实现杨辉三角的输出
- C# Message 消息处理
- spark 源码分析 Blockmanager