【实验目的】

  1. 熟悉从网上爬取数据到将数据进行可视化的全部流程,通过实例了解并掌握每个过程。
  2. 了解爬虫爬取数据的原理,并选择一种语言编程,将数据获取到数据库。
  3. 熟练使用 eclipse 中 Java 语言操作数据库数据。
  4. 了解 ECharts 中各种图的特性,选取合适的图将所获取到的数据进行可视化展示。

【实验原理】
爬虫爬取数据原理:
网络爬虫是捜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份。一个通用的网络爬虫的框架如图所示:

网络爬虫的基本工作流程如下:

  1. 首先选取一部分精心挑选的种子URL;
  2. 将这些URL放入待抓取URL队列;
  3. 从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。
  4. 分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。

本次实验只是简单的获取商城中书籍的价格以及名称,所以只需要写相应获取数据的代码就行,并没有循环抓取网页中相关链接以获取更多数据。

操作数据库原理:
新建servlet,通过JDBC连接数据库进行查询。

ECharts实现原理:
echarts页面的开发主要有两部步:

  • 设定一个存放图标的div;
  • 调用画图方法进行画图;
  • 初始化将要存放echarts图表的DOM对象(div);

    myChart = echarts.init(document.getElementById(‘main’));

  • 编写echarts图表需要的属性(option);

    var options = { …… };

  • 将属性注入图表

    myChart.setOption(options);

【实验环境】
Eclipse 4.5.1
操作系统 win7 64位
MySQL服务
Navicat for MySQL 可视化工具
Python 2.7.13 (Anaconda2 4.3.1 64-bit)
Python 2.7 MySQL-python-1.2.3
tomcat服务器
【实验内容】

  1. 启动MySQL服务,使用MySQL可视化工具创建数据库,名为python,新建表 ajax_table 和
    python_table,在两张表中包含主键id(设置为自增),书籍名称 bookName,书籍价格 bookPrice。
  2. 现从京东商城中使用python工具获取ajax书籍以及python书籍的书籍名称和书籍价格。
    使用eclipse完成数据库访问,获取数据库两张表中的数据。
  3. 将获取到的数据使用ECharts中南丁格尔图展示出来,效果如下:

    【实验步骤】

  4. 下载Python工具。
    (1)进入Anaconda2下载相应系统相应版本的Python工具。

    (2)进入Python 2.7 MySQL-python-1.2.3下载eclipse中python操作数据库的包

    (3)进入PyDev插件下载eclipse中的python插件

  5. 安装eclipse插件
    (1)把下载后的pydev压缩包内的plugins和features文件夹内的内容复制到eclipse的解压目录的相应文件夹中,重启eclipse。

    (2)打开eclipse中的菜单window,选择Preference.找到左侧边栏的pydev,展开,点击Interpreters->Python Interpreter
    (3)点击new,找到python安装路径, ok就行了

  6. 利用工具爬取数据
    (1)打开命令窗口(cmd),输入如下命令,会自动打开浏览器,点击右上角
    new->python2,会进入命令行模式,这里你可以测试代码,查看你爬取的数据是否是你想要的:

    jupyter notebook


    (2)输入以下代码,按ctrl+回车,你将看到相应数据,爬取成功

    #coding:utf8
    import urllib2
    from bs4 import BeautifulSoup
    root_url="http://search.jd.com/Search?keyword=Python&enc=utf-8&book=y&wq=Python&pvid=33xo9lni.p4a1qb"
    response = urllib2.urlopen(root_url)
    html_cont = response.read()
    soup = BeautifulSoup(html_cont,'html.parser', from_encoding='utf-8')
    res_data = {}
    links = soup.select('.gl-i-wrap')
    count = 1
    for link in links:if count <= 10:res_data['name']=link.select(".p-name a em")[0].textres_data['price']=float(link.select(".p-price strong i")[0].text)print res_data['name']count = count +1
    


    (3)新建一个PyDev工程,取名为 bookprice

    (4)创建包取名为 book_spider,右击包名 ->new->PyDev Module,取名python_book(ajax_book)。写一个主函数,将测试好的代码粘贴进去,并添加对python对数据库的操作,这样就将所爬取得数据写进了数据库中(我这里限制爬取个数为10条,并且这只是获取到了Python书籍的书籍,进行相同操作获取ajax数据)

    #coding:utf8
    import MySQLdb
    import urllib2
    from bs4 import BeautifulSoupif __name__=="__main__":
    root_url="http://search.jd.com/Search?keyword=Python&enc=utf-8&book=y&wq=Python&pvid=33xo9lni.p4a1qb"
    response = urllib2.urlopen(root_url)
    conn = MySQLdb.Connect(host='127.0.0.1', user='hive', passwd='123456', port=3306, charset='utf8', db='python')
    cursor = conn.cursor()
    html_cont = response.read()
    soup = BeautifulSoup(html_cont,'html.parser', from_encoding='utf-8')
    res_data = {}
    links = soup.select('.gl-i-wrap')
    count = 1
    for link in links:if count <= 10:res_data['name']=link.select(".p-name a em")[0].textres_data['price']=float(link.select(".p-price strong i")[0].text)try:sql = "insert into python_table(bookName,bookPrice) values('%s',%f)" % (res_data['name'],res_data['price'])cursor.execute(sql)conn.commit()except:print 'craw failed'count = count-1count=count+1
    cursor.close()
    conn.close()
    


4. 切换工作环境,改为javaEE
新建动态WEB项目,取名为 book ,在 Java Resources->src 中创建四个包(cn.lk.Dao , cn.lk.DBUtil , cn.lk.Servlet , cn.lk.VO), 在 WebContent 中创建一个名为 book.jsp 的文件,分别实现各个模块代码的实现

(1)在 cn.lk.VO 中创建实体类,命名为 Book.java 。打开 Book.java 页面,编写实体类代码(属性名及数据类型与建表时一致)

```
package cn.lk.VO;public class Book {private String bookName;private float bookPrice;public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public float getBookPrice() {return bookPrice;}public void setBookPrice(float bookPrice) {this.bookPrice = bookPrice;}@Overridepublic String toString() {return "book [bookName=" + bookName + ", bookPrice=" + bookPrice + "]";}public Book(String bookName, float bookPrice) {super();this.bookName = bookName;this.bookPrice = bookPrice;}public Book(){}
}```

(2)在cn.lk.DBUtil中创建类DBUtil.java,编写代码(实现与数据库的连接)

```
package cn.lk.DBUtil;import java.sql.DriverManager;
import java.sql.SQLException;import com.mysql.jdbc.Connection;public class DBUtil {private static final String DBDriver="org.gjt.mm.mysql.Driver";private static final String DBURl="jdbc:mysql://localhost:3306/python";private static final String DBUser="hive";private static final String DBPassword="123456";private static Connection conn=null;static{try {Class.forName(DBDriver);conn=(Connection) DriverManager.getConnection(DBURl,DBUser,DBPassword);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void labManageDButil(){}public static Connection getConnection(){return conn;}public void close(){if(conn!=null){try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}```

(3)在cn.lk.Dao包中创建类BookDao.java ,编写代码(实现对数据库的查询操作)

```
package cn.lk.Dao;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;import cn.lk.DBUtil.DBUtil;
import cn.lk.VO.Book;public class BookDao {public List<Book> getPythonData(){Connection conn = DBUtil.getConnection();String sql = "select bookName,bookPrice from python_table;";ResultSet set = null;Statement stmt = null;List<Book> list = new ArrayList<Book>();try {stmt = (Statement) conn.createStatement();set = stmt.executeQuery(sql);while (set.next()) {Book bean = new Book();bean.setBookName(set.getString("bookName"));bean.setBookPrice(set.getFloat("bookPrice"));list.add(bean);}} catch (SQLException e) {System.err.println(e.getMessage());}return list;}public List<Book> getAjaxData(){Connection conn = DBUtil.getConnection();String sql = "select bookName,bookPrice from ajax_table;";ResultSet set = null;Statement stmt = null;List<Book> list = new ArrayList<Book>();try {stmt = (Statement) conn.createStatement();set = stmt.executeQuery(sql);while (set.next()) {Book bean = new Book();bean.setBookName(set.getString("bookName"));bean.setBookPrice(set.getFloat("bookPrice"));list.add(bean);}} catch (SQLException e) {System.err.println(e.getMessage());}return list;}}
```

(4)在cn.lk.Servlet包中创建类BookServlet.java ,实现代码(调用方法将Dao层获取到的数据传到 jps 界面 )

```
package cn.lk.Servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.alibaba.fastjson.JSON;import cn.lk.Dao.BookDao;
import cn.lk.VO.Book;/*** Servlet implementation class PieServlet*/
public class BookServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public BookServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.setContentType("text/html;charset=utf-8");BookDao pd = new BookDao();List<Book> python = pd.getPythonData();List<Book> ajax = pd.getAjaxData();String jsonString = JSON.toJSONString(python);String jsonString_Java = "#"+JSON.toJSONString(ajax);System.err.println(jsonString);//System.err.println(jsonString_Java);PrintWriter out = response.getWriter();out.print(jsonString);out.print(jsonString_Java);System.out.println(python.toString());System.out.println(ajax.toString());out.flush();out.close();}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}```

(5)打开WebContent->WEB-INF 中的web.xml,配置相关映射,代码如下:

```
<?xml version="1.0" encoding="UTF‐8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display‐name></display‐name>
<servlet>
<servlet-name>BookServlet</servlet-name>
<servlet-class>cn.lk.Servlet.BookServlet</servlet-class></servlet><servlet-mapping><servlet-name>BookServlet</servlet-name><url-pattern>/BookServlet</url-pattern></servlet-mapping>
</web‐app>
```

(6)导入相应JAR包与JS包
在lib目录中复制进去相应JAR包,在WebContent中创建目录echarts,将所需js包放入即可

(7)在jps界面编写代码(获取传过来的数据,并使用ECharts技术,实现南丁格尔图可视化)

```
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title></title><script type="text/javascript" src="echarts/jquery-2.1.4.min.js"></script><script type="text/javascript" src="echarts/echarts.min.js"></script></head><body><div id="main" style="width: 100%;height:100%; "></div></body><script type="text/javascript">// 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('main'));// 指定图表的配置项和数据myChart.setOption({title : {text: '书籍价格',subtext: '来自京东',x:'center'},tooltip : {trigger: 'item',formatter: '{a} <br/>{b} : {c} ({d}%)'},legend: {orient: 'vertical',left: 'right',data: []//不修改,从数据库调取},series : [{name:'python',type: 'pie',radius : [30,110],center: ['25%', '30%'],data:[],//不修改,从数据库调取roseType : 'radius',itemStyle: {emphasis: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}},{name:'ajax',type: 'pie',radius : [30,110],center: ['25%', '80%'],data:[],//不修改,从数据库调取roseType : 'radius',itemStyle: {emphasis: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]});// 异步加载数据var python_price = [];var python_name = [];var ajax_price = [];var ajax_name = [];var python = [];var ajax = [];$.post("./BookServlet", function(datas){//alert(datas)var arr = datas.split("#");/*for(var i=0;i<arr.length;i++){alert(arr[i])} */var pythons = JSON.parse(arr[0]);var ajaxs = JSON.parse(arr[1]);for(var m=0;m<pythons.length;m++){python_name.push(pythons[m].bookName);python.push({"name":pythons[m].bookName,"value":pythons[m].bookPrice});python_price.push(pythons[m].bookPrice);}for(var n=0;n<ajaxs.length;n++){ajax_name.push(ajaxs[n].bookName);ajax.push({"name":ajaxs[n].bookName,"value":ajaxs[n].bookPrice});ajax_price.push(ajaxs[n].bookPrice);}for(var i=0;i<ajax_name.length;i++){python_name.push(ajax_name[i])}// 填入数据myChart.setOption({legend: {//类别data: python_name},series: [{// 根据名字对应到相应的系列data: python},{data: ajax}]});// 使用刚指定的配置项和数据显示图表。});</script>
</html>
```

(8)tomcat服务器上运行book.jsp文件,将链接复制到浏览器中,查看效果图

利用Eclipse-Python简单爬取京东商城书籍信息进行可视化相关推荐

  1. 爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息

    提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用.但是 seleniu ...

  2. 爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息!

    提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用.但是 seleniu ...

  3. 利用python爬虫爬取京东商城商品图片

    笔者曾经用python第三方库requests来爬取京东商城的商品页内容,经过解析之后发现只爬到了商品页一半的图片.(这篇文章我们以爬取智能手机图片为例) 当鼠标没有向下滑时,此时查看源代码的话,就会 ...

  4. Scrapy练习——爬取京东商城商品信息

    刚刚接触爬虫,花了一段时间研究了一下如何使用scrapy,写了一个比较简单的小程序,主要用于爬取京东商城有关进口牛奶页面的商品信息,包括商品的名称,价格,店铺名称,链接,以及评价的一些信息等.简单记录 ...

  5. python+正则表达式爬取京东商品数据信息

    爬取数据的方式有很多种,正则表达式,scrapy,从接口中爬取动态网页的数据-今天我们讲的是用正则表达式来爬取京东一个大米商品的具体信息. 正则表达式的优点:可以精准的爬取我们想要的数据信息 缺点:爬 ...

  6. python爬取京东手机参数_python爬虫——分页爬取京东商城商品信息(手机为例)...

    1.最近刚开始学习python   写了个爬虫练习,感觉主要是得会用F12查询网站结构代码.还涉及到反爬虫,每个网站都不一样,拿到的解析出的json数据格式也不同.得有些Web知识的基础才行. htt ...

  7. Python|简单爬取豆瓣网电影信息

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 欢迎加入团队圈子!与作者面对面!直接点击! 前言: 在掌握一些 ...

  8. Python爬虫 --爬取京东酒店旅行信息

    在之前学习爬虫的过程中,发现这个网址拿来练习是非常的舒服.现在将这个爬取的过程写下来分享给大家. 网址:https://hotel.jd.com/list.html?cityId=36&cit ...

  9. python简单爬取淘宝商品信息

    爬取淘热卖商品"泡面"的信息,包括商品名称,店铺,链接,付款人数,价格等,用csv保存 import requests import csv import time import ...

最新文章

  1. 页面A使用window.open打开页面B,然后取得B的返回值
  2. 号称能自动编程60年,“进化计算”究竟进化到哪一步了?
  3. python中的np where_numpy中的np.where
  4. Oracle-AWR性能报告解读
  5. 2K17能力值上90的11位球员,你怎么看?
  6. getprocaddress得到为0_拼接图像得到全景图
  7. 我是技术总监,你干嘛总问我技术细节?
  8. UVA 11090 Going in Cycle!! 二分答案 + bellman-ford
  9. 为什么防火墙透传不过去VLAN11?
  10. web元件库/常用web组件/常用表单/导航栏/边框/图标/日期时间选择器/评分组件/穿梭框/输入框/步骤条/计数器/输入框/Axure原型/axure元件库/rp原型/交互控件/五星评分器/导航框架
  11. 销毁Spring Bean的三种方法
  12. JavaScript——语法
  13. 如何用一句话证明你搞 IT(挨踢)的?
  14. 第一节:setTimeout和setInterval定时器
  15. kali-网站克隆工具-httrack
  16. 说说PHP中的命名空间相关概念
  17. 一、OpenTCS4.12 创建一个新的通信驱动
  18. 传奇 SF 开服架设流程详细介绍:
  19. mysql lob 操作_Oracle中LOB 处理
  20. SketchUp模型组件【iMod · 精选242 —— 现代客厅SU模型】

热门文章

  1. Java中哈希值是怎么算的
  2. Linux 开机提示kernel panic...解决方法
  3. 【数据分享】我国地级市绿地利用现状数据(9个指标\Shp格式)
  4. FileProvider Android7.0 (文件共享,使用系统播放器打开视频等等)
  5. 学习银行业务----存款
  6. java 判断字符 不等于 或者_java中字符串不等于怎么判断
  7. 微信小程序w-picker组件关于颗粒度“时“即hour时“日“初始化不显示问题处理
  8. QQ开放平台QQ登录PHP代码
  9. Java 操作Word书签(一):添加、删除、读取书签
  10. 超过100项改进 100tv聚好看全新发布