鱼C论坛

 找回密码
 立即注册
查看: 2162|回复: 6

[已解决]请教各位大神,爬取百度贴吧的问题

[复制链接]
发表于 2016-3-5 13:26:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 worry921 于 2016-3-6 12:50 编辑
  1. import urllib
  2. import urllib.request
  3. import re


  4. class Tool:
  5.     # 去除img标签,7位长空格
  6.     removeImg = re.compile('<img.*?>| {7}|')
  7.     # 删除超链接标签
  8.     removeAddr=re.compile('<a.*?>|</a>')
  9.     # 把换行的标签换为\n
  10.     replaceLine=re.compile('<tr>|<div>|</div>|</p>')
  11.     # 将制表符<td>换成\n
  12.     replaceTD=re.compile('<td>')
  13.     # 将段落开头换为\n加空两格
  14.     replacePara=re.compile('<p.*?>')
  15.     # 将换行符或双换行符替换为\n
  16.     replaceBR=re.compile('<br><br>|<br>')
  17.     # 将其余标签剔除
  18.     rmExtraTag=re.compile('<.*?>')

  19.     def replace(self,x):
  20.         x=re.sub(self.removeImg,"",x)
  21.         x=re.sub(self.removeAddr,"",x)
  22.         x=re.sub(self.replaceLine,"\n",x)
  23.         x=re.sub(self.replaceTD,"\t",x)
  24.         x=re.sub(self.replacePara,"\n",x)
  25.         x=re.sub(self.replaceBR,"\n",x)
  26.         x=re.sub(self.rmExtraTag,"",x)
  27.         # strip()将前后内容删除
  28.         return x.strip()

  29. class TBSpider:
  30.     # 初始化,传入基地地址,是否只看楼主得参数
  31.     def __init__(self, baseUrl, seeLZ,floorTag):
  32.         self.user_agent = 'Mozilla/4.0(compatible:MSIE 5.5;Windows NT)'
  33.         #初始化headers
  34.         self.headers = {'User-Agent': self.user_agent}
  35.         self.baseURL = baseUrl
  36.         self.seeLZ = "?see_lz=" + str(seeLZ)
  37.         # 初始化Tool工具
  38.         self.tool=Tool()
  39.         self.file=None
  40.         self.floor=1
  41.         self.defaultTitle="百度贴吧"
  42.         self.floorTag=floorTag

  43.     #传入页码,获取该页面帖子的代码
  44.     def getPage(self, pageNum) -> object:
  45.         try:
  46.             url = self.baseURL + self.seeLZ + "&pn=" + str(pageNum)
  47.             request = urllib.request.Request(url, headers=self.headers)
  48.             reqonse = urllib.request.urlopen(request)
  49.             content = reqonse.read().decode("utf-8")
  50.             return content
  51.         except urllib.error.URLError as e:
  52.             if hasattr(e, "reason"):
  53.                 print("连接百度贴吧失败,错误原因:", e.reason)
  54.                 return None

  55.     #获取帖子标题
  56.     def getTitle(self,page):
  57.         pattern = re.compile('<h1 class="core_title_txt.*?>(.*?)</h1>', re.S)
  58.         result = re.search(pattern, page)
  59.         if result:
  60.             return result.group(1).strip()
  61.         else:
  62.             return None

  63.     #提取帖子页数
  64.     def getPageNum(self,page):
  65.         pattern = re.compile('<li class="l_reply_num.*?</span>.*?<span.*?>(.*?)</span>', re.S)
  66.         result = re.search(pattern, page)
  67.         if result:
  68.             return result.group(1).strip()
  69.         else:
  70.             return None

  71.     def getConetent(self, page):
  72.         pattern = re.compile('<div id="post_content_.*?>(.*?)</div>', re.S)
  73.         items = re.findall(pattern, page)
  74.         # 楼层
  75.         contents=[]
  76.         self.floor=1
  77.         for item in items:
  78.             content="\n"+self.tool.replace(item)+"\n"
  79.             #contents.append(content.encode('utf-8'))就是这句出问题了,整了一个小时,终于排查出错误了
  80.             contents.append(content)
  81.         return contents


  82.     def setFileTitle(self,title):
  83.         if title is not None:
  84.             self.file=open(title+".txt","w+",encoding = 'utf-8')
  85.         else:
  86.             self.file=open(self.defaultTitle+".txt","w+")

  87.     def writeData(self,contents):
  88.         for item in contents:
  89.             if self.floorTag=='1':
  90.                 floorLine="\n-------------"+str(self.floor)+"楼--------------\n"
  91.                 self.file.write(floorLine)
  92.             self.file.write(item)
  93.             self.floor+=1

  94.     def start(self):
  95.         indexPage=self.getPage(1)
  96.         pageNum=self.getPageNum(indexPage)

  97.         title=self.getTitle(indexPage)
  98.         self.setFileTitle(title)

  99.         if pageNum==None:
  100.             print("URL链接已经失效,请重试")
  101.             return
  102.         try:
  103.             print("该帖子共有{0}页".format(str(pageNum)))
  104.             for i in range(1,int(pageNum) + 1):
  105.                 print("正在写入第{0}页数据".format(str(i)))
  106.                 page=self.getPage(1)
  107.                 contents=self.getConetent(page)
  108.                 self.writeData(contents)
  109.         except IOError as e:
  110.             print("写入异常原因:",e.reason)
  111.         finally:
  112.             print("写入任务完成!")
复制代码
我要爬取百度贴吧的数据,目前代码出现了一点问题,请教大神,看看哪个地方出现了问题



-----------------------------------------------------------------------------------------------------------------------------------------------------------------------现在最新的情况是,代码成功了,但是只可以爬到第一页的内容,后面的内容都是和第一页是重复的
最佳答案
2016-3-5 23:30:32
worry921 发表于 2016-3-5 13:28
请输入帖子代号
http://tieba.baidu.com/p/4384651713
是否只获取楼主发言,是输入1,否输入0

下次一定记得要用代码格式发帖, 不然总会出一些格式问题, 简单看了下代码, 有这几个问题:
逻辑问题: start方法里面的for循环里面的range的第二个参数存在逻辑错误, 需要+1才能实现目标, 像这样:
  1. for i in range(1, int(pageNum) + 1):
  2.     pass
复制代码

容错处理问题: 我看你代码里面也写了decode是utf8的, 咋的open文件的时候就不加上encoding呢, 像这样:
  1. self.file = open(title + ".txt", "w+", encoding='utf-8')
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-5 13:27:28 | 显示全部楼层
本帖最后由 worry921 于 2016-3-6 11:00 编辑

_
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-5 13:28:32 | 显示全部楼层
本帖最后由 worry921 于 2016-3-6 11:00 编辑

1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-5 22:49:16 | 显示全部楼层
呼叫大神~@hldh214
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-3-5 23:30:32 | 显示全部楼层    本楼为最佳答案   
worry921 发表于 2016-3-5 13:28
请输入帖子代号
http://tieba.baidu.com/p/4384651713
是否只获取楼主发言,是输入1,否输入0

下次一定记得要用代码格式发帖, 不然总会出一些格式问题, 简单看了下代码, 有这几个问题:
逻辑问题: start方法里面的for循环里面的range的第二个参数存在逻辑错误, 需要+1才能实现目标, 像这样:
  1. for i in range(1, int(pageNum) + 1):
  2.     pass
复制代码

容错处理问题: 我看你代码里面也写了decode是utf8的, 咋的open文件的时候就不加上encoding呢, 像这样:
  1. self.file = open(title + ".txt", "w+", encoding='utf-8')
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-6 10:28:13 | 显示全部楼层
hldh214 发表于 2016-3-5 23:30
下次一定记得要用代码格式发帖, 不然总会出一些格式问题, 简单看了下代码, 有这几个问题:
逻 ...

不好意思,版主息怒息怒下次一定注意熟读版规。我试着用下您的修改方法,看看情况如何
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-6 11:05:02 | 显示全部楼层
已经把错误的发帖方式删掉了。版主,我是一个守规矩的人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-10 17:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表