软件工程实训:编写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
这时候会显示已经装好的库:
点击右上角+号
即可便捷的搜索需要的库,然而由于众所周知的原因,这样从国外连接直接下是非常非常慢的,所以需要先换成国内源。
常见国内源:
清华: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>
最后运行即可。
五.总结
咋说呢,这其实是个非专业不科学配置介绍文档,要是上课好好听,估计也不会发现这么多注意点,真的是一步一个坑的爬过来,感谢那些让我白嫖的博主与百度小编,你们才是永远的神!
代码原理部分还没有细讲,毕竟我也就刚入门,有时候其实也在思考,像培训机构那样的自上而下与学校的自下而上教学到底有何异同(:思考的跟个你上课认真听讲了一样),不过不管是哪种,还是需要去理解并实现的,这两者其实应该是并列关系,就像太极图一样相辅相成,因此,
只要一直前行,道路就会不断延伸,所以,不要停下来啊!
--奥尔加夫斯基