weibo_spider
微博爬虫:
- 爬取热搜榜:不需要登录,但是需要处理反扒措施
- 爬取热门话题:需要登录之后获得cookies和user_id
爬取热搜榜
微博热搜榜地址:https://s.weibo.com/top/summary?cate=realtimehot
,具体爬取代码如下,其中最终的部分在于对热搜标题中的反扒处理,具体可参见简书中的爬取新浪微博热搜。具体代码如下:
爬取热门话题
热门话题在登录之后会出现在home页面中,示例地址:https://weibo.com/u/3655576503/home
可以采用selenium模拟登录,模拟登录的关键是通过selenium提供的选择器找到对应的input标签和对应的submit按钮。使用过程中遇到了以下问题:
微博selenium模拟登录bug
验证版本:
chromedriver=2.37 and os = ubuntu 16.04 LTS
如果不增加chrome_options会出现chromedriver加载失败的报错,报错如下:
同时需要在get操作之前增加driver.set_window_size(1124, 850)
进行窗口大小的预置(合适的值即可),否则得到的WebElement的状态is_displayed为False,即不可见,导致进行clear操作和send_keys操作时出现异常。异常如下:
处理方法参考PhantomJs 的一个issue:https://github.com/ariya/phantomjs/issues/11637
bug解决之后完整的登录代码如下:
登录成功之后可以获取到cookies数据和后续抓取所需要的user_id。并且cookies也需要转变成request库所需要的格式。
最后能成功获取到热门话题以及对应的链接和阅读量。
总结
整个爬取任务中的关键在于反扒,模拟登录,以及抓取正则表达式。本次涉及到了以下爬虫技巧:
- 登录:cookie
- 登录:表单
- 伪装成浏览器访问
- 反”反盗链”
要做一个完整的大爬虫,还需要涉及以下几个部分:
- 验证码:想尽一切办法避免验证码(目前验证码的难度比较大,一定有验证码时,可以做成服务)
- gzip/deflate:流式解压用于提高效率
- 多线程(线程类和线程池)
- http代理池:squid和haipproxy构成高可用的ip代理迟
这几个部分本次用不上,后续补充。
参考: