笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。
我的公众号为:livandata
数据爬取的方式有很多种,scrapy非常方便,但是毕竟存在一些复杂度,因此需要有一个简单的工具,可以方便大家使用,因此笔者整理了phantomJS,供大家使用。
1、可以通过代码操作的浏览器,可以很好的解决js加载问题,但是运行速度比较慢,通常在爬虫时,一般两个方法同时使用(一般爬虫与phantomJS)。
使用步骤:
1、下载phantomJS,可以在官网上下载;
2、配置环境变量;
3、如果使用python,则需要安装selenium。
4、需要进入到路径的安装文件下面才能够使用包中的内容。
Phantom能很好的解决Js的问题,但是效率较低,可以结合使用。
#!/usr/bin/env python
# _*_ UTF-8 _*_
from selenium import webdriver
import re
from lxml import etree
# 使用以下语句建立一个无核浏览器。
# 他可以解决很多抓包的问题,但是效率较低。
bs = webdriver.PhantomJS()
# 如何使用pjs浏览网页:
url = "http://s.weibo.com/weibo/%25E4%25BD%259F%25E4%25B8%25BD%25E5%25A8%2585?topnav=1&wvr=6&b=1"
bs.get(url)
# # 直接将浏览器页面转换为图片
bs.get_screenshot_as_file("F:/python_workspace/file/phantomJS/test.png")
# 直接获取页面的源代码
data = bs.page_source
fh = open("F:/python_workspace/file/phantomJS/test.html", "wb")
fh.write(data.encode("utf-8"))
fh.close()
# pattitle="<title>(.*?)</title>"
# title = re.compile(pattitle).findall(data)
# print(title)
#
# # 如何在urllib或者phantomjs中使用xpath表达式
# # 需要将data转化成tree,再进行xpath提取即可。
# edata = etree.HTML(data)
# title2 = edata.xpath("/html/head/title/text()")
# print(title2)
# 如何提取微博的信息
# 首先打开微博,在console中定位到登录标签;
# 确定登录标签的xpath
# 提取微博发布者:
patnick = '<p class="person_card">(.*?)</p>'
p_info = re.compile(patnick).findall(data)
print(p_info)
# 如何去掉<em/>标签
patem = '<em class="red">(.*?)</em>'
cp1 = re.compile(patem).findall(data)
# 替换之后的结果:
dataem = re.sub(cp1, "", data)
# 提取微博内容:
patweibo = '<p class="link_info W_textb">(.*?)</p>'
# re.S模式修正符。
# 去掉img
patimg = '<img.*?>'
cp2 = re.compile(patimg)
weibo = re.compile(patweibo, re.S).findall(dataimg)
# weibo2 = re.compile(patweibo, re.S).findall(dataem)
print(weibo)
bs.quit()
# 需要了解:
1、如何使用phantomjs定位元素,以及进行点击,数据清除等操作;
2、如何使用phantomjs提交表单。
# 文本分类与情感分析:
1、加载文本;
2、将文本转为特征矩阵;
3、构建算法
4、分好训练数据和测试数据
5、对数据进行训练
6、对数据进行预测(测试)
2、利用爬取的数据进行文本分析:
#!/usr/bin/env python
# _*_ UTF-8 _*_
from selenium import webdriver
import re
# 文本分类与情感分析:
# 1、加载文本;
# 2、将文本转为特征矩阵;
# 3、构建算法
# 4、分好训练数据和测试数据
# 5、对数据进行训练
# 6、对数据进行预测(测试)
bs = webdriver.PhantomJS()
url =
"http://s.weibo.com/weibo/%25E4%25BD%259F%25E4%25B8%25BD%25E5%25A8%2585?topnav=1&wvr=6&b=1"
data = bs.page_source
patnick = '<p class="person_card">(.*?)</p>'
p_info = re.compile(patnick).findall(data)
print(p_info)
# 如何去掉<em/>标签
patem = '<em class="red">(.*?)</em>'
cp1 = re.compile(patem)
# 替换之后的结果:
dataem = re.sub(cp1, "", data)
# 提取微博内容:
patweibo = '<p class="link_infoW_textb">(.*?)</p>'
# re.S模式修正符。
# 去掉img
patimg = '<img.*?>'
cp2 = re.compile(patimg)
weibo = re.compile(patweibo, re.S).findall(dataimg)
num = len(weibo)
# 训练数据,产生正负标签
# 通过以下代码获得训练数据的向量。
# trainnum = int(num*0.5)
# tlabels = []
# for i in range(0, trainnum):
# print(weibo[i])
# thislabels = input("请输入微博情感类别:1正向,0负向, 2为中性")
# tlabels.append(thislabels)
# print(tlabels)
# 以上为训练数据。
# 切词:
import jieba
cutdata = []
for i in range(0, num):
thisdata = weibo[i]
thiscut = jieba.cut(thisdata)
thiscutdata = ""
for j in thiscut:
thiscutdata=thiscutdata+j+" "
cutdata.append(thiscutdata)
print(cutdata)
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
x = vectorizer.fit_transform(cutdata)
alltz = x.toarray()
print(alltz)
# 此时数据已经转为矩阵,获取训练数据矩阵:
# 此数据是由上面的训练值获得的。
trainlabels= [2,1,1,1,1,2,1,0,0,1,2,1,1,1,1,1]
traindata = alltz[0:trainnum,:]
print(traindata)
# 构建模型,传入数据进行测算(KNN|贝叶斯|人工神经网络)。
# 需要自己构建
# ???????
# 测试数据的获取:
testdata = alltz[trainnum:, :]
print(testdata)