Python3爬虫爬取百度贴吧

1.需求分析

为了爬取贴吧中楼主所发表的帖子,并把内容提取出来保存到txt文件中。

2.全部代码

这份代码写的比较早,所以里面提取内容基本上用的全是正则表达式,并没有调用一些非常高级的包。代码如下:

# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
import re

class Tools:
    removeImg=re.compile('<img.*?>| {7}')
    removeAddr=re.compile('<a.*?>|</a>')
    replaceLine=re.compile('</div>|</p>')
    replaceTD=re.compile('<td>')
    replacePara=re.compile('<p.*>')
    replaceBR=re.compile('<br><br><br>')
    removeExtraTag=re.compile('<.*?>|(&lt;)+')
    def replace(self,x):
        x=re.sub(self.removeImg,'',x)        
        x=re.sub(self.removeAddr,'',x)
        x=re.sub(self.replaceLine,'\n',x)
        x=re.sub(self.replaceTD,'\t',x)
        x=re.sub(self.replacePara,'\n',x)
        x=re.sub(self.replaceBR,'\n',x)
        x=re.sub(self.removeExtraTag,'',x)
        return x.strip()

class BDTB:
    def __init__(self,baseUrl,seeLZ):
        self.baseURL=baseUrl
        self.seeLZ='?see_lz='+str(seeLZ)
        self.tool=Tools()
        
    def getPage(self,pageNum):
        try:
            url=self.baseURL+self.seeLZ+'&pn='+str(pageNum)
            request=urllib.request.Request(url)
            response=urllib.request.urlopen(request)
            return response
        except urllib.request.URLError as e:
            if hasattr(e,'reason'):
                print('连接百度贴吧失败,错误原因:'+e.reason)
                return None
            
    def getPageNum(self):
        page=self.getPage(1).read().decode('utf-8')
        pattern=re.compile('"total_page":\d+',re.S)
        result=re.findall(pattern,page)
        return result[0].split(':')[1]
    
    def getTitle(self):
        page=self.getPage(1).read().decode('utf-8')
        pattern=re.compile('title: ".*?"',re.S)
        result=re.findall(pattern,page)[0].split(':')[1]
        return result
        
    def getContent(self,page):
        pattern=re.compile(r'<div id="post_content_.*?>.*?</div>',re.S)
        items=re.findall(pattern,page)
        new_items=[]
        for item in items:
            new_items.append(self.tool.replace(item))
        return new_items
            
baseURL='http://tieba.baidu.com/p/4643889032'
bdtb=BDTB(baseURL,1)
with open('tb.txt','w') as teibatxt:
    #取出帖子的标题
    title=bdtb.getTitle().strip(' ').strip('"')
    #为了将标题与帖子内容隔开,标题与内容之间有三行间隔
    teibatxt.write(title+'\n\n\n')
    pageNum=bdtb.getPageNum()
    for page_num in range(int(pageNum)):
        page=bdtb.getPage(page_num+1).read().decode('utf-8')
        page_items=bdtb.getContent(page)
        for item in page_items:
            teibatxt.write(item+'\n')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值