在成功登陆之后,我们可以进行下一波操作了~
接下来,我们的目的是通过输入关键字,找到相关用户,并收集用户的一些基本信息
环境
tools
1、chrome及其developer tools
2、python3.6
3、pycharm
Python3.6中使用的库
关键词搜索
我们首先在微博首页输入关键词,进入搜索页面
搜索后,我们发现网址为http://s.weibo.com/user/%25E4%25B8%258A%25E8%25AE%25BF&Refer=weibo_user
很显然,前面的“http://s.weibo.com/user/”网页基础地址,“%25E4%25B8%258A%25E8%25AE%25BF”看起来很像关键词的一种编码形式,最后的一段内容我们先放一边,点击进入下一页继续观察规律
进入第二页后,我们发现网址变为http://s.weibo.com/user/%25E4%25B8%258A%25E8%25AE%25BF&page=2
这时,我们需要猜想,如果将“page=”之后的数字改为1,是否会跳转回首页:
成功了,这样我们就可以将url分为三部分。
现在,我们需要对中间编码部分进行解析,发现它经过两次url编码。
因此,最后搜索页的url连接如下:
用户基本信息提取
接下来,我要对用户的一些基本信息进行爬取。
经过观察,初步确定了搜索页面所能爬取到的用户信息字段:
- 微博ID——_id
- 微博名——name
- 地区——location
- 性别——gender
- 微博地址——weibo_addr
- 关注——follow
- 粉丝——fans
- 微博数——weibo_num
- 简介——intro
- 职业——职业信息
- 教育——教育信息
- 标签——标签
(其中,红色字段是必有的。)
我们将先对【必有字段】进行爬取,再研究如何爬取【非必有字段】。
首先我们先观察网页源码,定位到用户主体部分【可以用Chrome自带的developer tools中的element进行定位】
于是我们发现,开头为“”,我们可以通过正则表达式,寻找出该内容
此外,仔细观察还能发现()里面的内容为json格式。
万岁~~
这样对我们提取所需的html内容十分的有帮助~~
然后开始正式的网页内容解析,先对【必有字段】进行解析。
这里,我们依旧需要借助Chrome上的developer tools
通过elements,我们定位到微博名对应的html内容,我们可以利用lxml中的etree和xpath获取title名。
同理,我们也可以得到其他必有字段,最后我们讲所有内容存储成一个dict,每个key对应的value则为一个list:
最后是对【非必有字段】的爬取
该类字段爬取的思代码逻辑是这样的
利用lxml包中的etree抓取子树(class="person_detail")
再对子树下的枝干进行遍历,判断是否存在简介(class="person_info")和标签(class="person_label"),分别进行不同的处理
值得注意的是,部分标签下的内容不止一个,因此我们必须对标签内容进行一次判断和遍历。
由于简介和标签分别处于两个枝干,因此可以编辑两个不同的函数进行提取:
构造完函数后,可以提取所有用户的信息啦~
需要注意的是,返回的内容是单个子树下的一个string,遍历当前页的所有用户的信息,则需要做成list:
遍历所有页面
在成功实践了用户基本信息的爬取之后,需要遍历所有的网页
这里,我们可以用很傻瓜的方法,自己观察一共有几页,然后编一个for循环
然鹅!!!博主我绝对不会干这种蠢事的!!!必须要有一个更加装x的方式来遍历才行!
于是,继续依赖developer tools,找到点击下一页对应的元素,我们发现了一个神奇的东西——class="page next S_txt1_S_line1"
这不就是绝佳的定位是否存在下一页的神器么!!!
于是,最佳代码逻辑诞生啦~~
通过判断能否提取出该内容来决定是否进入还需进入下一页i += 1
撒花~~~代码的整体逻辑就这么完善啦~~~
最后,我们需要解决的就是反爬的问题了,博主在这方面还没有深入研究过
不过主要思路还是有的:
- 每次遍历设置一个time.sleep()
- 设置好详细的头文件
- 寻找代理IP