python 爬虫实战 抓取学校bbs相关板块的发帖信息
1. 前言
之前也因为感兴趣, 写过一个抓取桌面天空里面喜欢的动漫壁纸的爬虫代码。这两天突然看到有人写了这么一篇文章: 爬取京东本周热卖商品基本信息存入MySQL
觉得蛮有趣的, 正好临近找工作的季节, 就想着能不能写个爬虫, 把咱们学校bbs上面相关的板块里面的发帖信息给记录下来。
2. 项目分析
- 首先我们打开我们的目标网页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. 编写过程中遇到的一些坑
- 在re.findall 的地方, 发生假死
- 这个里面具体原因在于我们的正则表达式没有能够一开始就匹配成功, 导致进入死循环, 修正正则表达式即可
- 中文字节码输出u’\u5357\u4eac\u5fb7\u552f\u601d\u7eba\u7ec7\u54c1
- 这个并不是错误, 但是很讨厌, 他只是输出字节码, 而且这个现象时有时无, 在出现这个问题的时候, 我们可以在相应的 str 后面加上 decode("utf−8")decode("utf-8")即可正常输出中文了
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 参数就可以了
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position。。
解决方法
有两种办法可以解决 1.换成python 3.x 2.在代码前面加上 import sys reload(sys) sys.setdefaultencoding('utf-8')
cmd 窗口大小调节
- 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):# 去除 removeNBSP = re.compile(r" ")content = re.sub(removeNBSP, " ", content).strip()removeAMP = re.compile(r"&")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相关板块的发帖信息相关推荐
- Python爬虫实战---抓取图书馆借阅信息
Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...
- python爬虫批量抓取新浪微博用户ID及用户信息、微博内容
老师给的任务,要对批量的微博文本进行舆情分析.第一步就是数据的抓取.在网上搜了一下大多是基于手机版网页(wap/cn)的爬虫,但是我在电脑上打不开这些网站. 由于自己也是网页小白,所以就参考着别人的代 ...
- python爬虫招聘-Python爬虫实战-抓取boss直聘招聘信息
实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮答疑容易放弃.为此小编建了个Python全栈免费答疑.裙 : ...
- python爬虫实战-抓取同花顺股票信息
前言: 在之前介绍requests的基础上,现在开始进行实战. 目标网站:http://q.10jqka.com.cn//index/index/board/all/field/zdf/order/d ...
- 【第4篇】Python爬虫实战-抓取B站弹幕视频
目录 1.获取视频cid参数 2.程序源代码 3.程序运行结果 4.总结 1.获取视频cid参数 首先我们打开一个有弹幕的B站视频,比如:<我好像在哪见过你>人们把难言的爱都埋入土壤里_哔 ...
- Python爬虫实战 | 抓取小说网完结小说斗罗大陆
储备知识应有:Python语言程序设计 Python网络爬虫与信息提取 两门课程都是中国大学MOOC的精彩课程,特别推荐初学者.环境Python3 本文整体思路是:1.获取小说目录页面,解析目录页面, ...
- Python爬虫实战抓取十一旅游最优惠的机票!
目的 获取去哪儿默认页面的机票航班信息 详细需求 目标URL:https://m.flight.qunar.com/h5/flight/ 源码实现 #!/usr/bin/env python # -* ...
- python爬取boss直聘招聘信息_Python爬虫实战-抓取boss直聘招聘信息
Python Python开发 Python语言 Python爬虫实战-抓取boss直聘招聘信息 实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Pyth ...
- python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述
http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...
最新文章
- Springboot-读取核心配置文件及自定义配置文件
- 二次函数的求根公式的几何原理
- 在Winform程序中设置管理员权限及为用户组添加写入权限
- mysql添加普通用户用于管理单一数据库
- Oracl数据库中大数据的备份-1
- cad2014打开文件崩溃_CAD玩的再牛,崩溃了咋办?
- 程序员为什么要少写代码?
- 详细解释下头条图文和微头条发布建议
- [201511118]发生系统错误86.txt
- 高德、百度、GPS经纬度转换
- Unity网络教程翻译(三)多人游戏大厅
- PTA——7-4 秋天的第一杯奶茶
- CDH 导入KDC Account Manager 凭据失败
- Node.js中exports和moudle.exports
- no more duplicates will be shown
- MFC的使用——在共享DLL中使用MFC、在静态库中使用MFC
- DDS发生器的频率控制字原理和基本结构(二)
- MacOS安装的VMware Fusion设置端口映射
- Linux内核分析(七)系统调用execve处理过程
- ChatGPT实现旅行安排
热门文章
- C语言 qsort()函数详解 (笔记)
- .ren走进家谱界——shenshi.ren带你追溯“”申氏家族人
- beego mysql 查询_beego orm如何执行SQL查询
- 设计一个简单的网页计算器
- 关于执行力--程序员你有木有?
- 鹅厂7年终有离开之日,记离职鹅厂最后30天的真实心路历程
- 获取 /resources 目录资源文件的 9 种方法
- CListCtrl类不能响应HDN_ITMECLICK消息?
- JAVA设计原则:里氏代换原则
- java开发金融类项目,万字长文!