http://blog.csdn.net/github_26672553/article/details/78529734
可曾记得,在前面我们抓取基金网站网页的时候,最后要把抓取过来的内容进行gb2312解码才能够看懂。
这是因为该网页就是gb2312编码的,当然那时候我们是肉眼查看才得知的。
现在我们利用chardet
包来自动帮我探测网页是什么编码。
https://github.com/chardet/chardet
1、安装
#不多说还是要cd到虚拟环境目录下执行
./python3 -m pip install chardet
访问我们的基金网页http://fund.eastmoney.com/fund.html ,如果查看第二页,我们发现第二页的数据是通过js加载而来。
基金网站下一页会加载的js地址:
http://fund.eastmoney.com/Data/Fund_JJJZ_Data.aspx?t=1&lx=1&letter=&gsid=&text=&sort=zdf,desc&page=2,200&dt=1510811414658&atfc=&onlySale=0
那么使用beautifullsoup
是解析不了的。
这个时候我们可以借助PyExecJS
这个包(这就是python的牛逼之处,各种包)
https://github.com/doloopwhile/PyExecJS
1、安装:
#注意还是要先cd进虚拟环境目录
cd 项目根目录/abc/bin
#执行
./python3 -m pip install pyexecjs
这其实是一个桥梁包
,它可以调用你本机的js运行环境。(我本机有node.js)
2、测试是否安装成功
import execjs
js_engine = execjs.get()
print(js_engine) # ExternalRuntime(JavaScriptCore)
3、尝试编译并执行一段js代码
import execjs
js_engine = execjs.get()
js_code = """
var str1 = 'hello '
let join = (s)=> str1 + s
"""
# 先要编译上面的js代码
compile = js_engine.compile(js_code)
# 调用js函数
res = compile.call("join","world")
print(res) # hello world
1、我们把分析获取网页html内容单独抽取了文件
# coding: utf-8
# 基金抓取
from urllib import request
import chardet
from bs4 import BeautifulSoup
# 基金网站地址
p1_url = "http://fund.eastmoney.com/fund.html";
p2_url = "http://fund.eastmoney.com/Data/Fund_JJJZ_Data.aspx?t=1&lx=1&letter=&gsid=&text=&sort=zdf,desc&page=2,200&dt=1510811414658&atfc=&onlySale=0";
# 封装一个方法
# 获取网页内容
def getHtml(url):
response = request.urlopen(url)
raw_html = response.read()
# 获取网页编码
encoding = chardet.detect(raw_html)["encoding"]
return raw_html.decode(encoding,"ignore")
# 分析网页数据
# 获取页码
def getPage(html):
soup = BeautifulSoup(html,"html.parser")
data = soup.find("div",id="pager").find("span","nv").get_text() # 共28页
return data
重点看里面的getHtml()
方法,该方法就是用来抓去网页内容的。
2、下面我们开始抓去js地址的内容
也就是抓去上面文件定义的p2_url
的数据。
# coding: utf-8
from Spider.Fund import getHtml,p1_url,getPage,p2_url
import execjs
# js引擎
js_engine = execjs.get()
# 获取基金网站第二页的内
html = getHtml(p2_url)
js_code = html + """
let getDB = ()=>db;
"""
# 先要编译上面的js代码
compile = js_engine.compile(js_code)
# 调用js函数
res = compile.call("getDB")
print(res["datas"])
看了这段代码,你可能要在js_code
这段疑惑:getDB函数的作用是啥啊?
我们看看p2_url
的内容应该就能猜出来了。
没错,最后我们利用PyExecJS
库的方法就成功获取到了其中的数据。
# 先要编译上面的js代码
compile = js_engine.compile(js_code)
# 调用js函数
res = compile.call("getDB")
res
就是一个字典数据。
print(type(res)) # <class 'dict'>
最后我们就可以轻松获取其中datas
项的数据了:
print(res["datas"])