文档章节

python爬虫爬取NBA贴吧的所有精品贴

zhaobig
 zhaobig
发布于 2017/09/11 20:35
字数 1591
阅读 6
收藏 0
点赞 0
评论 0
首先用直接的方法写,先尝试下能否爬取成功 #coding:utf-8 import urllib2,urllib
import re
''' 1.准备url地址 2.准备请求头 3.创建请求对象 4.发起请求获取第一页源代码,接收响应 5.通过第一页源代码,找到总页数和标题 6.for循环执行总页数次  6.1 根据页码拼接完整的URL地址  6.2 创建request对象,发起请求,接受响应  6.3 根据正则匹配数据,包含用户名和帖子内容  6.4 去除、替换数据中的html标签  6.5 写入本地文件 ''' ide = raw_input('请输入要爬取的帖子的编号:')
#1准备url地址 url = 'https://tieba.baidu.com/p/'+ide
#2准备请求头 headers = {
    'User-Agent':'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50' }
#3创建请求对象 request = urllib2.Request(url,headers=headers)
#4发起请求获取第一页源代码,接受响应 response = urllib2.urlopen(request)
# 5.通过第一页源代码,找到总页数和标题 #5.1准备正则 pattern = re.compile(r'<li class="l_reply_num.*?<span.*?<span class="red">(.*?)</span>',re.S)
#5.2查找对应正则的数据 html = response.read()
rs = re.search(pattern,html)
#5.3把字符串页数转换为数字 total = int(rs.group(1))
# 5.4 正则匹配标题 tit_pattern = re.compile(r'<h\d class="core_title_txt.*?>(.*?)</h\d>',re.S)
#5.5从源代码中搜索标题 rs = re.search(tit_pattern,html)
print rs.group(1)
title = rs.group(1)
#拼接文件名 #decode()解码,网页中的字符是utf-8编码,在python中使用的字符串都是Unicode编码,所以需要转换 filename = "%s.txt"%title.decode('utf-8')
#打开文件 file = open(filename,'w')
print '正在爬取%s,共%s页数据'%(title,total)
#6.for循环执行总页数次 for x in range(1,total+1):
    print '正在爬取第%s页数据'%x
    # 6.1根据页码拼接完整的URL地址  getUrl = url+'?pn=%s'%x
    # 6.2创建request对象,发起请求,接受响应  request = urllib2.Request(getUrl,headers=headers)
    response = urllib2.urlopen(request)
    html = response.read()
    # 6.3根据正则匹配数据,包含用户名和帖子内容  con_pattern = re.compile(r'<ul class="p_author.*?<li class="d_name.*?<a.*?>(.*?)</a>.*?<div id="post_content_.*?>(.*?)</div>',re.S)
    rs = re.findall(con_pattern,html)
    # 6.4去除、替换数据中的html标签  #1.用户名中的img标签  #2.去除帖子内容中的img标签  #3.去掉帖子内容部分的空格  #4.替换帖子中的内容部分  for r in rs:
        remove_img = re.compile(r'<img.*?>',re.S)
        remove_k = re.compile(r' {10}',re.S)
        replace_br = re.compile(r'<br>|<br/>',re.S)
        remove_ele = re.compile(r'<.*?>',re.S)
        #1 去除name中的img  name = re.sub(remove_img,'',r[0])
        #2 去除内容中的img  content = re.sub(remove_img,'',r[1])
        # 3 去除内容中的空格  content = re.sub(remove_k,'',content)
        # 4 替换内容的br  content = re.sub(replace_br,r'\n',content)
        # 5 去除所有标html签  content = re.sub(remove_ele,'',content)
    # 6.5写入本地文件  file.write('---------------------------------------------------------')
        file.write('\n')
        file.write(name)
        file.write('\n')
        file.write(content)
file.close()
print '数据爬取完成!' **************************************************************************************** #执行程序,能够爬取成功,再进一步升级,用类和对象的方法来写,作进一步的尝试,先通过输入编号,爬取一个帖子的内容 
****************************************************************************************
#coding:utf-8
import urllib2
import re
#工具类
class Tools(object):
    #1.正则
    remove_img = re.compile(r'<img.*?>',re.S)
    remove_k = re.compile(r' {10}')
    replace_br = re.compile(r'<br>|<br/>')
    remove_ele = re.compile(r'<.*?>',re.S)
    #替换文本的函数
    def replace_txt(self,rs):
        name = re.sub(self.remove_img,'',rs[0])
        content = re.sub(self.remove_img,'',rs[1])
        content = re.sub(self.remove_k,'',content)
        content = re.sub(self.replace_br,r'\n',content)
        content = re.sub(self.remove_ele,r'',content)
        #返回替换完成的元组
        return (name,content)
#百度贴吧爬虫类
class BDTB(object):
    def __init__(self,numbers):
        #根据帖子编号拼接url地址
        self.url = 'https://tieba.baidu.com/p/'+numbers
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'
        }
        #初始化工具类对象
        self.tool = Tools()
    #获取某一页的html源代码
    def get_page(self,pageNum):
        #根据页码拼接完整的url地址
        getUrl = self.url+"?"+"pn=%s"%pageNum
        #创建request对象
        request = urllib2.Request(getUrl,headers=self.headers)
        try:
            #发起请求接收响应
            response = urllib2.urlopen(request)
        except(urllib2.HTTPError,Exception),e:
            print '获取第%s页数据失败,原因%s'%(pageNum,e)
            return None
        else:
            #如果没有异常,返回html源代码
            return response.read()
    #从第一页中提取总页数和标题
    def get_title_total(self,html):
        #1.准备正则
        tit_pattern = re.compile(r'<h\d class="core_title_txt.*?>(.*?)</h\d>',re.S)
        # 2.查找
        tit_rs = re.search(tit_pattern,html)
        # 3 .记录标题
        self.title = tit_rs.group(1)
        #1 查找总页数正则
        total_pattern = re.compile(r'<li class="l_reply_num.*?<span.*?<span class="red">(.*?)</span>',re.S)
        # 2 查找
        total_rs = re.search(total_pattern,html)
        # 3 记录总页数
        self.total = int(total_rs.group(1))
    #从html源代码中提取数据
    def get_data(self,html):
        # 1 准备正则
        pattern = re.compile(r'<ul class="p_author.*?<li class="d_name.*?<a.*?>(.*?)</a>.*?<div id="post_content_.*?>(.*?)</div>',re.S)
        # 2 查找
        results = re.findall(pattern,html)
        ok_results = []
        for rs in results:
            #替换数据中的html标签
            ok_rs = self.tool.replace_txt(rs)
            ok_results.append(ok_rs)
        #返回替换完成后的结果列表
        return ok_results
    # 写入本地文件
    def write_data(self,results):
        for rs in results:
            self.file.write('------------------------------------')
            self.file.write(rs[0])
            self.file.write('\n')
            self.file.write(rs[1])
            self.file.write('\n')
    #开始爬虫函数
    def start(self):
        #1.获取第一页的HTML源代码
        html = self.get_page(1)
        if html == None:
            print '连接百度失败,请稍后重试、、、、、'
            return
        #2.从第一页源代码中获取总页数和标题
        self.get_title_total(html)
        print '正在爬取帖子:%s,共%s页数据。。。'%(self.title,self.total)
        #3.打开文件,用属性记录这个文件对象,方便后面使用
        filename = '%s.txt'%self.title.decode('utf-8')
        self.file = open(filename,'w')
        #for循环 循环总页数次
        for x in range(1,self.total+1):
            print '正在爬取第%s页:'%x
            #1 根据页码获取该页的HTML源代码
            html = self.get_page(x)
            if html == None:
                continue
            #2 从html源代码中提取数据
            results = self.get_data(html)
            #3 写入本地文件
            self.write_data(results)
        #3 .关闭文件
        self.file.close()
if __name__ =='__main__':
    numbers = raw_input('请输入要爬取的帖子编号:')
    bdtb = BDTB(numbers)
    bdtb.start()
*****************************************************************************************
#再进一步升级爬取所有精品贴内容
*****************************************************************************************
#coding:utf-8
import urllib2
import re
from tieba_class import  BDTB
import time
#爬取精品贴页面所有的帖子编码
class JPT(object):
    def __init__(self):
        self.url = 'https://tieba.baidu.com/f/good?kw=nba&tab=good'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
        }
    #获取精品贴的HTMl源代码
    def get_page(self):
        # 创建对象发起请求
        request = urllib2.Request(self.url, headers=self.headers)
        try:
            response = urllib2.urlopen(request)
        except(urllib2.URLError, Exception), e:
            print '获取精品贴失败,%s' % e
        else:
            return response.read()
    def get_data(self,html):
        #1.准备正则
        pattern = re.compile(r'<div class="threadlist_title.*?href="/p/(.*?)"',re.S)
        results = re.findall(pattern,html)
        return results
    def start(self):
        #1.获取精品贴的HTML源代码
        html = self.get_page()
        #2.从精品贴源代码中提取帖子编号
        results = self.get_data(html)
        #for 循环遍历帖子编号,爬取内容
        #创建BDTB对象,传入帖子编号
        for numbers in results:
            bdtb = BDTB(numbers)
            bdtb.start()
            time.sleep(2)
if __name__ == '__main__':
    jpt = JPT()
    jpt.start()

© 著作权归作者所有

共有 人打赏支持
zhaobig
粉丝 0
博文 5
码字总数 5529
作品 0
省直辖县级行政区划
5个python爬虫教材,让小白也有爬虫可写,含视频教程!

认识爬虫   网络爬虫,如果互联网是一张蜘蛛网,网络爬虫既是一个在此网上爬行的蜘蛛,爬了多少路程即获取到多少数据。 python写爬虫的优势   其实以上功能很多语言和工具都能做,但是用...

柯西带你学编程 ⋅ 06/12 ⋅ 0

手把手教你写网络爬虫(2):迷你爬虫架构

原文出处:拓海 介绍 大家好!回顾上一期,我们在介绍了爬虫的基本概念之后,就利用各种工具横冲直撞的完成了一个小爬虫,目的就是猛、糙、快,方便初学者上手,建立信心。对于有一定基础的读...

拓海 ⋅ 04/27 ⋅ 0

一个月入门Python爬虫,快速获取大规模数据

数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣、知乎:爬取优质答案,筛选出各话题下热门内容,探索...

Python开发者 ⋅ 04/25 ⋅ 0

实战(一)之使用自带urllib和re正则表达式获取电影详情页链接

一、关于urllib库 网上urllib库的教程文章非常多而且详细具体,我就不过多叙述和重复了,个人更加倾向于将精力放在实战上,而不是反反复复拷贝教程(其实是因为我懒),来几篇干货参考。 py...

鱼头豆腐文 ⋅ 2017/12/04 ⋅ 0

高级爬虫(一):Scrapy爬虫框架的安装

Hi 小伙伴们差不多有半个月没有更新干货了,一直有点忙,而且这中间还有曲折过程,也就没有更新文章. 但今天无论如何也要更新一篇文章,接下来是爬虫高级篇重点讲解的地方! 最近会连载Scrap...

Python绿色通道 ⋅ 04/22 ⋅ 0

福利 | Python专场竞技,这些书给你加把力!

端午节将至,各地龙舟备战竞技,粽子部队也整装待发。小编掐指一算,这种热闹的时节,是时候展现真正的技(fu)术(li)了! (“Python号”龙舟闪亮登场!) Python作为当下最流行的编程语言...

⋅ 06/15 ⋅ 0

菜鸟学Python,上半年文章大汇总

一晃大半年过去了,时间过的真快啊!上半年我一共发表了原创的文章有近45篇,其中有一些是粉丝投稿的!后台总有人留言说查找历史文章不方便,怎么办?为了方便大家阅读,我把上半年的原创文章...

菜鸟学python ⋅ 昨天 ⋅ 0

5.2 高富帅python-人工智能时代

小奈:其实你们写的代码好像有不同派系的? 大仁:你是说编程语言?我来介绍下吧,我们来看下GitHub(程序员同城交友、代码协作平台)的数据,看下各种编程语言 Pull Requst的数据, Javascr...

产品经理的技术课堂 ⋅ 05/11 ⋅ 0

资深程序员为大家带来30分钟Python 爬虫教程!能看懂就能学会!

图片来源:Blake Connally 发布于Unsplash.com 简单图片爬虫的原料 简单图片爬虫的菜谱 以上的所有都安装好了?棒!在我们继续开始写代码前,我先来解释一下以上这些原料都是用来干什么的。 ...

python达人 ⋅ 05/15 ⋅ 0

[增强可拓展性]Scrapy博客爬虫

前言 最近赶毕业论文也是心力憔悴,现在写一篇文章谈谈我的毕业设计。 在最初学习Python的时候,爬虫是个不错的练手项目,但是几乎所有的爬虫教程都是教我们如何如何爬一个网站。 比如我写的...

3inchtime ⋅ 06/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

istio 文档

https://istio.io/docs/concepts/ https://istio.io/docs/concepts/traffic-management/handling-failures/ https://istio.io/docs/concepts/traffic-management/rules-configuration/......

xiaomin0322 ⋅ 20分钟前 ⋅ 0

编程语言的作用及与操作系统和硬件的关系

一、编程语言的作用及与操作系统和硬件的关系 作用:编程语言是计算机语言,是一种程序员与计算机之间沟通的介质,通过编程语言可以使得计算机能够根据人的指令一步一步去工作,完成某种特定...

slagga ⋅ 30分钟前 ⋅ 0

runtime实现按钮点击事件

也不能说是实现吧,,,就是有点类似于RAC里边的写法,不用给btn添加另外的点击事件,就那个add...select...这样子很不友好,来看下代码: [self.btn handleControlEvent:UIControlEventTou...

RainOrz ⋅ 31分钟前 ⋅ 0

Windows系统运维转linux系统运维的经历

开篇之前,首先介绍一下我的背景把:我是一个三线城市的甲方运维。最近,在《Linux就该这么学》书籍的影响下和朋友小A(Linux运维已经三年了,工资也比我的高很多)的影响下,决定转行。最近...

linux-tao ⋅ 31分钟前 ⋅ 0

zip压缩工具,tar打包工具

zip压缩工具 zip打包工具跟前面说到的gzip,bz2,xz 工具最大的不一样是zip可以压缩目录。如果没有安装,需要使用yum install -y zip 来安装。安装完之后就可以直接使用了,跟之前提到的压缩...

李超小牛子 ⋅ 39分钟前 ⋅ 0

使用npm发布自己的npm组件包

一、注册npm账号 官网:https://www.npmjs.com/signup 注册之后需要进行邮箱验证,否则后面进行组件包发布时候会提示403错误,让进行邮箱核准。 二、本地新建一个文件夹,cd进入后使用npm i...

灰白发 ⋅ 41分钟前 ⋅ 0

010. 深入JVM学习—垃圾收集策略概览

1. 新生代可用GC策略 1. 串行GC(Serial Copying) 算法:复制(Copying)清理算法; 操作步骤: 扫描年轻代中所有存活的对象; 使用Minor GC进行垃圾回收,同时将存活对象保存到“S0”或“S...

影狼 ⋅ 42分钟前 ⋅ 0

JVM性能调优实践——JVM篇

在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践——性...

Java小铺 ⋅ 43分钟前 ⋅ 0

误关了gitlab sign-in 功能的恢复记录

本想关sign-up的,误点了sign-in 退出后登录界面提示: No authentication methods configured 一脸懵逼.. 百度后众多方案说修改application_settings 的 signin_enabled字段; 实际上新版本字段...

铂金蛋蛋 ⋅ 43分钟前 ⋅ 0

登录后,后续请求接口没有带登录cookie可能原因

1.XMLHttpRequest.withCredentials没设置好,参考https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/withCredentials...

LM_Mike ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部