Python 网络爬虫之 百度贴吧原创小说

许多人喜欢看小说吧,我特别喜欢看(以前特别喜欢天蚕土豆的,如今他已经让我们伤透了心,一部大主宰追了三四年。。。。)
好了,言归正传。我经常上贴吧去追新,(不舍得花钱啊)
`哈哈,好了,我们这次要爬取的是百度的小说吧,其他吧也是一样的。

#-*- coding:utf-8
import urllib2
import re

记住爬虫的原理是从网页源码上获取数据。
所以说首先得获取网页源码:
关键词:urllib2 urlopen read

class BDTB:
    baseUrl = 'https://tieba.baidu.com/p/5105542905?see_lz=1' #只看楼主地址

    #获取网页源码
    def getPage(self):
        url = self.baseUrl
        request = urllib2.Request(url) #
        response = urllib2.urlopen(request).read() #打开网页获取源码
        print response #这里可打印可不,为了显示效果
        return response

2、匹配标题
涉及到正则表达式
findall (正则,源码)—–返回列表

在源码找到标题标签。
在源码中找到 h3(此乃标题标签) ctrl+c

    def Title(self):
        html = self.getPage() #调用获取源码
        """写正则了"""
        """ 这里的r可写可不写,为了编译,提高效率,防止转义"""
        reg = re.compile(r'<h3 class="core_title_txt pull-left text-overflow  " title="(.*?)" style')
        """正则表达式==上面的"""
        items = re.findall(reg,html)
        print items[0]

将上面那定义的函数放进BDTB初始类里面:

在这里顺便说一句(也是挺一个很好的老师说的):许多人对于爬虫,都希望直接获得那个爬虫的源码,这个是没有用的。网站这个千变万化,每天都在变化,所以思路+方法才是重要的。。

re.compile(r'<h3 class="core_title_txt pull-left text-overflow  " title="(.*?)" style')

这句是为了获取我们所需要的内容,
举个例子:
这里写图片描述
图中1处表示我们在进行只看楼主下的网址帖子地址

”lz=1这个地方是可以修改的,这个下次在说这个“
看下源码把:
网页源码
这个步骤我们是要找到标题,所以有一个方便的方法就是:ctrl + f —->输入 h3(h3 是标题的标签)
(如果不太东的话,可以取看看html网页之类的书籍,其实对于这中简单的不懂也没事)

<h3 class="core_title_txt pull-left text-overflow  " title="【原创】《锋寒阳》 仙侠/文/风中吊车" style="width: 396px">【原创】《锋寒阳》 仙侠/文/风中吊车</h3>

和上面函数中做比较,你会发现,多了很多,,
这里我们要获取其中的标题:即 【原创】《锋寒阳》 仙侠/文/风中吊车
剩下的我们都不想要,所以可以用一个正则表达式进行匹配 注意到没 : (.*?)

好了,我们可以打印下看下效果:
这里写图片描述

看到没,得到了需要的标题
然后有人问,我们就这样在pycharm里面堵小说吗? 着不方便把,所以接下来要做的就是把爬取到的内容存入我们的文档之中。

 #匹配标题
    def Title(self):
        html = self.getPage() #调用获取源码
        """写正则了"""
        """ 这里的r可写可不写,为了编译,提高效率,防止转义"""
        reg = re.compile(r'<h3 class="core_title_txt pull-left text-overflow  " title="(.*?)" style')
        """正则表达式==上面的"""
        items = re.findall(reg,html)
        # print items[0]
        """切片操作(或者循环 for in操作:如下),
        吧第一个元素取出来,中文在可迭代对象里面就是unicode编码"""
        for item in items:
            print item
            """写入文档"""
            f = open('xiaoshuo.txt','w')  #自己去查询百度
            f.write('标题'+'\t'+item) #写入
            f.close()
        return items

写文件的操作这里就不多说了啊,大家自己去问度娘就好了(很简单的)
再 打印下,看下效果
这里写图片描述这里写图片描述
上面那个这个是没打之前的,下面是打印之后的,会发现多了个txt
打开你会发现,里面就会有我们爬取到的 标题
好的,接下来,就要爬取正文了
(其实方法都差不多,重要的还是着个中间的正则表达式 的表示了)

 #匹配正文
    def Text(self):
        html = self.getPage()
        reg = re.compile(r'class="d_post_content j_d_post_content ">  (.*?)</div><br> ',re.S)
        req = re.findall(reg,html)
        # print req

        #compile 编译,他提高效率
        #这里的class 是给属性命名的意思
        for i in req:
            # print i
            """爬取正文后,  过滤--首先正则,用空格代替"""
            removedAddr = re.compile('<a.*?>|</a>')
            removedddr = re.compile('<img.*?>')
            removedaddr =re.compile('http.*?.html')
            """ sub  在正文i中找到杂质removedaddr,然后用空格代替"""
            """sub(不要的字符,代替的内容,正文)"""
            i = re.sub(removedAddr,"",i)
            i = re.sub(removedaddr,"",i)
            i = re.sub(removedddr,"",i)
            i = re.sub('<br>',"",i)
            print i
            f = open('xiaoshuo.txt','a')
            f.write('\n\n'+i)
            f.close()

re.compile()这个中间我们同样的要去看网页源码
这里写图片描述

重要的还是 compile 和 findall 函数,注意这里的用法
然后打印下
这里写图片描述
文档的存储,你会发现我们爬取的内容已经写入到 txt 中了

这里写图片描述

好了,到此为止,帖子的小说就可以在自己的txt中读取了,哈哈

自己写的不是很好,有许多不足之处,望不喷啊,可以
多多交流

附上完整代码:

# -*- coding:utf-8
import urllib2,re

class BDTB:
    baseUrl = 'https://tieba.baidu.com/p/5105937807?see_lz=1' #只看楼主地址

    #获取网页源码
    def getPage(self):
        url = self.baseUrl
        request = urllib2.Request(url) #
        response = urllib2.urlopen(request).read() #打开网页获取源码
        # print response
        return response

    #匹配标题
    def Title(self):
        html = self.getPage() #调用获取源码
        """写正则了"""
        """ 这里的r可写可不写,为了编译,提高效率,防止转义"""
        reg = re.compile(r'<h3 class="core_title_txt pull-left text-overflow  " title="(.*?)" style')
        """正则表达式==上面的"""
        items = re.findall(reg,html)
        # print items[0]  #切片操作(或者循环 for in操作:如下),吧第一个元素取出来,中文在可迭代对象里面就是unicode编码
        for item in items:
            print item
            """写入文档"""
            f = open('xiaoshuo.txt','w')  #自己去查询百度
            f.write('标题'+'\t'+item) #写入
            f.close()

        return items

    #匹配正文
    def Text(self):
        html = self.getPage()
        reg = re.compile(r'class="d_post_content j_d_post_content ">  (.*?)</div><br> ',re.S)
        req = re.findall(reg,html)
        # print req

        #compile 编译,他提高效率
        #这里的class 是给属性命名的意思
        for i in req:
            # print i
            """爬取正文后,  过滤--首先正则,用空格代替"""
            removedAddr = re.compile('<a.*?>|</a>')
            removedddr = re.compile('<img.*?>')
            removedaddr =re.compile('http.*?.html')
            """ sub  在正文i中找到杂质removedaddr,然后用空格代替"""
            """sub(不要的字符,代替的内容,正文)"""
            i = re.sub(removedAddr,"",i)
            i = re.sub(removedaddr,"",i)
            i = re.sub(removedddr,"",i)
            i = re.sub('<br>',"",i)
            print i
            f = open('xiaoshuo.txt','a')
            f.write('\n\n'+i)
            f.close()




bdtb = BDTB() #实例化一个类
bdtb.getPage()
bdtb.Title()
bdtb.Text()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值