通过哪吒动漫豆瓣影评,带你分析python爬虫与BeautifulSoup快速入门【华为云技术分享】
久旱逢甘霖
西安连着几天温度排行全国三甲,也许是《哪吒之魔童降世》的剧组买通了老天,从踩着风火轮的小朋友首映开始,就全国性的持续高温,还好今天凌晨的一场暴雨,算是将大家从中暑边缘拯救回来了。不知道有多少人看了这部国产动漫,但5天破9亿的票房已然不错,可惜忙碌的我只能在朋友圈看看好友的观影评价+晒门票。
爬虫解析
最近更新爬虫的文章较多,对于这种投入量小,回报率高且装13效果好的python方向,大家都比较喜欢。其实单纯的爬虫很简单,麻烦的是网站的接口分析与数据解析。通常我们大量的时间,用在了对网站数据流的分析,最终得到数据接口的过程。这部分的内容,针对不同网站需要单独分析,没有一个可以套的公式,所以讲起来也没有太好的效果。那么,除去了网站分析,刚才提到的数据解析是否有可复用的地方呢?当然…
网站数据解析
说到网站的数据解析,那么我们首先得找一个供我们爬虫的网站,既然刚才提到了哪吒,我们就拿豆瓣评分来举例子吧:
点击网页短评的全部xxx条链接,即可进入该动画的全部影评网页:
之后我们来看看短评界面的数据结构:
我们可以看到,所有的评论都包裹在一个class=”mod-bd”和id=”comments”的div中,这里注意个html的常识,绝大多数的情况下,如果一个标签存在id和class,那么你请优先选择id作为你的定位游标,因为它具备唯一性。当然你也可以使用class定位,但它可能存在多个,如何判断是否唯一呢?这里教你个简单的方法…
console下编写js
我们F12打开浏览器的开发者工具,然后选择Console标签页,通过js代码输入你想了解的class等标签名称即可:
> document.getElementsByClassName("mod-bd").length
<
> document.getElementsByClassName("comment").length
<
> document.getElementsByTagName('a').length
<
> document.getElementsByName("description").length
<
土办法
如果你觉得F12看这很不习惯,就是想搜索,那么你可以再网页上右键+查看源代码(快捷键CTRL+U),但这种方式极其不推荐…
爬虫获取数据
分析了网页结构,就到了代码筛选网页数据的过程了。通常这个时候我们该考虑两件事,获取网站源码与数据过滤
获取网站源码
首先如何通过代码获取到网页的整体源码,并通过规则完成批量获取。我们点击豆瓣影评的下一页,会看到url如下:
https://movie.douban.com/subject/26794435/comments?start=20&limit=20&sort=new_score&status=P
其中问号以后,是网站get请求是附带的传参,其中只需要关注start=20即可,其他的参数都可以忽略不会影响到最终的数据获取。
所以,我们只需要定制匹配规则后,编写代码:
# -*- coding: utf- -*-
# @Author : 王翔
# @JianShu : 清风Python
# @Date : // :
# @Software : PyCharm
# @version :Python 3.7.
# @File : MovieComments.py import requests class MovieComments:
def __init__(self):
self.pages = def make_urls(self):
for page in range(self.pages):
r = requests.get("https://movie.douban.com/subject/26794435/comments?start={}".format(page * ))
print(r.text) if __name__ == '__main__':
main = MovieComments()
main.make_urls()
我们先获取第一页的数据,来进行下测试,针对返回的结果,我们找一个关键字确认下,就找刚才那个评分人名字吧丁凯乐,看看有没有
确认数据获取无误,下来我们就可以适当放开pages的数量,按照你想获取的页数,进行爬虫了。
数据过滤
按照上面的得到了网页的源码只是很小的一步,我们还需要将网页源码内容进行数据过滤,最终得到我们想要的数据…看过刚才的网页分析,我们了解到了需求内容,需要获取每一条影评中的影评人、推荐指数、影评内容、点赞数、评论时间。该怎么过滤出这些数据呢?通常的方式有两种:
直接使用正则去匹配所需内容
使用python的BeautifulSoup模块
re与BeautifulSoup比较
有一句话说的好,当一件事情遇到了正则,那么它将变为两件事。这句话的意思不言而喻,正则是一件让人头疼的事情,但为什么使用度还这么高,因为它的高效率。
那么BeautifulSoup有什么优势呢?抛开上纲上线的纯Python模块更加Pythonic的客套话,BeautifulSoup的定位方式与js、selenium、css selector等等同类型语言或者工具都大相径庭,所谓一通百通,学会了一种就相当于学会了一个范围的内容。但还是要说一点,纯python开发的模块,运行效率不如re高…,所以,说了半天你会选择哪个模块进行定位?
BeautifulSoup
介绍
BeautifulSoup 库的名字取自刘易斯 ·卡罗尔在《爱丽丝梦游仙境》里的同名诗歌:
“美味的汤,绿色的浓汤,
在热气腾腾的盖碗里装!
谁不愿意尝一尝,这样的好汤?
晚餐用的汤,美味的汤!”
这诗歌吧…恩,欣赏不来。
安装&导入
使用pip install beautifulsoup4
命令,即可完成安装操作。
导入时,我们需要注意它的名称变更,需使用:from bs4 import BeautifulSoup
使用
当我们将网页的t.text传输给BeautifulSoup时,还需要引入语法分析器,默认使用较多的为lxml和html.parser,之前介绍手机打造python开发者桌面时,说过这两个模块html.parser是python自带的模块,而lxml则需要安装,切安装时在linux等环境下经常报错,但优点是效率高。
元素定位
BeautifulSoup的元素定位方式多种多样,下面我们挑选常用的集中方式进行讲解…为了方便测试,我们将刚才的网页保存至本地。
...
with open('comments.html', 'w', encoding='utf-8') as f:
f.write(r.text)
...
之后我们在本地读取文件,免得每次去请求豆瓣影评:
# -*- coding: utf- -*-
# @Author : 王翔
# @JianShu : 清风Python
# @Date : // :
# @Software : PyCharm
# @version :Python 3.7.
# @File : LearnBeautifulsoup.py from bs4 import BeautifulSoup with open('comments.html', encoding='utf-8') as f:
html = f.read() soup = BeautifulSoup(html, 'lxml')
标签定位
标签定位方式最为简单,print(soup.h1) >>> <h1>哪吒之魔童降世 短评</h1>
当然它也等同于:print(soup.find('h1')) >>> <h1>哪吒之魔童降世 短评</h1>
print(soup.html.body.h1) >>> <h1>哪吒之魔童降世 短评</h1>
find与findAll
这两个方法在js、selenium中也有同类的方法,意味查找一个和查找所有。同事findAll返回结果为list,支持列表切片的操作。
find(tag, attributes, recursive, text, keywords)
findAll(tag, attributes, recursive, text, limit, keywords)
一般我们常使用的只要tag和attributes字段。
print(soup.findAll((‘h1’,’title’)))
print(soup.findAll(“div”, {“class”:”mod-bd”}))
recursive默认为True,表示递归抓取,如果设置成False,那么仅抓取游标的一级标签,而忽略器所有子标签
limit这是findAll的一个切片操作,类似于print(soup.findAll(“div”, {“class”:”comment”}))[:limit]
keyword为关键字,比如:print(soup.find(id=”comments”))。
注意:keyword中由于是使用赋值操作,当遇到class这种类关键字是,需要这么写:soup.find(class_=”mod-bd”)
巧用attrs
我们注意到每一个短评数据中,都有一个data-cid的属性,那么当我们巧用该属性,就可以立即定位到每个影评,方式如下:
print(soup.findAll(“div”, attrs={‘data-cid’:True}))
子与后代标签
child、children、descendants,都表示标签的子标签,只是descendants表示所有子孙标签,而child和children只是一级子标签,区别在于单个和所有的筛选
兄弟父子标签
next_siblings表示当前标签之后的所有子标签,要注意这个之后的操作,比如之前的comment-item,我们代码这么写:
for i in soup.findAll("div", attrs={'data-cid':True})[-].next_siblings:
print(i)
我们扎到本页所有评论后,定位到倒数第三条评论,然后使用next_siblings,那么代码只会找到这条评论之后的-2和-1两条评论。
至于parent和parents就再简单不过了,无非是我限定为到子级标签,之后逆推至它的父级标签:print(soup.find("div", attrs={'data-cid':True}).parent)
我们先定位到一条评论,之后获取其父标签,结果将是得到了整页的20条评论
引入正则
虽然不想单独说正则,但是BeautifulSoup在定位过程中,确实支持正则表达式的匹配使用的,简单举个例子吧:print(soup.findAll("div", {"class":re.compile("comment-.*?")}))
通过re.compile制定匹配规则,一样可以获取到所有的评论信息…
The End
OK,今天的内容就到这里,如果觉得内容对你有所帮助,欢迎点击文章右下角的“在看”。
期待你关注我的公众号清风Python
,如果觉得不错,希望能动动手指转发给你身边的朋友们。
作者:清风Python
HDC.Cloud 华为开发者大会2020 即将于2020年2月11日-12日在深圳举办,是一线开发者学习实践鲲鹏通用计算、昇腾AI计算、数据库、区块链、云原生、5G等ICT开放能力的最佳舞台。
通过哪吒动漫豆瓣影评,带你分析python爬虫与BeautifulSoup快速入门【华为云技术分享】的更多相关文章
- 带着canvas去流浪系列之八 碰撞【华为云技术分享】
[摘要] canvas动画-碰撞仿真 示例代码托管在:http://www.github.com/dashnowords/blogs 经过前面章节相对枯燥的练习,相信你已经能够上手canvas的原生A ...
- 带着canvas去流浪系列之九 粒子动画【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- [动图演示]Redis 持久化 RDB/AOF 详解与实践【华为云技术分享】
Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集 合.以及散列等,并且还支持多种排序功能. 什么叫持 ...
- Python爬取豆瓣音乐存储MongoDB数据库(Python爬虫实战1)
1. 爬虫设计的技术 1)数据获取,通过http获取网站的数据,如urllib,urllib2,requests等模块: 2)数据提取,将web站点所获取的数据进行处理,获取所需要的数据,常使用的技 ...
- 【电影影评】梦之安魂曲-败给了BGM和豆瓣影评
首先,这部电影豆瓣8.7分,一般来说,豆瓣的打分是比较准确的.能反映一个片子的质量,而较少受到环境的影响.但是这种关系当然也不全对,比如某些片子可能特别让某一种人喜欢(如退役军人和军旅题材),而在某些 ...
- Python爬虫之抓取豆瓣影评数据
脚本功能: 1.访问豆瓣最受欢迎影评页面(http://movie.douban.com/review/best/?start=0),抓取所有影评数据中的标题.作者.影片以及影评信息 2.将抓取的信息 ...
- 【python数据挖掘】爬取豆瓣影评数据
概述: 爬取豆瓣影评数据步骤: 1.获取网页请求 2.解析获取的网页 3.提速数据 4.保存文件 源代码: # 1.导入需要的库 import urllib.request from bs4 impo ...
- 用Python做词云可视化带你分析海贼王、火影和死神三大经典动漫
对于动漫爱好者来说,海贼王.火影.死神三大动漫神作你肯定肯定不陌生了.小编身边很多的同事仍然深爱着这些经典神作,可见"中毒"至深.今天小编利用Python大法带大家分析一下这些神作 ...
- python3爬虫再探之豆瓣影评数据抓取
一个关于豆瓣影评的爬虫,涉及:模拟登陆,翻页抓取.直接上代码: import re import time import requests import xlsxwriter from bs4 imp ...
随机推荐
- Redis实战--Redis整合SpringBoot示例
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 该文章 ...
- Elasticsearch 技术分析(八):剖析 Elasticsearch 的索引原理
前言 创建索引的时候,我们通过Mapping 映射定义好索引的基本结构信息,接下来我们肯定需要往 ES 里面新增业务文档数据了,例如用户,日志等业务数据.新增的业务数据,我们根据 Mapping 来生 ...
- 从BIO到Netty的演变
从BIO到Netty的演变 前言 计算机网络可以说是每个学计算机的都绕不过去的一道坎.计算机网络到底有多么重要,你走到大学图书馆的计算机部分,翻开那些什么<从零开始:黑客XXX>,< ...
- Java基础语法03-数组
四数组 数组概念: 数组就是用于存储数据的长度固定的容器,多个数据的数据类型要一致. 百科:数组(array),就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,以 ...
- day8-函数
---def test(x): # def:定义函数的关键字,test:函数名, x相当于以前函数中的自变量使用函数的好处:1.代码重用2.保持一致性,易于维护3.可扩展性 def test(x): ...
- Mysql主从同步的实现原理与配置实战
1.什么是mysql主从同步? 当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库. 2.主从同步有什么好处? 水平扩展数据库的负载能力. 容错,高可用.Failover ...
- Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)
1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.到今天为止,大功即将告成:框架所需要的代码实现都基本完成. 2.data数据封装 2.1使用背景 在实际项目过程 ...
- 微擎 manifest.xml
微擎 manifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns= ...
- mysql5.7下载与安装
一.完全卸载旧版mysql 参考文章:https://blog.csdn.net/hui1setouxiang/article/details/89816176 二.win10中下载安装mysql5. ...
- 使用idea来部署git项目
使用idea来部署git项目 一).将项目交由git管理 VCS ---->import into Version Cntorl ------>create Git Repository ...