L5& L6& L7 电影词云图-豆瓣
从豆瓣上爬取数据,完成电影词云图,共以下5步:
- 向网页发送请求,获取网页源代码;
- 解析源代码,提取想要的数据;
- 使用 jieba 模块将语句切分成词;
- 运用字典的知识进行词频统计;
- 将词语生成词云图。
1. 向网页发送请求,获取网页源代码;
1-1 查看目标文本所在位置
在 Google Chrome浏览器中复制粘贴下面的链接,先去看看网页内容
https://movie.douban.com/subject/2129039/comments?sort=new_score&status=P
打开网页后可以看到《飞屋环游记》这部电影的相关短评。
1-2 获取网页中的 HTML 代码
# TODO 使用import导入requests模块
import requests
# TODO 将豆瓣电影评论URL地址,赋值给变量url
url="https://movie.douban.com/subject/2129039/comments?sort=new_score&status=P"
# TODO 使用requests发起GET请求,赋值给response
response=requests.get(url)
# TODO 使用print输出response
print (response)
1-3 状态码418
返回一个状态码 418。
418 其实是一个愚人节玩笑,含义是:当客户端给一个茶壶发送泡咖啡的请求时,茶壶就返回一个 418 错误状态码,表示“我是一个茶壶”。
在这里,状态码 418 也意味着我们的爬虫被豆瓣“发现”了。
1-4 身份信息User-Agent
在进行 HTTP 请求的时候,除了请求指定的 url 信息之外,还会告诉服务端“我是谁”,“我支持哪些特性”。
这些信息就是 HTTP 请求头 ,其中声明“我是谁”的就是 HTTP 请求头部的 User-Agent 。
由于我们用的是 requests 发起的请求,而不是浏览器,所以我们需要伪装成 Chrome 浏览器。
# 使用import导入requests模块
import requests
# 从bs4中导入BeautifulSoup
from bs4 import BeautifulSoup
# 将URL地址赋值给变量url
url = "https://nocturne-spider.baicizhan.com/2020/08/07/1/"
# 将变量url传入requests.get(),赋值给r
r = requests.get(url)
# TODO 使用print()输出响应消息中的request.headers
print (r.request.headers)
1-5使用身份信息
请求头中的 User-Agent 用来表示产生请求时浏览器的类型。
查看使用响应消息.request.headers 输出的请求头中, User-Agent 的值为 python-requests ,说明此次请求是Python发出的并且能被服务器识别到。
# 使用import导入requests模块
import requests
# 从bs4中导入BeautifulSoup
from bs4 import BeautifulSoup
# 将URL地址赋值给变量url
url = "https://nocturne-spider.baicizhan.com/2020/08/07/1/"
# TODO 将User-Agent以字典键对形式赋值给headers
headers={
"user-Agent":"JingJing"}
# TODO 将字典headers传递给headers参数,添加进requests.get()中,赋值给r
r=requests.get(url,headers=headers)
# TODO 使用print()输出响应消息中的request.headers
print (r.request.headers)
1-6 获取User-Agent
打开网页,右击-检查-network-(刷新网页)-name-headers-request headers-User-Agent。
1-7 设置请求头
我们用浏览器打开网页,就是浏览器对服务端发送的请求,刚刚查看的请求头就是浏览器的信息。
接下来,可以设置请求头信息,模拟成浏览器去访问网站。
复制浏览器的 User-Agent 的值,粘贴到代码中,以字典key-value的形式赋值给字典 headers。
在 requests.get() 中添加参数 headers,其参数值为字典 headers 。
# 使用import导入requests模块
import requests
# 将豆瓣电影评论URL地址,赋值给变量url
url = "https://movie.douban.com/subject/2129039/comments?sort=new_score&status=P"
# TODO 将User-Agent以字典键对形式赋值给headers
headers={
"user-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}
# TODO 将字典headers传递给headers参数,添加进requests.get()中,赋值给response
response=requests.get(url,headers=headers)
# TODO 使用.text属性获取网页前1000个字符的内容,并赋值给html
html=response.text[:1000]
# TODO 使用print输出html
print (html)
2. 解析源代码,提取想要的数据;
2-1 给变量 soup赋值
# 使用import导入requests模块
import requests
# TODO 从bs4中导入BeautifulSoup
from bs4 import BeautifulSoup
# 将豆瓣电影评论URL地址,赋值给变量url
url = "https://movie.douban.com/subject/2129039/comments?sort=new_score&status=P"
# 将User-Agent以字典键对形式赋值给headers
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}
# 将 url 和 headers参数,添加进requests.get()中,将字典headers传递headers参数,给赋值给response
response = requests.get(url, headers=headers)
# 将服务器响应内容转换为字符串形式,赋值给html
html = response.text
# TODO 使用BeautifulSoup()传入变量html和解析器lxml,赋值给soup
soup=BeautifulSoup(html,"lxml")
# TODO 使用print输出soup
print (soup)
2-2 定位网页中待获取信息的位置
右击-检查-检查页面左上角箭头图表-(鼠标移动至待获取信息位置)-查看检查页面的响应位置
观察网页可以发现:
所有的评论都在 标签中,检索span标签在网页中出现了100多次,而显然,该页只有二十条评论。
也可以试试以
节点来定位,网页中p标签出现的次数也大于20。
短评所在的节点都是类似的它们都有一样的标签和属性。
在 HTML 中,span 标签的作用是用来组合文档中的行内元素。
class 属性的作用是用来给标签分类。class="short"也就代表着,这里标