本次python爬虫需要的环境是:
selenium模拟登录+BeautifulSoup4爬取数据+wordcloud生成词云图
BeautifulSoup安装
pip install beautifulsoup4
学习Python中有不明白推荐加入交流群
号:960410445
群里有志同道合的小伙伴,互帮互助,
群里有不错的视频学习教程和PDF!
用到解析器,我选择的是html5lib解析器
pip install html5lib
下表列出了主要的解析器,以及它们的优缺点:
selenium模拟登录
selenium模拟登录
使用selenium模拟登录QQ空间,安装
pip install selenium
我用的是chrom浏览器,
webdriver.Chrome()
,获取Chrome浏览器的驱动。
这里还需要下载安装对应浏览器的驱动,否则在运行脚本时,会提示
chromedriver executable needs to be in PATH
错误,
下载对应的驱动,解压后,将下载的**.exe 放到Python的安装目录,例如 D:python 。 同时需要将Python的安装目录添加到系统环境变量里。
1.qq登录页
htp://i.qq.com,利用webdriver打开qq空间的登录页面
driver = webdriver.Chrome()
driver.get("http://i.qq.com")
打开之后右击检查查看页面元素,发现帐号密码登录在
login_frame
里,先定位到所在的frame,
driver.switch_to.frame("login_frame")
,再自动点击 帐号密码登录 按钮,自动输入帐号密码登录,并且打开说说页面,详细代码如下:
friend = '' # 朋友的QQ号,**朋友的空间要求允许你能访问**,这里可以输入自己的qq号
user = '' # 你的QQ号
pw = '' # 你的QQ密码
# 获取浏览器驱动
driver = webdriver.Chrome()
# 浏览器窗口最大化
driver.maximize_window()
# 浏览器地址定向为qq登陆页面
driver.get("http://i.qq.com")
# 定位到登录所在的frame
driver.switch_to.frame("login_frame")
# 自动点击账号登陆方式
driver.find_element_by_id("switcher_plogin").click()
# 账号输入框输入已知qq账号
driver.find_element_by_id("u").send_keys(user)
# 密码框输入已知密码
driver.find_element_by_id("p").send_keys(pw)
# 自动点击登陆按钮
driver.find_element_by_id("login_button").click()
# 让webdriver操纵当前页
driver.switch_to.default_content()
# 跳到说说的url, friend可以任意改成你想访问的空间,比如这边访问自己的qq空间
driver.get("http://user.qzone.qq.com/" + friend + "/311")
这个时候可以看到已经打开了qq说说的页面了,
注意
部分空间打开之后会出现一个提示框,需要先模拟点击事件关闭这个提示框
try:
#找到关闭按钮,关闭提示框
button = driver.find_element_by_id("dialog_button_111").click()
except:
pass
同时因为说说内容是动态加载的,需要自动下拉滚动条,加载出全部的内容,再模拟点击 下一页 加载内容。具体代码见下面。
2.BeautifulSoup爬取说说
F12查看内容,可以找到说说在feed_wrap这个<div>,<ol>里面的<li>标签数组里面,具体每条说说内容在<div> class="bd"的<pre>标签中。
next_num = 0 # 初始“下一页”的id
while True:
# 下拉滚动条,使浏览器加载出全部的内容,
# 这里是从0开始到5结束 分5 次加载完每页数据
for i in range(0, 5):
height = 20000 * i # 每次滑动20000像素
strWord = "window.scrollBy(0," + str(height) + ")"
driver.execute_script(strWord)
time.sleep(2)
# 这里需要选中 说说 所在的frame,否则找不到下面需要的网页元素
driver.switch_to.frame("app_canvas_frame")
# 解析页面元素
content = BeautifulSoup(driver.page_source, "html5lib")
# 找到"feed_wrap"的div里面的ol标签
ol = content.find("div", class_="feed_wrap").ol
# 通过find_all遍历li标签数组
lis = ol.find_all("li", class_="feed")
# 将说说内容写入文件,使用 a 表示内容可以连续不清空写入
with open('qq_word.txt', 'a', encoding='utf-8') as f:
for li in lis:
bd = li.find("div", class_="bd")
#找到具体说说所在标签pre,获取内容
ss_content = bd.pre.get_text()
f.write(ss_content + "")
# 当已经到了尾页,“下一页”这个按钮就没有id了,可以结束了
if driver.page_source.find('pager_next_' + str(next_num)) == -1:
break
# 找到“下一页”的按钮,因为下一页的按钮是动态变化的,这里需要动态记录一下
driver.find_element_by_id('pager_next_' + str(next_num)).click()
# “下一页”的id
next_num += 1
# 因为在下一个循环里首先还要把页面下拉,所以要跳到外层的frame上
driver.switch_to.parent_frame()
至此QQ说说已经爬取下来,并且保存在了qq_word文件里
接下来生成词云图
3.词云图
使用
wordcloud
包生成词云图,
pip install wordcloud
这里还可以使用
jieba
分词,我并没有使用,因为我觉得qq说说的句子读起来才有点感觉,个人喜好,用
jieba
分词可以看到说说高频次的一些词语。
设置下wordcloud的一些属性,
注意这里要设置
font_path
属性,否则汉字会出现乱码。这一点在上一篇词云,这一点在上两期说过,请看链接:
Python-玩转微信
在下面会再发一下字体路径哦。
这里还有个要提醒的是,如果使用了虚拟环境的,不要在虚拟环境下运行以下脚本,否则可能会报错
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.
,我就遇到了这种情况,
deactivate
退出了虚拟环境再跑的
解释在这:
然后说一下加粗的部分,这是一个字体的路径,windows和
mac os不一样哦,这里用的是windows的字体库,下图标识了字体库的位置和名称。一般都是这个路径哦,不同的请自行修改。
就在这了:
4.部分代码:
# coding:utf-8
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 生成词云
def create_word_cloud(filename):
# 读取文件内容
text = open("{}.txt".format(filename), encoding='utf-8').read()
# 设置词云
wc = WordCloud(
# 设置背景颜色
background_color="white",
# 设置最大显示的词云数
max_words=2000,
# 这种字体都在电脑字体中,window在C:WindowsFonts下,mac我选的是/System/Library/Fonts/PingFang.ttc 字体
font_path='/System/Library/Fonts/PingFang.ttc',
height=1200,
width=2000,
# 设置字体最大值
max_font_size=100,
# 设置有多少种随机生成状态,即有多少种配色方案
random_state=30,
)
myword = wc.generate(text) # 生成词云
# 展示词云图
plt.imshow(myword)
plt.axis("off")
plt.show()
wc.to_file('qq_word.png') # 把词云保存下
if __name__ == '__main__':
create_word_cloud('qq_word')
至此,爬取qq说说内容,并生成词云图。
网友评论