1. 前言

之前也因为感兴趣, 写过一个抓取桌面天空里面喜欢的动漫壁纸的爬虫代码。这两天突然看到有人写了这么一篇文章: 爬取京东本周热卖商品基本信息存入MySQL
觉得蛮有趣的, 正好临近找工作的季节, 就想着能不能写个爬虫, 把咱们学校bbs上面相关的板块里面的发帖信息给记录下来。

2. 项目分析

  1. 首先我们打开我们的目标网页http://bbs.ustc.edu.cn/main.html

    结果我们发现, 进入到job板块之后, 还是没有找到网页的源码信息,ie, 我们没有找到他的真正的网页地址。我们一开始猜想我们的bbs 应该是使用post方式, 利用js 异步获取网页数据的, 然而, 当我们进入Network功能查看的时候, 发现他实际上还是使用了 GET 方式, 只不过他的真实地址被隐藏了而已

    上面用红框框圈出来的地址就是Job 板块的真实地址了

    然后我们就可以方便的找到我们的真实地址以及网页源码了

    由于, 我们学校的bbs上面回帖信息一般都不咋地, 于是这里, 我们直接忽略他
    得到不含回帖信息的url
http://bbs.ustc.edu.cn/cgi/bbsbfind?type=1&board=Job&title=&title2=&title3=&userid=&dt=7&og=on&boardordigest=0&labelabc=0

我们发现真正需要变化的是 Job 部分, 将Job 改成 Intern 可以得到实习板块的相关信息。
然后我们查看网页的源码:

由于我们需要得到作者, 日期, 帖子的连接地址, 标题 这四个信息, 很容易分析得到我们所需要使用的正则表达式:

string = "author.*?><a.*?>(.*?)</a>.*?datetime.*?>(.*?)<.*?title.*?<a.*?=(.*?)>(.*?)</a>"

其中第三项得到我们帖子的相应地址, 同样可以分析得到提取帖子内容的正则表达式为:

pattern_str = "WWWPOST(.*?)<br/>--"

至此, 基本分析完毕

3. 编写过程中遇到的一些坑

  1. 在re.findall 的地方, 发生假死

    • 这个里面具体原因在于我们的正则表达式没有能够一开始就匹配成功, 导致进入死循环, 修正正则表达式即可
  2. 中文字节码输出u’\u5357\u4eac\u5fb7\u552f\u601d\u7eba\u7ec7\u54c1
    • 这个并不是错误, 但是很讨厌, 他只是输出字节码, 而且这个现象时有时无, 在出现这个问题的时候, 我们可以在相应的 str 后面加上 decode("utf−8")decode("utf-8")即可正常输出中文了
  3. UnicodeDecodeError:‘XXX’ codec can’t decode bytes in position错误信息解 决办法

    • http://www.imleon.cn/unicodedecodeerrorxxx-in-the-python-codec-cant-decode-bytes-in-position-error-solution.html 这篇文章中提到, inStr2=inStr.decode(‘utf−8',‘ignore′)inStr2 = inStr.decode(‘utf-8′, ‘ignore’) 加一个ignore 参数就可以了
  4. UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position。。

    • 解决方法

      有两种办法可以解决
      1.换成python 3.x
      2.在代码前面加上
      import sys
      reload(sys)
      sys.setdefaultencoding('utf-8')
      
  5. cmd 窗口大小调节

  6. cmd 窗口乱码问题

    我们的代码在eclipse 的console 中正常显示, 但是到了cmd中就中文乱码了, 这里的解决方案是: 将输出字符全部encode 成 gb2312

4. 运行效果

5. code

# -*- coding:utf-8 -*-
'''
Created on 2016-5-2
获取 BBS 相关板块的信息
@author: ThinkPad User
'''import sys
reload(sys)
sys.setdefaultencoding('utf8') import urllib
import urllib2
import reclass BBSSpider:'''classdocs'''def __init__(self):#self.baseURL = "http://bbs.ustc.edu.cn/cgi/bbsdoc?board=" + str(board)self.baseURL = ""self.enable = Trueself.charaterset = "gb2312"# 获取最近不含回帖的帖子    def getHtml(self, url):        #self.baseURL = "http://bbs.ustc.edu.cn/cgi/bbsbfind?type=1&board=" + str(board) + "&title=&title2=&title3=&userid=&dt=7&og=on&boardordigest=0&labelabc=0"self.baseURL = urltry:request = urllib2.Request(self.baseURL)response = urllib2.urlopen(request)#print response.read().decode(self.charaterset, 'ignore')return response.read().decode("gb2312", 'ignore').encode("utf-8")except urllib2.URLError, e:if hasattr(e, "reason"):string = "连接bbs 失败, 原因" +  str(e.reason)print string.encode(self.charaterset)return None# 删除 获取的网页内容中的一些噪声              def removeNoise(self, content):# 去除 &nbsp;removeNBSP = re.compile(r"&nbsp;")content = re.sub(removeNBSP, " ", content).strip()removeAMP = re.compile(r"&amp;")content = re.sub(removeAMP, "&", content).strip()removeBR = re.compile(r"<br/>")content = re.sub(removeBR, "\n", content).strip()# remove blank lineremoveN = re.compile(r"\n{1,}")content = re.sub(removeN, "\n", content).strip()return content# 获取发帖信息        def getItem(self, board):string = "http://bbs.ustc.edu.cn/cgi/bbsbfind?type=1&board=" + str(board) + "&title=&title2=&title3=&userid=&dt=7&og=on&boardordigest=0&labelabc=0"content = self.getHtml(string)if not content:print "加载页面失败"return#string = r"author.*?><a.*?>(.*?)</a>.*?datetime.*?>(.*?)<.*?title><a.*?>(.*?)</a>"string = r"author.*?><a.*?>(.*?)</a>.*?datetime.*?>(.*?)<.*?title.*?<a.*?=(.*?)>(.*?)</a>"pattern = re.compile(string, re.S)res = re.findall(pattern, content)stories = []count = 0for item in res:text = self.removeNoise(item[3])stories.append(item[2])# 获取内容string_out = str("id:%3d\t发帖人:%20s\t发帖时间:%20s\t发帖标题:%40s" % (count, item[0], item[1], text))print string_out.encode(self.charaterset)count += 1   return stories # 获取详细信息def getDetails(self, board):stories = self.getItem(board)if not stories:returntotal_num = len(stories)while self.enable:string_tip = str("\n\n================【请输入需要查看的帖子的id, 按 Q 退出】==============").encode(self.charaterset)id = raw_input(string_tip)if id == "Q":self.enable = Falsebreaktry:    int_id = int(id)if int_id < 0 or int_id >= total_num:continueexcept:continuestring = "http://bbs.ustc.edu.cn/cgi/" + stories[int_id]content = self.getHtml(string)if not content:print "获取网页信息失败"returnpattern_str = "WWWPOST(.*?)<br/>--"pattern = re.compile(pattern_str, re.S)res = re.findall(pattern, content)for item in res:text = self.removeNoise(item)print text.encode(self.charaterset)# 使用常用板块信息def getBoard(self):flag = Trueself.enable = Trueboards = ['Job', 'Intern', 'SecondHand', 'PieBridge', 'Free', 'PMPI', 'Badminton', 'Swimming']count = 0for item in boards:print "id:%d  board:%15s" % (count, boards[count])count += 1total_num = countwhile flag:self.enable = Truestring_tip = str("\n\n===================【请输入需要查看的板块的id, 按 Q 退出】================").encode(self.charaterset)id = raw_input(string_tip)if id == "Q":flag = Falsebreaktry: int_id = int(id)if int_id < 0 or int_id >= total_num:continueexcept:continueself.getDetails(boards[int_id])if "__main__" == __name__:bbs = BBSSpider()    bbs.getBoard()#bbs.getDetails("Job")

python 爬虫实战 抓取学校bbs相关板块的发帖信息相关推荐

  1. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

  2. python爬虫批量抓取新浪微博用户ID及用户信息、微博内容

    老师给的任务,要对批量的微博文本进行舆情分析.第一步就是数据的抓取.在网上搜了一下大多是基于手机版网页(wap/cn)的爬虫,但是我在电脑上打不开这些网站. 由于自己也是网页小白,所以就参考着别人的代 ...

  3. python爬虫招聘-Python爬虫实战-抓取boss直聘招聘信息

    实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮答疑容易放弃.为此小编建了个Python全栈免费答疑.裙 : ...

  4. python爬虫实战-抓取同花顺股票信息

    前言: 在之前介绍requests的基础上,现在开始进行实战. 目标网站:http://q.10jqka.com.cn//index/index/board/all/field/zdf/order/d ...

  5. 【第4篇】Python爬虫实战-抓取B站弹幕视频

    目录 1.获取视频cid参数 2.程序源代码 3.程序运行结果 4.总结 1.获取视频cid参数 首先我们打开一个有弹幕的B站视频,比如:<我好像在哪见过你>人们把难言的爱都埋入土壤里_哔 ...

  6. Python爬虫实战 | 抓取小说网完结小说斗罗大陆

    储备知识应有:Python语言程序设计 Python网络爬虫与信息提取 两门课程都是中国大学MOOC的精彩课程,特别推荐初学者.环境Python3 本文整体思路是:1.获取小说目录页面,解析目录页面, ...

  7. Python爬虫实战抓取十一旅游最优惠的机票!

    目的 获取去哪儿默认页面的机票航班信息 详细需求 目标URL:https://m.flight.qunar.com/h5/flight/ 源码实现 #!/usr/bin/env python # -* ...

  8. python爬取boss直聘招聘信息_Python爬虫实战-抓取boss直聘招聘信息

    Python Python开发 Python语言 Python爬虫实战-抓取boss直聘招聘信息 实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Pyth ...

  9. python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述

    http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...

最新文章

  1. **上海铁路局2004年最新时刻发布!**
  2. 张量的通俗理解和计算
  3. 现代CIO的关键是需要建立 IT/OT之间的桥梁
  4. jdk8永久代从方法区移除的验证
  5. 实验5 OpenGL模型视图变换
  6. sqlserver连接及设置
  7. python装饰器property_python装饰器: @property
  8. 【2017-04-16】抽象类、接口、构造函数、重载和重写的区别、静态成员和方法
  9. tomcat 设置编码格式
  10. 宏杉MacroSAN MS3000G2 SPC-1测试性价比第一
  11. APP自动化测试--IOS
  12. php 开发一元夺宝插件,yiyuanyungou 一元云购商城源码,商用 ci框架开发,带指定中奖插件 Other systems 其他 249万源代码下载- www.pudn.com...
  13. 基于java高校教师管理系统_高校教师电子业务档案管理系统
  14. C# .NET弹出窗口大全
  15. 双样本T检验-P-T和T-T检验
  16. 必备技能~程序员如何提高工作效率?如何更好获得领导的认可?
  17. GRUB4DOS使用大全
  18. linux入侵检测工具之aide
  19. 盘点华为“天才少年”中的神仙女孩纸~
  20. 大数据开发最火技术Kafka背后的“黑科技”

热门文章

  1. 小型蘑菇定向切片机设计_鲜枣去核机的设计_玉米脱粒机的设计_振动式马铃薯收获机的设计_谷物干燥机的设计_锤片式饲料粉碎机的设计_山楂去核机的设计_萝卜切丝机设计_板栗去皮机设计_锤式破碎机设计……
  2. LayUI 数据表格 table表格在同一单元格换行显示2个数据 一个单元格放2个数据或多个数据
  3. 用Python编写潮流程序(牛拉直角坐标法)
  4. 基于ht1632c芯片的点阵驱动模块在STM32F103mini的应用(一)行走的小人
  5. 编程中思维方式——逆向思维案例
  6. android camera surfaceview 变形,使用Camera预览显示变形问题
  7. 综述科普:单细胞测序技术下的小鼠脑部DNA甲基化图谱
  8. 2022年1月22日蓝桥杯STEMA竞赛C++中高级组第3题近似值
  9. 模电学习笔记(上交郑老师)10.放大电路Q点的稳定
  10. 开发一套pacs系统主要解决的问题有哪些?