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