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

本文介绍了一种针对微博页面的爬虫技术,通过解析动态加载的JS脚本中的JSON数据,提取html内容,实现对微博文章页和列表页信息的抓取,包括关注数、粉丝数等关键数据。

【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\">\r\n        <textarea node-type=\"skin_style\" style=\"display: none\" readonly>\/\/img.t.sinajs.cn\/t6\/skin\/skin048\/skin.css?version=65a933199b3fb416<\/textarea>\r\n        \t<div class=\"WB_frame_a\">\r\n            \t<div id=\"Pl_Official_Headerv6__1\"><\/div>\r\n                    \t<div id=\"Pl_Official_Nav__2\" name=\"place\" anchor=\"-50\"><\/div>\r\n    \t    <\/div>\r\n    \t\t<div id=\"plc_main\"><\/div>\r\n\t<\/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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值