案列:抓取基金网站JS形式的数据

自动探测网页编码:chardet

http://blog.csdn.net/github_26672553/article/details/78529734
可曾记得,在前面我们抓取基金网站网页的时候,最后要把抓取过来的内容进行gb2312解码才能够看懂。
这是因为该网页就是gb2312编码的,当然那时候我们是肉眼查看才得知的。

现在我们利用chardet包来自动帮我探测网页是什么编码。
https://github.com/chardet/chardet

1、安装

#不多说还是要cd到虚拟环境目录下执行
./python3 -m pip install chardet

python执行js的包:PyExecJS

访问我们的基金网页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

案列:抓取基金网站js形成的数据

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"])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值