注册会员   登录
代理IP知识问答
怎么采集bbs论坛上的数据?
提问时间:2016/6/9 9:17:35    楼主:未知网友   阅读量:6363
针对一些高校的bbs(比方北大的未名bbs),我发现它的url链接地址跟普通网站不太一样,我想知道对这网站用爬虫采集时应注意哪些问题?以及(原谅我伸手党的一面),有没有一些针对bbs的成熟采集工具或解决方案吗?
1楼(站大爷用户)

未名BBS其实是有URL地址的,,有版面名和文章编号,其他的应该很好推断
2楼(未知网友)

你可以尝试用telnet抓呀,
这是最绿色的,绝对没有干扰。
3楼(站大爷用户)

谢邀

高校BBS不能一概而论。
先说个最普遍的吧。论坛一般用Discuz,针对Discuz!X2的一些登陆代码和发帖在网上不少,一搜一大把。我们学校的内网bbs就是用Discuz!X3.2做的,我来说抓取内网BBS的过程吧。外网是不能访问的,所以你们也不要去尝试了,抛砖引玉,可以去试试其他的BBS~

学校论坛是Discuz的,顺便提一句,Discuz被腾讯收购了。

老规矩,先抓包找到登陆入口。


需要注意的几点:

页面cookie在登陆后需要从header中找到‘set-cookie’字段
论坛会有一个formhash字段,如果formhash验证失败无法发帖
登陆部分的代码如下
import urllib
import urllib2
import cookielib
def Login():
login_url = 'http://rs.xidian.edu.cn/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1'
loginpage = urllib.urlopen('http://rs.xidian.edu.cn/member.php?mod=logging&action=login').read()
login_soup = BeautifulSoup(loginpage)
formhash_tag = login_soup.find('input',attrs={'name':'formhash'})
formhash = formhash_tag['value']
#print formhash
params = {
"answer":"",
#"formhash":formhash,
#"loginfield":"username",
#"loginsubmit":"",
"password":'password',#这里填密码
"questionid":"0",
"referer":"http://rs.xidian.edu.cn/",
"username":'username',#这里填登录名
}
jar = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(jar)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
req = urllib2.Request(login_url)
req.add_header('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
req.add_header('Connection','keep-alive')
req.add_header('User-Agent',"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0")
req.add_header('Accept-Language','zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3')
#req.add_header('Accept-Encoding','gzip, deflate')
#req.add_header('Referer',"http://rs.xidian.edu.cn/forum.php")
enparams = urllib.urlencode(params)
page = urllib2.urlopen(req,enparams)
#print page
data = page.read()
#print data
global g_cookie
global g_formhash
g_cookie = http://page.info()['set-cookie'] #这里很重要,否则在登陆成功跳转以后依然是未登陆状态
t_cookie = re.sub(r'poK_formhash=deleted','',g_cookie)
r_formhash = re.search(r"poK_formhash=[^;]+",t_cookie)
这样应该就可以实现登陆了,构造好opener,设置登陆成功后的cookie,然后再使用urlopen方法得到的页面就都是登陆成功以后的了。
然后你可以试着去做一些事情了。
如果你想发帖的话也是可以实现的。
比如一些论坛上会有金币贴,就是散金币,回复有机率得到金币之类。你可以先试着把有金币的帖子的链接筛选出来。
实现发帖其实也很简单,先抓包得到发帖时请求的地址,然后把参数填对就可以了。

murl = 'http://rs.xidian.edu.cn/forum.php?mod=post&action=reply&fid=72&tid='+'750469'+'&extra=page%3D1&replysubmit=yes&infloat=yes&handlekey=fastpost&inajax=1'
treq = urllib2.Request(murl)
treq.add_header('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
treq.add_header('Connection','keep-alive')
treq.add_header('User-Agent',"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0")
treq.add_header('Accept-Language','zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3')
'''
postdata = {
'formhash': formhash,
'message':'路过帮顶了~~~',
'subject':'',
'usesig':'1'
}
'''
postdata = 'message=%E8%B7%AF%E8%BF%87%E5%B8%AE%E9%A1%B6%E4%BA%86%7E%7E%7E&posttime=1433250379&formhash='+formhash+'&usesig=1&subject=++'
tpage = urllib2.urlopen(treq,postdata)
print tpage
tdata = tpage.read().decode('utf-8')
print tdata
友情链接 (合作QQ207309712):  代理IP知识问答  每日免费代理IP  网站地图


警告:本站不搜集数据不存储数据,也不买卖数据,本站资源仅限用来计算机技术学习参考及大数据应用等合法行为,用户所有操作行为均有日志记录存档并保留6个月,用户若擅自利用本站资源从事任何违反本国(地区)法律法规的活动,由此引起的一切后果与本站无关。

©CopyRight 2012-2018    ICP备案/ICP经营许可证:辽B2-20180026   VPN经营许可证:B1-20181940   
 
客服QQ:207309712   投诉建议:2219765152    站大爷交流群:417568497    开发者交流群:343030927