网友:看胸
女:出去
网友:乳房竞赛
女:[图片留言]
知乎上次讲过之后身材好是什么体验?在分析了知乎回答的内容之后,这次我们就来分析一下微博的内容,以微博用户发起的乳房大赛为例:
这是这次要获取的微博图片内容,共672张很凶的照片:
以下是关于如何获取的。不感兴趣的话可以去微信官方账号回复地图获取。
首先进入开发者工具看微博结构:
这只是一小部分。微博用户发的微博评论和微博页面都是以格式传送到本地的。格式化内容后,你会发现层次结构很复杂,有兴趣可以看看。与其分析这个,不如用的简单一点。所以当时有两个想法:
通过直接解析呈现的页面
用手机APP微博的包,用控制手机刷新评论
不管是哪种方式,都比只拿个图麻烦。于是我去网上搜索,搜索结果都是前两年爬微博的方法。当时,它们仍然是由ajax以json格式传输的,但现在显然不是了。
然后运气好的话把访问表单换成手机,微博域名会从,然后看网络标签上以hotflow开头的xhr:
此时,weibo.cn传输的本地信息是简单的json格式。上图是微博评论列表中的评论。你可以看到,如果每个评论里都有一张图片,它就会有pic属性,但是注意pic下面的直接子url只是预览链接,不是原链接。大图片下pic属性下原图片链接的url。其他属性有标题、发送时间、内容、喜欢、评论、转发号、博主相关信息。我们这次的重点是图片,其他什么都不留。
另外微博的防爬措施很强,真的让我恶心。如果有大规模的抓取需求,建议去淘宝买个号,建个Cookie池,或者用代理池不断切换访问主机。如果您只使用计算机的本地Cookie,您可以完成请求头并限制爬网速度。
切换到标题选项卡,查看请求网址:
https://m.weibo.cn/comments/hotFlowChild?cid=* * * * 60411 max _ id=* * * * 0286 max _ id _ type=0
你可以看到它的格式是
https://m.weibo.cn/comments/hotFlowChild?
' cid max_id max_id_type '
CID是每条微博的唯一ID,max_id是下一条返回数据的最后一条评论的ID。也就是说,向下看评论,一次显示十条评论,返回本次评论中后面十条评论的最后一条评论的唯一ID。微博根据这个ID返回接下来的十个内容。这直接限制了你在抓取评论、微博、二次评论时一次只能得到十篇文章,不能用线程池来加速,因为只有得到这十篇文章,才能知道max_id在接下来的十个请求地址中的值。
然后,您可以根据这些信息构造一个请求,并获得json格式的响应结果:
comment _ URL=' https://m . Weibo.cn/comments/hot flow?id={ Weibo _ id } mid={ Weibo _ id } max _ id={ max _ id } max _ id _ type=0 ' URL=comment _ URL . format(Weibo _ id=id,max _ id=0)response=requests . get(URL,标头=标头)result=JSON . loads(response . text)
首先获取评论总数,以计算爬上评论的次数:
total_number=result.get('data ')。get(' total _ number ')total _ number=int(total _ number)for iirange(int(total _ number/10)): result=get _ page(Weibo _ id)for urlinparse _ comment(result): save _ to _ img(URL)
下载图片才700年,张才就知道后面的评论没用了(男主联系方式和答案等。)。
然后得到图片地址:
def parse _ comment(result): ifresult . get(' ok ')和result.get('data ')。get(' data '): comments=result . get(' data ')。get(' data ')for commentcomments : if comment . get(' pic '): URL=comment . get(' pic ')。get('大')。get('url')yieldurl
先检查ifcomment.get('pic ')很重要,因为很多没用的评论没有图片,也就是没有pic属性,所以要这样过滤掉。
还有这个:
这里要爬二级评论,看结构:
值得注意的是,无论二次评论里有没有图片,都不会有pic属性,图片在回答文本里是嵌套在css里的。很明显,A标签下的href属性就是图片地址。使用pyquery检索地址:
childs _ comment=result . get(' data ')for child _ comment childs _ comment : text=child _ comment . get(' text ')content=pyquery。PyQuery(text)url=content('a ')。attr('href')yieldurl
存储的图片以图片内容的md5值命名,可以复制:
响应=请求。get (URL) ifresponse。status _ code==200: img _ path=' { 0 }/{ 1 }。“{2}”。格式(路径,md5(响应。内容)。hexdigest(),' jpg') #带MD5图片字符串
最后,我们访问了某大型工厂的人体特征值检测。考虑到大部分图片没有显示人脸,性别识别不够准确,这里只去掉了不识别人体的图片(部分表情)。
有兴趣的话可以通过微信官方账号的回复得到这张微博图和最后一张知乎图
这个微博结构比较简单,类似于上一篇关于知乎的文章,没有提供源代码。
微信官方账号:爱写bug(ID:icodebugs)
相关阅读
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除
标签: #爬去微博热门事件