新浪微博爬虫常见问题解决方案汇总(各方案收集自网络,文章中标有出处)...

本文主要是介绍新浪微博爬虫常见问题解决方案汇总(各方案收集自网络,文章中标有出处)...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在 NLP 实验室和孙承杰老师做点东西,打算基于一片文章的「多标签分类」算法,与新浪微博的用户数据结合,看一下实验效果。于是找到了的一些关于新浪微博爬虫的资料,整理如下:


(一)模拟登录新浪微博(Python) (用python程序来获取cookie登录)
Update: 如果只是写个小爬虫,访问需要登录的页面,采用填入cookie 的方法吧,简单粗暴有效,详细见:http://www.douban.com/note/264976536/
模拟登陆有时需要了解js 加密(散列)方法,输入验证法等,同一段代码很难一直有效。

正文:

PC 登录新浪微博时, 在客户端用js预先对用户名、密码都进行了加密, 而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分。 这样, 就不能用通常的那种简单方法来模拟POST 登录( 比如 人人网 )。

由于要用的一部分微博数据用API获取不方便, 所以还是要自己写个小爬虫, 模拟登录是必不可少的。琢磨了一下这个东西,最终登录成功。

1, 在提交POST请求之前, 需要GET 获取两个参数。
地址是:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
得到的数据中有 "servertime" 和 "nonce" 的值, 是随机的,其他值貌似没什么用。

2, 通过httpfox 观察POST 的数据, 参数较复杂,其中 “su" 是加密后的username, "sp"是加密后的password。"servertime" 和 ”nonce" 是上一步得到的。其他参数是不变的。

username 经过了BASE64 计算: username = base64.encodestring( urllib.quote(username) )[:-1];
password 经过了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值来干扰。
即: 两次SHA1加密后, 将结果加上 servertime 和 nonce 的值, 再SHA1 算一次。将参数组织好, POST请求。 这之后还没有登录成功。
POST后得到的内容中包含一句 location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3");

这是登录失败时的结果, 登录成功后结果与之类似, 不过retcode 的值是0 。接下来再请求这个URL,这样就成功登录到微博了。
记得要提前build 缓存。

下面是完整代码(没加注释,凑合看吧):

#! /usr/bin/env python
#coding=utf8
import urllib
import urllib2
import cookielib
import base64
import re
import json
import hashlibcj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
postdata = {'entry': 'weibo','gateway': '1','from': '','savestate': '7','userticket': '1','ssosimplelogin': '1','vsnf': '1','vsnval': '','su': '','service': 'miniblog','servertime': '','nonce': '','pwencode': 'wsse','sp': '','encoding': 'UTF-8','url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack','returntype': 'META'
}def get_servertime():url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'data = urllib2.urlopen(url).read()p = re.compile('\((.*)\)')try:json_data = p.search(data).group(1)data = json.loads(json_data)servertime = str(data['servertime'])nonce = data['nonce']return servertime, nonceexcept:print 'Get severtime error!'return Nonedef get_pwd(pwd, servertime, nonce):pwd1 = hashlib.sha1(pwd).hexdigest()pwd2 = hashlib.sha1(pwd1).hexdigest()pwd3_ = pwd2 + servertime + noncepwd3 = hashlib.sha1(pwd3_).hexdigest()return pwd3def get_user(username):username_ = urllib.quote(username)username = base64.encodestring(username_)[:-1]return usernamedef login():username = '你的登录邮箱'pwd = '你的密码'url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)'try:servertime, nonce = get_servertime()except:returnglobal postdatapostdata['servertime'] = servertimepostdata['nonce'] = noncepostdata['su'] = get_user(username)postdata['sp'] = get_pwd(pwd, servertime, nonce)postdata = urllib.urlencode(postdata)headers = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'}req  = urllib2.Request(url = url,data = postdata,headers = headers)result = urllib2.urlopen(req)text = result.read()p = re.compile('location\.replace\(\'(.*?)\'\)')try:login_url = p.search(text).group(1)#print login_urlurllib2.urlopen(login_url)print "登录成功!"except:print 'Login error!'login()

(二)模拟登录新浪微博(直接填入Cookie)
之前写过一篇模拟登录新浪微博,是采用POST 用户名/密码等参数(经过加密)并保存Cookie来模拟登录的方法。
一般情况下,为了保证安全性,网站会定期更新登录的detail,例如修改参数名、更新加密(散列)算法等。所以模拟登录的代码定期肯定会失效,但是如果网站没有进行大的更新的话,稍微改一改还是能用的。另外,碰到验证码的情况就更难办了,虽然程序可以一定程度地识别验证码字符,但目前很难找到简单的可以通用的验证码识别程序。
很多豆友反馈有模拟登录新浪微博抓取数据的需求,其实对于一般的微博数据获取,如用户信息、微博内容等,使用微博开放平台API是更明智的选择:速度更快,而且节省许多网页处理的功夫。对于API没有开放的数据,我们再采用模拟登录的方法。

熟悉Web的朋友只要定期维护模拟登录的代码就可以一直成功登录微博。如果不那么熟悉的话,其实可以采用更naive的思路来解决:直接将Cookie发送给新浪微博以实现模拟登录。

1,获取Cookie
很简单,使用Chrome浏览器的”开发者工具(Developer Tools)“或者Firefox的"HTTPFOX"等插件就可以直接查看自己新浪微博的Cookie。(注: 这个私人Cookie千万不要泄露哦!)
比如,Chrome 查看cookie (快捷键F12 可以调出chrome开发者工具)
cookie in chrome
cookie in chrome
cookie in chrome

2, 将Cookie作为访问微博的header参数提交
headers = {'cookie': 'your cookie'}
req = urllib2.Request(url, headers=headers) #每次访问页面都带上 headers参数
r = urllib2.urlopen(req)
具体代码见:https://gist.github.com/ghostrong/d10c061000b7b65e5039

(三)好愚蠢的cookie问题,不过总算自己解决了...
对于HTTP里面的那些协议之类的东西不是很懂,只是知道有这么个东西,该好好看看《HTTP权威指南》这本书了,免得..
同学说可以使用cookie登陆人人,微博啥的,他是个网络安全牛逼的高手,黑客那种,我小白这方面,所以很想尝试下。
网上搜到的资源有很多,包括这里 模拟登录新浪微博(直接填入Cookie)
我知道在哪找cookie,就像这样(我用的是chrome)

来来,快来看看我们的cookie在哪

点进去,然后就会像这样子
我居然把这些个cookie都试了个遍....

不行啊,思路变通下,刚刚一定是打开的方式不对...so,打开F12,打开浏览器的控制台,查看network那一页,就像这样子:
快,去地址来输入网址!!

快,去地址来输入网址!!我们会发现好多东西在传来传去
点击那个weibo.com啊

看见了吧,就是那个蓝色的东西,复制黏贴,贴到代码里,就好了
全部选中,就可以了,总算是完结了。

最后是抓取 ajax
(四)利用python实现新浪微博爬虫

接下来,考虑实现抓取微博的内容。

此时遇到一个困难,当抓取指定URL的微博时,初始显示只有15条。后面的是延迟显示的(ajax里面叫lazy load?)。也就是说,当滚动条第一次拖到最下面的时候,会显示第二部分,再拖到最下面,会显示第三部分。此时一个页面的微博才是完整的。所以,要获取一个微博页面的全部微博,需要访问这个页面三次。创建getWeiboPage.py文件,相应代码如下:

#!/usr/bin/env python  
# -*- coding: utf-8 -*-  import urllib  
import urllib2  
import sys  
import time  reload(sys)  
sys.setdefaultencoding('utf-8')  class getWeiboPage:  body = {  '__rnd':'',  '_k':'',  '_t':'0',  'count':'50',  'end_id':'',  'max_id':'',  'page':1,  'pagebar':'',  'pre_page':'0',  'uid':''  }  uid_list = []  charset = 'utf8'  def get_msg(self,uid):  getWeiboPage.body['uid'] = uid  url = self.get_url(uid)  self.get_firstpage(url)  self.get_secondpage(url)  self.get_thirdpage(url)  def get_firstpage(self,url):  getWeiboPage.body['pre_page'] = getWeiboPage.body['page']-1  url = url +urllib.urlencode(getWeiboPage.body)  req = urllib2.Request(url)  result = urllib2.urlopen(req)  text = result.read()  self.writefile('./output/text1',text)         self.writefile('./output/result1',eval("u'''"+text+"'''"))  def get_secondpage(self,url):  getWeiboPage.body['count'] = '15'  #   getWeiboPage.body['end_id'] = '3490160379905732'  #   getWeiboPage.body['max_id'] = '3487344294660278'  getWeiboPage.body['pagebar'] = '0'  getWeiboPage.body['pre_page'] = getWeiboPage.body['page']  url = url +urllib.urlencode(getWeiboPage.body)  req = urllib2.Request(url)  result = urllib2.urlopen(req)  text = result.read()  self.writefile('./output/text2',text)         self.writefile('./output/result2',eval("u'''"+text+"'''"))  def get_thirdpage(self,url):  getWeiboPage.body['count'] = '15'  getWeiboPage.body['pagebar'] = '1'  getWeiboPage.body['pre_page'] = getWeiboPage.body['page']  url = url +urllib.urlencode(getWeiboPage.body)  req = urllib2.Request(url)  result = urllib2.urlopen(req)  text = result.read()  self.writefile('./output/text3',text)         self.writefile('./output/result3',eval("u'''"+text+"'''"))  def get_url(self,uid):  url = 'http://weibo.com/' + uid + '?from=otherprofile&wvr=3.6&loc=tagweibo'  return url  def get_uid(self,filename):  fread = file(filename)  for line in fread:  getWeiboPage.uid_list.append(line)  print line  time.sleep(1)  def writefile(self,filename,content):  fw = file(filename,'w')  fw.write(content)  fw.close()  

这篇关于新浪微博爬虫常见问题解决方案汇总(各方案收集自网络,文章中标有出处)...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/197200

相关文章

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An