在网上参考别人的教程实现的python+beautifulsoup爬取百度贴吧的内容。
说一下实现过程,这个主要是用来抓取连载小说的,首先选择一个百度贴吧的网页,点击只看楼主,然后就全是楼主连载的小说了,使用firefox查看元素,这里选取唯一的特定cc标签,然后再进行去除html标签的处理,就可以获得文本了。
问题:1.在使用beautifulsoup时,要注意标签获取时一定要准确,哪怕复杂一点,分几次实现,也要保证准确,否则为空;
2.现在没有实现页数的控制,会一直循环下去,下个版本会改进;
3.在去除html标签时,一开始打算使用re模块的正则实现,发现一直出现错误(但是在单独选取一个html片段时进行是可以实现的),没有找到什么 原因,最后又查到了beautifulsoup的get_text()方法,直接获取内容。
代码如下:
# -*- coding: utf-8 -*-
import re
import urllib
import urllib2
import time
import thread
from bs4 import BeautifulSoup
class baidu_tieba:
header={
'Host':'tieba.baidu.com',
'Connection':'keep-alive',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0',
'Accept-Language': 'zh-CN,zh;q=0.8'
}
def __init__(self):
self.page = 1
self.pages = list()
self.enable = False
self.url = 'http://tieba.baidu.com/p/3434860781?see_lz=1&pn='
def get(self,page):
self.url = self.url + page
req = urllib2.Request(url=self.url,headers=self.header)
result = urllib2.urlopen(req)
result = result.read()
#result = result.decode('gbk')
#print(result)
soup = BeautifulSoup(result)
content = soup.find('div',{'id':'j_p_postlist'}).findAll('cc')
#print(content)
items = list()
for item in content:
print(item.get_text())
#print(len(item))
items.append(item.get_text())
return items
def load(self):
while self.enable:
if len(self.pages) < 2:
try:
myPage = self.get(str(self.page))
self.pages.append(myPage)
self.page += 1
except:
print u'无法连接百度贴吧...'
else:
time.sleep(1)
def show(self,currentPage,page):
for items in currentPage:
#reg = re.compile('<[^>]*>') 代码一直不能通过,但是我在选取一段html单独测试时是可以实现去除html标签的
#items = reg.sub('',items)
print u'第%d页' % page , items
myInput = raw_input()
if myInput == 'quit':
self.enable = False
break
def start(self):
self.enable = True
page = self.page
print u'正在加载中,请稍后...'
thread.start_new_thread(self.load,())
while self.enable:
if self.pages:
currentPage = self.pages[0]
del self.pages[0]
self.show(currentPage,page)
page += 1
print u'请按下回车浏览贴吧内容:'
raw_input(' ')
tieba = baidu_tieba()
tieba.start()