【Python】爬虫:微博找人页面爬虫(四) - Go语言中文社区

【Python】爬虫:微博找人页面爬虫(四)


【Python】爬虫:微博找人页面爬虫(四)

从url对列中拿到url,下载页面,返回html的内容,然后解析就可以拿到需要的信息,但是微博的页面不是这样的,如果按照这个做法,返回html的body中什么都没有,得到的内容会是:
在这里插入图片描述
遇到这种情况,就会考虑这些页面的内容是动态加载,可以有以下两种方式
1,可以使用selenium模拟浏览器,加载完页面后,再用selenium提供的方法定位就可以获取内容。,
2,模拟ajax发送request,从response中获取内容。

通过分析页面加载的过程,没有发现有ajax异步请求加载,但是selenium又不太稳定,有时会加载很久。那怎么获取内容呢?想了想,如果木有ajax异步请求,那么其实在第一次请求页面的时候,页面上的信息就已经返回了,只是没有显示出来,所以,是通过js显示response的内容?后面发现页面有很多<script>…<script>,内容都是相同的
在这里插入图片描述
FM.view中哟参数是json格式的数据,json数据中还有‘html’的key,value就是对应页面加载的内容。所以,要做的就是解析这些<script>中json数据中html的内容。每个<script>对应的内容是不一样的,经过对比,文章页和列表页都是以这种方式进行加载。

总结下:页面通过js加载内容,内容是js中json的‘html’的value,而且可以通过json中的‘domid’定位到对应的内容。

<script>FM.view(
{"ns":"page.pl.frame.index",
"domid":"plc_frame",
"css":[],
"js":"page/js/pl/frame/index.js",
"html":"<div class="WB_frame">rn        <textarea node-type="skin_style" style="display: none" readonly>//img.t.sinajs.cn/t6/skin/skin048/skin.css?version=65a933199b3fb416</textarea>rn        t<div class="WB_frame_a">rn            t<div id="Pl_Official_Headerv6__1"></div>rn                    t<div id="Pl_Official_Nav__2" name="place" anchor="-50"></div>rn    t    </div>rn    tt<div id="plc_main"></div>rnt</div>"}
)</script>

一,解析列表页得到文章页url,以及下一页列表的url

     detail_url_html = re.search(r'{(.*?)"domid":"Pl_Core_F4RightUserList__4"(.*?)}', text)
                if detail_url_html:
                    # print(detail_url_html.group())
                    data = json.loads(detail_url_html.group(), strict=False)
                    html = etree.HTML(str(data.get('html')))
                    #判断返回的页面内容是否为空
                    error_selector = html.xpath('//div[@class="WB_empty"]')
                    if len(error_selector) == 0:  #内容不为空
                        urllist_selectors =html.xpath('//dt[@class="mod_pic"]/a/@href')
                        # 获取详细页url
                        for urllist_selector in urllist_selectors:
                            detail_url = 'https:' + urllist_selector
                            print(detail_url)
                            self.lowlevel_db.addUrl(detail_url)
                        nexturl_selector = html.xpath('//a[@class="page next S_txt1 S_line1"]/@href')
                        # print(nexturl_selector)
                        if  nexturl_selector :
                            next_url = 'https://d.weibo.com' + nexturl_selector[0]
                            print(next_url)
                            self.highlevel_db.addUrl(next_url)
                        else:
                            print('已经是最后一页')
                    else:#内容为空
                        print(data.get('html'))
                        self.highlevel_db.addUrl(page.get('url'))

这里需要注意,在频繁访问时,会返回一个空页面,这还是就需要将对应的url放回队列之中,后面在进行访问。除此之外,还需要判断是否到了最后一页,如果到了最后一个列表页,此时的下一页对应的‘href’会是空的!
比如,解析 https://d.weibo.com/1087030002_2975_1001_0# 的结果,只要一页,没有下一页。
在这里插入图片描述

二,解析文章页,获取相关信息。
文章页包含的东西很多,可以F12,定位到对应的’domid’,再使用正则表达式匹配到对应的<script>,解析里面的json数据,获取到‘html’的value后,就可用lxml进行解析。下面的代码是获取关注数,粉丝数,博客数。

#定位<script>
second_part = re.search(r'{(.*?)"domid":"Pl_Core_T8CustomTriColumn__3"(.*?)}', text)
                if second_part:
                    data = json.loads(second_part.group(), strict=False)  #解析json数据,获取html的value
                    html = etree.HTML(str(data.get('html')))
                    selectors = html.xpath('//a[@class="t_link S_txt1"]/strong')   #使用lxml解析
                    # print(selectors)
                    if selectors:
                        # 关注数
                        self.info_data['followers_num'] = selectors[0].text
                        # 粉丝数
                        self.info_data['fans_num'] = selectors[1].text
                        # 微博数
                        self.info_data['weets_num'] = selectors[2].text

代码已经上传至GitHub,仅供参考
https://github.com/yangjunjians/Crawlers

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/yangjjuan/article/details/100002108
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢