编写py爬虫读入sqlserver数据库,myeclipse+tomcat在网页中显示

软件工程实训:编写py爬虫并读入sqlserver数据库,再用myeclipse+tomcat在网页中显示

1.对于网站或定义网页中的数据,将数据通过I/O流保存到数据库中, python—>sqlserver

2.基于B/S架构将数据库存入的信息以列表形式在浏览器中显示。

一.爬虫编写

首先我们需要装几个必须的库:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import pymssql

核心的爬取代码其实不难,装各种库却卡了我一天,一开始用Pycharm自带的安装库的配件,File–Settings–Project:Pycharm–Project Interpreter
这时候会显示已经装好的库:
Project
点击右上角+号

在这里插入图片描述
即可便捷的搜索需要的库,然而由于众所周知的原因,这样从国外连接直接下是非常非常慢的,所以需要先换成国内源。
常见国内源:

清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

方法一:在命令行安装时候(以pymssql为例)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymssql

方法二:在pycharm中添加
还是上面那个界面:
在这里插入图片描述
点击Manage Repositories

在这里插入图片描述

点击加号即可添加源,有时候需要的库有的源不一定能下,需要多换几个试试啦。
过程中可能还会碰到一些琐碎的问题,请自行百度或者CSDN。

不会吧不会吧,都0202年了,害搁这网上冲浪呐

二:sqlserver数据库配置

我的数据库为:
在这里插入图片描述
正好上学期学了这个,就拿来直接用了,也没下mysql(懒狗)
首先是配置:
打开sqlserver管理控制台

在这里插入图片描述
开启TCP/IP

在这里插入图片描述
在这里插入图片描述
注意一下IP地址及其端口号:

在这里插入图片描述
PS:重点来了,好吧,其实是我自己太蠢,更改配置时,一定要停止sqlserver服务,只是关了软件是不够的,如果不会关,那就直接保存文件后重启电脑

在这里插入图片描述
说起来可能不行,就这个注意点,耗费了我一个下午,一直耗到我电脑没电,去机房找个插头插上,嗯,好了,好了!?

在这里插入图片描述
我感觉我当场就要被抬走了。

然后是py连接数据库代码

#连接数据库的函数
def conn():
    connect = pymssql.connect('localhost','sa','a2313724122','123') #服务器名,账户,密码,数据库名
    if connect:
        print("连接成功!")
    return connect
# 连接数据库
    connect = conn()
    cursor = connect.cursor()  # 创建一个游标对象,python里的sql语句都要通过cursor来执行
    #在数据库中创建一个表用来存储爬取的信息
    cursor.execute("create table Paper(题目 varchar(200),链接 varchar(400),作者姓名 varchar(50),年份 varchar(10))")

    for content in alls:
        sqls = "insert into Paper (题目,链接,作者姓名,年份)values('"+content[0]+"','"+content[1]+"','"+content[2]+"','"+content[3]+"')"
        #print(sqls)
        cursor.execute(sqls)  # 执行sql语句
    connect.commit()  # 提交
    cursor.close()  # 关闭游标
    connect.close()  # 关闭连接

代码原理没什么好讲的,网上介绍太多了,直接上代码。
我的爬取目标为百度文库,获取其文章标题,链接,作者姓名,年份。
简单爬一点,主要是熟悉练手,所以数据量很小。

# 库
import requests
from bs4 import BeautifulSoup
import pandas as pd
import pymssql
#获取链接
def GetHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding

        return (r.text)
    except:
        print("爬取失败!")
def parsePage(ilt, html, urls):
    try:
        soup = BeautifulSoup(html, "html.parser")
        html1 = soup.find_all("a", {"data-click": "{'button_tp':'title'}"})
        for li in html1:
            url = li.get("href")
            urls.append("http:" + url)
            name = li.text
            ilt.append(name)
    except:
        print("文章题目提取失败!")
#获取作者
def getAuthor(anames, html,publishlist):
    try:
        soup = BeautifulSoup(html, "html.parser")
        html = soup.find_all("a", {"data-click": "{'button_tp':'author'}"})
        names = []
        for au in html:
            name = au.text
            names.append(name)
        anames.append(names)
        html1=soup.find_all("p",{"data-click":"{'button_tp':'year'}"})

        if html1==[]:
            publishlist.append("未知")
        else:
            for ye in html1:
                year=ye.text
                year=year.replace('\n','')
                year=year.replace(' ','')
                publishlist.append(year)

    except:
        print("获取论文作者姓名或者发表年份错误!")



#连接数据库的函数
def conn():
    connect = pymssql.connect('localhost','sa','a2313724122','123') #服务器名,账户,密码,数据库名
    if connect:
        print("连接成功!")
    return connect

def main():

    infoList = []
    urlList = []
    anames = []
    publishlist=[]

    #设置爬取的页数
    depth=2
    for page in range(0,depth):
        start_url01 = "http://xueshu.baidu.com/s?wd=%E5%8D%B7%E7%A7%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C&pn="
        start_url02="&tn=SE_baiduxueshu_c1gjeupa&ie=utf-8&f=3&sc_f_para=sc_tasktype%3D%7BfirstSimpleSearch%7D&sc_hit=1&rsv_page=1"
        strs=str(page*10)
        print("正在爬取第{}页...".format(page+1))

        start_url=start_url01+strs+start_url02
        html = GetHTMLText(start_url)
        parsePage(infoList, html, urlList)

    for i in urlList:
        html0 = GetHTMLText(i)
        getAuthor(anames, html0,publishlist)
    #print(publishlist)
    print("数据爬取完成!")

    #print(infoList)  # 打印论文题目信息
    #print((urlList))  # 打印每篇论文的url连接
    #print(anames)
    anames1=[]
    for num in range(0,len(anames)):
        anames1.append(" ".join(anames[num]))

    #下面是将爬取的数据存储到指定的表格文件中
    alls=[]
    for ss in range(0,len(infoList)):
        all=[infoList[ss]]+[urlList[ss]]+[anames1[ss]]+[publishlist[ss]]
        alls.append(all)
    df=pd.DataFrame(alls)
    df.to_excel('C:/Users/Y7000/Desktop/Pycharm/pinglun.xlsx')

    #打印对应信息
    print(alls)

    # 连接数据库
    connect = conn()
    cursor = connect.cursor()  # 创建一个游标对象,python里的sql语句都要通过cursor来执行
    #在数据库中创建一个表用来存储爬取的信息
    cursor.execute("create table Paper(题目 varchar(200),链接 varchar(400),作者姓名 varchar(50),年份 varchar(10))")

    for content in alls:
        sqls = "insert into Paper (题目,链接,作者姓名,年份)values('"+content[0]+"','"+content[1]+"','"+content[2]+"','"+content[3]+"')"
        #print(sqls)
        cursor.execute(sqls)  # 执行sql语句
    connect.commit()  # 提交
    cursor.close()  # 关闭游标
    connect.close()  # 关闭连接

main()

三. Myeclipse配置tomcat及连接sqlserver数据库

首先吹一句:Myeclipse永远滴神

Myeclipse2017 CI自带tomcat8.5,不需要重新下载安装
Windows–Preference–Servers–Runtime Environment

在这里插入图片描述
之后就能在界面中看到了
下载连接Sql server的jar包,微软官网就有,自行百度下载。
下载后把它安装到Myeclipse中
右键包,选择最下面的Properties,点击Java Build Path–lib–Add External JARs,然后找到刚刚下的jar文件,导入,Apply。

在这里插入图片描述

基本配置到这里就结束了,先留个白,后期再补细节

四.Myeclipes的代码编写

1.在src中新建一个包:如firstweb
建立俩java文件:JDBCDemo.java&M.java

package firstweb;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class JDBCDemo extends HttpServlet {
	 private static final long serialVersionUID = 1L;

	    /**
	     * @see HttpServlet#HttpServlet()
	     */
	    public JDBCDemo() {
	       // 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 stub
	        this.doPost(request, response);
	    }
 
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
			String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=123";
			Connection conn=DriverManager.getConnection(url, "sa", "a2313724122");
			Statement stmt = conn.createStatement();
			String sql = "select * from Paper";
			// 执行查询
			ResultSet rs = stmt.executeQuery(sql);
			List<M> list = new ArrayList<M>();
			while (rs.next()) {
				// 实例化t对象
				M m = new M();
				m.setname(rs.getString(1));
				m.setlink(rs.getString(2));
				m.setauthor(rs.getString(3));
				m.settime(rs.getString(4));
				//System.out.print(t.getlink());
				list.add(m);
			}
			
			request.setAttribute("list", list);
			request.getRequestDispatcher("/firstweb/index.jsp").forward(request, response);
			rs.close(); // 关闭ResultSet
			stmt.close(); // 关闭Statement
			conn.close(); // 关闭Connection
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
 
	
}
package firstweb;

public class M {
	String Pname;
	String Plink;
	String Pauthor;
	String Ptime;
	
	public void setname(String Pname){
		this.Pname=Pname;
	}
	public void setlink(String Plink){
		this.Plink=Plink;
	}
	public void setauthor(String Pauthor){
		this.Pauthor=Pauthor;
	}
	public void settime(String Ptime){
		this.Ptime=Ptime;
	}
	
	public String getname(){
		return Pname;
	}
	public String getlink(){
		return Plink;
	}
	public String getauthor(){
		return Pauthor;
	}
	public String gettime(){
		return Ptime;
	}
}

在WebRoot中新建index.jsp文件

<%@page import="firstweb.M"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@page import="java.util.List"%>

 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<from action="<%= request.getContextPath() %>/MyServlet"method="get">
	<table align="center" width="450" border="10">
		<tr>
			<td align="center" colspan="5">
				<h1>卷积神经网络相关论文信息</h1>
			</td>
		</tr>
		<tr align="center">
			<td><b>序号</b></td>
			<td><b>论文题目</b></td>
			<td><b>作者</b></td>
			<td><b>发布时间</b></td>
		</tr>
		<%
			// 获取图书信息集合
			//String n=(String)request.getAttribute("ll");
			List<M> list=(List<M>)request.getAttribute("list");
			if(list==null || list.size()<1){
				out.print("没有 数据!");
				//out.print(n);
			}
			else{
				int i=1;
				for(M m:list){
					%>
					<tr align="center">
						<td><%=i %></td>
						<td><a href="<%=m.getlink() %>>"><%=m.getname() %></a></td>
						<td><%=m.getauthor() %></td>
						<td><%=m.gettime() %></td>

					</tr>
					<%
					i++;
				}
				
			}
		%>
	</table>
	</from>
</body>
</html>

在WEB-INF–lib中新建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" xmlns="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_2_5.xsd" id="WebApp_ID" version="2.5">
  <servlet>
    <servlet-name>JDBCDemo</servlet-name>
    <servlet-class>firstweb.JDBCDemo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>JDBCDemo</servlet-name>
    <url-pattern>/JDBCDemo</url-pattern>
  </servlet-mapping>
</web-app>

最后运行即可。

五.总结

咋说呢,这其实是个非专业不科学配置介绍文档,要是上课好好听,估计也不会发现这么多注意点,真的是一步一个坑的爬过来,感谢那些让我白嫖的博主与百度小编,你们才是永远的神!
代码原理部分还没有细讲,毕竟我也就刚入门,有时候其实也在思考,像培训机构那样的自上而下与学校的自下而上教学到底有何异同(:思考的跟个你上课认真听讲了一样),不过不管是哪种,还是需要去理解并实现的,这两者其实应该是并列关系,就像太极图一样相辅相成,因此,

只要一直前行,道路就会不断延伸,所以,不要停下来啊!
											--奥尔加夫斯基
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值