一. 技术选型
语言:python3
工具:anaconda
核心库and插件:chromedriver+selenium
关键词搜索之后刷新出的微博页面中,每条微博的内容其实是在js里动态渲染出来的,因此通过传统的request.get的方法获取到的静态页面中解析不出相应的标签。
二. 踩过的坑(未完待续)
1. 元素定位失败
1.1区分 “/div/span”与“./div/span”
前者是在整个网页上寻找,后者才是在当前组件的子集中寻找
1.2组件过期
页面跳转后,获取到的上一个页面中的组件(已存储成了某个变量的值)会过期,导致组件中的元素定位失败
1.3一个爬取实时微博的逻辑错误
实时微博会不断更新,也就是说你翻到第2页的时候,由于又新增了新的微博,所以刚刚你爬取完的第一页变成了现在的第二页,于是你就会爬到很多重复的内容
2. 100页的限制
自己构造url吧,按照如下的方式:
keyword_encode= urllib.parse.quote(keyword)
nick_encode=urllib.parse.quote(nick)
nextPage='https://weibo.cn/search/mblog?hideSearchFrame=&keyword='+keyword_encode+'&advancedfilter=1&nick='+nick_encode+'&starttime=20191231&endtime=20200204&sort=time&page='+str(page+1)
(keyword等参数的值要根据自己的需要改啊)
⚠️注意:这种方法只能突破100页的限制,但是当页数很多时还是会被限制。例如按照这种方法也许可以爬到130页,但是131页的内容为空(不是打不开131页,是打开之后没有内容)。此时sleep一会也是没用的,只能重新搜索没有爬到的时间范围,再继续爬。
3. 输入起止日期时的坑
爬取实时微博时,终止日期的input框里有一个默认值(就是当天),要先删掉,不然新的值传不进去:
elem.clear()
elem.send_keys(self.end_time)
(elem算是一个chromedriver类的实例,如果python也有类的概念的话)
4. 会有一些反爬虫机制
多sleep吧,没别的办法
selenium库定位元素的语法可参考资料:
https://www.cnblogs.com/bzdmz/p/10325152.html 定位元素
https://blog.csdn.net/xm_csdn/article/details/53390649 获取属性值