web爬虫学习(五)——使用PhantomJS爬取数据

时间:2024-03-22 07:17:08

数据爬取的方式有很多种,scrapy非常方便,但是毕竟存在一些复杂度,因此需要有一个简单的工具,可以方便大家使用,因此笔者整理了phantomJS,供大家使用。

1、可以通过代码操作的浏览器,可以很好的解决js加载问题,但是运行速度比较慢,通常在爬虫时,一般两个方法同时使用(一般爬虫与phantomJS)。

使用步骤:

1、下载phantomJS,可以在官网上下载;

2、配置环境变量;

3、如果使用python,则需要安装selenium。

4、需要进入到路径的安装文件下面才能够使用包中的内容。

web爬虫学习(五)——使用PhantomJS爬取数据

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)