您的位置:首页 > 理论基础 > 计算机网络

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

2017-05-08 17:16 411 查看
许多人喜欢看小说吧,我特别喜欢看(以前特别喜欢天蚕土豆的,如今他已经让我们伤透了心,一部大主宰追了三四年。。。。)

好了,言归正传。我经常上贴吧去追新,(不舍得花钱啊)

`哈哈,好了,我们这次要爬取的是百度的小说吧,其他吧也是一样的。

#-*- 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

打开你会发现,里面就会有我们爬取到的 标题

好的,
4000
接下来,就要爬取正文了

(其实方法都差不多,重要的还是着个中间的正则表达式 的表示了)

#匹配正文
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络爬虫 python 源码