引言
虽然微博爬虫已经有很成熟的方案和现成的代码,但是博主没有自己做过,还是想自己写一写。博主采用了两种方式,一个是采用selenium
,使用浏览器抓取数据(已经忘了是使用哪位大佬的代码了),还有一个是采用超详细的Python实现新浪微博模拟登陆(小白都能懂)这篇文章介绍的模拟登录的方法,使用了CN-AlbertWu96这位大大的代码,采用BeautifulSoup
去解析了html
,没有使用代码中的lxml
去解析页面,最终的结果使用DateFrame
去保存为csv
或者excel
。我的博文就不详细讲方法了,各大前辈已经写得很清楚了,我就说说踩得坑吧。
第一种:使用selenium抓取
使用selenium
比较简单,主要就是找各种元素的位置,看代码大致就能明白。
第二种:模拟登陆抓网页
主要的坑都在这个
获取不到正确cookies
估计是我改动一些代码,导致我返回的页面和别人返回的有些差别,尽管我最后也成功了,但着实费了一番力气。
应该返回的代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14<html>
<head>
<title>新浪通行证</title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<script charset="utf-8" src="http://i.sso.sina.com.cn/js/ssologin.js"></script>
</head>
<body>
正在登录 ...
<script>
try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["http:\/\/crosdom.weicaifu.com\/sso\/crosdom?action=login&savestate=1473605342","http:\/\/passport.97973.com\/sso\/crossdomain?action=login&savestate=1473605342","http:\/\/passport.weibo.cn\/sso\/crossdomain?action=login&savestate=1"]});}catch(e){}try{sinaSSOController.crossDomainAction('login',function(){location.replace('http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1473605342&ticket=ST-MzU2MjI3OTUwMQ==-1442069342-xd-E69DF7FE9517FBB10247C39F3D1C20F5&retcode=0');});}catch(e){}
</script>
</body>
</html>
我返回的:1
{"retcode":"0","uid":"5041606751","nick":"\\u537f\\u5357\\u738b","crossDomainUrlList":["https:\\/\\/passport.weibo.com\\/wbsso\\/login?ticket=ST-NTA0MTYwNjc1MQ%3D%3D-1533638234-yf-1AA4D6632C94B8C9CD341E77686D6C6E-1&ssosavestate=1533638234","https:\\/\\/passport.weibo.cn\\/sso\\/crossdomain?action=login&savestate=1"]}
最后提取了ticket
的相关内容,重新拼接url
,得到了cookies
。
编码问题
返回的html页面,里面所以的中文都变成\\u537f
类似的符号,双斜杠应该变成单斜杠才能正常显示中文,最后通过下面代码才成功。1
str.encode('utf-8').decode('unicode_escape')
但是在最后df.to_csv
的时候仍然出错,显示如下。1
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 349-352: surrogates not allowed
网上查阅相似的结果说是路径文件,但实际上就是有些字符不能被编码成utf-8
。最后又在上述代码上加了一些,过滤不能被utf-8
的字符。我猜,可能是微博里的一些表情导致出错。1
str.encode('utf-8').decode('unicode_escape').encode('utf-8','ignore').decode()
全局变量错误
程序一开始很正常运行,结果突然告诉我出现全局变量错误,我一开始很不了解,在网上找了半天,结果实际上是我爬的太快,需要网页验证码,这也是自己没有在代码里考虑该问题的结果。错误信息如下:1
UnboundLocalError: local variable 'outData' referenced before assignment
以上就是我踩过的所有坑,最后放上自己的代码链接。Github传送门
PS:参考文章和代码就不写了,太多了,记不住……