Python爬虫入门项目

Python是什么

Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。

创始人Guido van Rossum是BBC出品英剧Monty Python’s Flying Circus(中文:蒙提·派森的飞行马戏团)的狂热粉丝,因而将自己创造的这门编程语言命名为Python。

人生苦短,我用python,翻译自"Life is short, you need Python"

Python英式发音:/ˈpaɪθən/ ,中文类似‘拍森’。而美式发音:/ˈpaɪθɑːn/,中文类似‘拍赏’。我看麻省理工授课教授读的是‘拍赏’,我觉得国内大多是读‘拍森’吧。

2017年python排第一也无可争议,比较AI第一语言,在当下人工智能大数据大火的情况下,python无愧第一语言的称号,至于C、C++、java都是万年的老大哥了,在代码量比较方面,小编相信java肯定是完爆其它语言的。

不过从这一年的编程语言流行趋势看,java依然是传播最多的,比较无论app、web、云计算都离不开,而其相对python而言,学习路径更困难一点,想要转行编程,而且追赶潮流,python已然是最佳语言。

许多大型网站就是用Python开发的,国内:豆瓣、搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝、热酷、土豆、新浪、果壳…; 国外:谷歌、NASA、YouTube、Facebook、工业光魔、红帽…

Python将被纳入高考内容

浙江省信息技术课程改革方案已经出台,Python确定进入浙江省信息技术高考,从2018年起浙江省信息技术教材编程语言将会从vb更换为Python。其实不止浙江,教育大省北京和山东也确定要把Python编程基础纳入信息技术课程和高考的内容体系,Python语言课程化也将成为孩子学习的一种趋势。尤其山东省最新出版的小学信息技术六年级教材也加入了Python内容,小学生都开始接触Python语言了!!

再不学习,又要被小学生完爆了。。。

 

Python入门教程

  • Python教程 - 廖雪峰的官方网站
  • Python官网
  • Python 100例 | 菜鸟教程
  • Python中文社区
  • 微信公众号:Python中文社区
  • 微信跳一跳的python外挂项目:https://github.com/wangshub/wechat_jump_game
  • 对于有语言基础的童鞋来说,学习python是很easy的事,而且很funny
  • 500G 百度云Python入门资料免费送,公众号回复:python入门

Python能做什么

  • 网络爬虫
  • Web应用开发
  • 系统网络运维
  • 科学与数字计算
  • 图形界面开发
  • 网络编程
  • 自然语言处理(NLP)
  • 人工智能
  • 区块链
  • 多不胜举。。。

Python入门爬虫

这是我的第一个python项目,在这里与大家分享出来~

  • 需求
    • 我们目前正在开发一款产品其功能大致是:用户收到短信如:购买了电影票或者火车票机票之类的事件。然后app读取短信,解析短信,获取时间地点,然后后台自动建立一个备忘录,在事件开始前1小时提醒用户。
  • 设计
    • 开始我们将解析的功能放在了服务端,但是后来考虑到用户隐私问题。后来将解析功能放到了app端,服务端只负责收集数据,然后将新数据发送给app端。
    • 关于服务端主要是分离出两个功能,一、响应app端请求返回数据。二、爬取数据,存入数据库。
    • 响应请求返回数据使用java来做,而爬取数据存入数据库使用python来做,这样分别使用不同语言来做是因为这两种语言各有优势,java效率比python高些,适合做web端,而爬取数据并不是太追求性能且python语言和大量的库适合做爬虫。
  • 代码
    • 本项目使用python3的版本
    • 源码可在我的码云上下载:https://gitee.com/Mrcmc/py-scratch
    • 了解这个项目你只需要有简单的python基础,能了解python语法就可以。其实我自己也是python没学完,然后就开始写,遇到问题就百度,边做边学这样才不至于很枯燥,因为python可以做一些很有意思的事情,比如模拟连续登录挣积分,比如我最近在写一个预定模范出行车子的python脚本。推荐看廖雪峰的python入门教程
    • 首先带大家看看我的目录结构,开始我打算是定义一个非常好非常全的规范,后来才发现由于自己不熟悉框架,而是刚入门级别,所以就放弃了。从简而入:
    • 下面咱们按照上图中的顺序,从上往下一个一个文件的讲解init.py包的标识文件,python包就是文件夹,当改文件夹下有一个init.py文件后它就成为一个package,我在这个包中引入一些py供其他py调用。

init.py

# -*- coding: UTF-8 -*-  # import need manager module  
import MongoUtil  
import FileUtil  
import conf_dev  
import conf_test  
import scratch_airport_name  
import scratch_flight_number  
import scratch_movie_name  
import scratch_train_number  
import scratch_train_station  
import MainUtil

下面两个是配置文件,第一个是开发环境的(windows),第二个是测试环境的(linux),然后再根据不同系统启用不同的配置文件

conf_dev.py

# -*- coding: UTF-8 -*-  
# the configuration file of develop environment  # path configure  
data_root_path = 'E:/APK98_GNBJ_SMARTSERVER/Proj-gionee-data/smart/data'  # mongodb configure  
user = "cmc"  
pwd = "123456"  
server = "localhost"  
port = "27017"  
db_name = "smartdb"

conf_test.py

# -*- coding: UTF-8 -*-  
# the configuration file of test environment  #path configure  
data_root_path = '/data/app/smart/data'  #mongodb configure  
user = "smart"  
pwd = "123456"  
server = "10.8.0.30"  
port = "27017"  
db_name = "smartdb"

下面文件是一个util文件,主要是读取原文件的内容,还有将新内容写入原文件。

FileUtil.py

# -*- coding: UTF-8 -*-  
import conf_dev  
import conf_test  
import platform  # configure Multi-confronment  
# 判断当前系统,并引入相对的配置文件
platform_os = platform.system()  
config = conf_dev  
if (platform_os == 'Linux'):  config = conf_test  
# path  
data_root_path = config.data_root_path  # load old data  
def read(resources_file_path, encode='utf-8'):  file_path = data_root_path + resources_file_path  outputs = []  for line in open(file_path, encoding=encode):  if not line.startswith("//"):  outputs.append(line.strip('\n').split(',')[-1])  return outputs  # append new data to file from scratch  
def append(resources_file_path, data, encode='utf-8'):  file_path = data_root_path + resources_file_path  with open(file_path, 'a', encoding=encode) as f:  f.write(data)  f.close

下面这个main方法控制着执行流程,其他的执行方法调用这个main方法

MainUtil.py

# -*- coding: UTF-8 -*-  import sys  
from datetime import datetime  
import MongoUtil  
import FileUtil  # @param resources_file_path 资源文件的path  
# @param base_url 爬取的连接  
# @param scratch_func 爬取的方法  
def main(resources_file_path, base_url, scratch_func):  old_data = FileUtil.read(resources_file_path)   #读取原资源  new_data = scratch_func(base_url, old_data)     #爬取新资源  if new_data:        #如果新数据不为空  date_new_data = "//" + datetime.now().strftime('%Y-%m-%d') + "\n" + "\n".join(new_data) + "\n"      #在新数据前面加上当前日期  FileUtil.append(resources_file_path, date_new_data)     #将新数据追加到文件中  MongoUtil.insert(resources_file_path, date_new_data)    #将新数据插入到mongodb数据库中  else:   #如果新数据为空,则打印日志  print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), '----', getattr(scratch_func, '__name__'), ": nothing to update ")

将更新的内容插入mongodb中

MongoUtil.py

# -*- coding: UTF-8 -*-  import platform  
from pymongo import MongoClient  
from datetime import datetime, timedelta, timezone  
import conf_dev  
import conf_test  # configure Multi-confronment  
platform_os = platform.system()  
config = conf_dev  
if (platform_os == 'Linux'):  config = conf_test  
# mongodb  
uri = 'mongodb://' + config.user + ':' + config.pwd + '@' + config.server + ':' + config.port + '/' + config.db_name  # 将数据写入mongodb  
# @author chenmc  
# @param uri connect to mongodb  
# @path save mongodb field  
# @data save mongodb field  
# @operation save mongodb field default value 'append'  
# @date 2017/12/07 16:30  
# 先在mongodb中插入一条自增数据 db.sequence.insert({ "_id" : "version","seq" : 1})  def insert(path, data, operation='append'):  client = MongoClient(uri)  resources = client.smartdb.resources  sequence = client.smartdb.sequence  seq = sequence.find_one({"_id": "version"})["seq"]      #获取自增id  sequence.update_one({"_id": "version"}, {"$inc": {"seq": 1}})       #自增id+1  post_data = {"_class": "com.gionee.smart.domain.entity.Resources", "version": seq, "path": path,  "content": data, "status": "enable", "operation": operation,  "createtime": datetime.now(timezone(timedelta(hours=8)))}  resources.insert(post_data)     #插入数据

项目引入的第三方库,可使用pip install -r requirements.txt下载第三方库

requirements.txt

# need to install module# need to install module  
bs4  
pymongo  
requests  
json

下面真正的执行方法来了,这五个py分别表示爬取五种信息:机场名、航班号、电影名、列车号、列车站。他们的结构都差不多,如下:

第一部分:定义查找的url;
第二部分:获取并与旧数据比较,返回新数据;
第三部分:main方法,执行写入新数据到文件和mongodb中;

scratch_airport_name.py:爬取全国机场

# -*- coding: UTF-8 -*-  
import requests  
import bs4  
import json  
import MainUtil  resources_file_path = '/resources/airplane/airportNameList.ini'  
scratch_url_old = 'https://data.variflight.com/profiles/profilesapi/search'  
scratch_url = 'https://data.variflight.com/analytics/codeapi/initialList'  
get_city_url = 'https://data.variflight.com/profiles/Airports/%s'  #传入查找网页的url和旧数据,然后本方法会比对原数据中是否有新的条目,如果有则不加入,如果没有则重新加入,最后返回新数据
def scratch_airport_name(scratch_url, old_airports):  new_airports = []  data = requests.get(scratch_url).text  all_airport_json = json.loads(data)['data']  for airport_by_word in all_airport_json.values():  for airport in airport_by_word:  if airport['fn'] not in old_airports:  get_city_uri = get_city_url % airport['id']  data2 = requests.get(get_city_uri).text  soup = bs4.BeautifulSoup(data2, "html.parser")  city = soup.find('span', text="城市").next_sibling.text  new_airports.append(city + ',' + airport['fn'])  return new_airports  #main方法,执行这个py,默认调用main方法,相当于java的main
if __name__ == '__main__':  MainUtil.main(resources_file_path, scratch_url, scratch_airport_name)

scratch_flight_number.py:爬取全国航班号

#!/usr/bin/python  
# -*- coding: UTF-8 -*-  import requests  
import bs4  
import MainUtil  resources_file_path = '/resources/airplane/flightNameList.ini'  
scratch_url = 'http://www.variflight.com/sitemap.html?AE71649A58c77='  def scratch_flight_number(scratch_url, old_flights):  new_flights = []  data = requests.get(scratch_url).text  soup = bs4.BeautifulSoup(data, "html.parser")  a_flights = soup.find('div', class_='list').find_all('a', recursive=False)  for flight in a_flights:  if flight.text not in old_flights and flight.text != '国内航段列表':  new_flights.append(flight.text)  return new_flights  if __name__ == '__main__':  MainUtil.main(resources_file_path, scratch_url, scratch_flight_number)

scratch_movie_name.py:爬取最近上映的电影

#!/usr/bin/python  
# -*- coding: UTF-8 -*-  
import re  
import requests  
import bs4  
import json  
import MainUtil  # 相对路径,也是需要将此路径存入数据库  
resources_file_path = '/resources/movie/cinemaNameList.ini'  
scratch_url = 'http://theater.mtime.com/China_Beijing/'  # scratch data with define url  
def scratch_latest_movies(scratch_url, old_movies):  data = requests.get(scratch_url).text  soup = bs4.BeautifulSoup(data, "html.parser")  new_movies = []  new_movies_json = json.loads(  soup.find('script', text=re.compile("var hotplaySvList")).text.split("=")[1].replace(";", ""))  coming_movies_data = soup.find_all('li', class_='i_wantmovie')  # 上映的电影  for movie in new_movies_json:  move_name = movie['Title']  if move_name not in old_movies:  new_movies.append(movie['Title'])  # 即将上映的电影  for coming_movie in coming_movies_data:  coming_movie_name = coming_movie.h3.a.text  if coming_movie_name not in old_movies and coming_movie_name not in new_movies:  new_movies.append(coming_movie_name)  return new_movies  if __name__ == '__main__':  MainUtil.main(resources_file_path, scratch_url, scratch_latest_movies)

scratch_train_number.py:爬取全国列车号

#!/usr/bin/python  
# -*- coding: UTF-8 -*-  
import requests  
import bs4  
import json  
import MainUtil  resources_file_path = '/resources/train/trainNameList.ini'  
scratch_url = 'http://www.59178.com/checi/'  def scratch_train_number(scratch_url, old_trains):  new_trains = []  resp = requests.get(scratch_url)  data = resp.text.encode(resp.encoding).decode('gb2312')  soup = bs4.BeautifulSoup(data, "html.parser")  a_trains = soup.find('table').find_all('a')  for train in a_trains:  if train.text not in old_trains and train.text:  new_trains.append(train.text)  return new_trains  if __name__ == '__main__':  MainUtil.main(resources_file_path, scratch_url, scratch_train_number)

scratch_train_station.py:爬取全国列车站

#!/usr/bin/python  
# -*- coding: UTF-8 -*-  
import requests  
import bs4  
import random  
import MainUtil  resources_file_path = '/resources/train/trainStationNameList.ini'  
scratch_url = 'http://www.smskb.com/train/'  def scratch_train_station(scratch_url, old_stations):  new_stations = []  provinces_eng = (  "Anhui", "Beijing", "Chongqing", "Fujian", "Gansu", "Guangdong", "Guangxi", "Guizhou", "Hainan", "Hebei",  "Heilongjiang", "Henan", "Hubei", "Hunan", "Jiangsu", "Jiangxi", "Jilin", "Liaoning", "Ningxia", "Qinghai",  "Shandong", "Shanghai", "Shanxi", "Shanxisheng", "Sichuan", "Tianjin", "Neimenggu", "Xianggang", "Xinjiang",  "Xizang",  "Yunnan", "Zhejiang")  provinces_chi = (  "安徽", "北京", "重庆", "福建", "甘肃", "广东", "广西", "贵州", "海南", "河北",  "黑龙江", "河南", "湖北", "湖南", "江苏", "江西", "吉林", "辽宁", "宁夏", "青海",  "山东", "上海", "陕西", "山西", "四川", "天津", "内蒙古", "香港", "新疆", "西藏",  "云南", "浙江")  for i in range(0, provinces_eng.__len__(), 1):  cur_url = scratch_url + provinces_eng[i] + ".htm"  resp = requests.get(cur_url)  data = resp.text.encode(resp.encoding).decode('gbk')  soup = bs4.BeautifulSoup(data, "html.parser")  a_stations = soup.find('left').find('table').find_all('a')  for station in a_stations:  if station.text not in old_stations:  new_stations.append(provinces_chi[i] + ',' + station.text)  return new_stations  if __name__ == '__main__':  MainUtil.main(resources_file_path, scratch_url, scratch_train_station)

将项目放到测试服务器(centos7系统)中运行起来,我写了一个crontab,定时调用他们,下面贴出crontab。

/etc/crontab

SHELL=/bin/bash  
PATH=/sbin:/bin:/usr/sbin:/usr/bin  
MAILTO=root  # For details see man 4 crontabs  # Example of job definition:  
# .---------------- minute (0 - 59)  
# |  .------------- hour (0 - 23)  
# |  |  .---------- day of month (1 - 31)  
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...  
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat  
# |  |  |  |  |  
# *  *  *  *  * user-name  command to be executed  0  0  *  *  * root python3 /data/app/smart/py/scratch_movie_name.py    >> /data/logs/smartpy/out.log 2>&1  0  1  *  *  1 root python3 /data/app/smart/py/scratch_train_station.py >> /data/logs/smartpy/out.log 2>&1  0  2  *  *  2 root python3 /data/app/smart/py/scratch_train_number.py  >> /data/logs/smartpy/out.log 2>&1  0  3  *  *  4 root python3 /data/app/smart/py/scratch_flight_number.py >> /data/logs/smartpy/out.log 2>&1  0  4  *  *  5 root python3 /data/app/smart/py/scratch_airport_name.py  >> /data/logs/smartpy/out.log 2>&1

后续

目前项目已经正常运行了三个多月啦。。。

有问题反馈

在阅读与学习中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

  • 微信公众号:裸睡的猪
  • 在下面留言
  • 直接给我私信

关于此公众号

  • 后期或提供各种软件的免费激活码
  • 推送python,java等编程技术文章和面试技巧
  • 当然你们可以将你们感兴趣的东西直接送给我
  • 谢谢你们真诚的关注,此公众号以后获得的收益将全部通过抽奖的形式送给大家
  • 以后如果博主要创业的话,也会在此公众号中挑选小伙伴哦~
  • 希望大家分享出去,让更多想学习python的朋友看到~

 

 

转载于:https://www.cnblogs.com/pig66/p/10420940.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记之-------UIScrollView 基本用法 代理使用

//contentSize、contentInset和contentOffset 是 scrollView三个基本的属性。 // 滚动 self.ScrollView.contentSize self.imageview.frame.size; //偏移X 0 Y -74 向下偏移 self.ScrollView.contentOffset CGPointMake(0,-74); // 边距 距离顶部74 左 0 下40 右0 self.Scr…

hibernate3配置文件hibernate.cfg.xml的详细解释

<!--标准的XML文件的起始行&#xff0c;version1.0表明XML的版本&#xff0c;encodinggb2312表明XML文件的编码方式--> <?xml version1.0 encodinggb2312?> <!--表明解析本XML文件的DTD文档位置&#xff0c;DTD是Document Type Definition 的…

php下载数据表,javascript – 如何使用php下载表数据作为excel表..?

伙计们,我在som计算集后在表格中生成一组数据.一旦用户点击保存按钮excel文件,必须生成该数据以供下载.什么是PHP的代码..伙计们没有从数据库中检索数据……它是在执行了一组计算后显示的.因为我没有任何想法我没有发布任何相关的代码… sry为此…下面是我的表格的样子下面是我…

spring boot 启动类

做项目用到spring boot 感觉spring boot用起来比较流畅。想总结一下&#xff0c;别的不多说&#xff0c;从入口开始。 spring boot启动类Application.class 不能直接放在main/java文件夹下 一、spring boot的入口启动类概览。 import org.springframework.context.annotation.B…

UIImageView圆角,自适应图片宽高比例,图片拉伸,缩放比例和图片缩微图

/* 设置圆角&#xff0c;通过layer中的cornerRadius和masksToBounds即可。 自适应图片宽高比例。通过UIViewContentModeScaleAspectFit设置&#xff0c;注意这个UIImageView的frame就不是init中的数据了。 同样的UIImage图片放入不同frame中的UIIma…

FlashFXP使用教程

点FlashFXP菜单栏“站点-站点管理”打开站点管理器。然后点新建站点&#xff0c;输入站点名称&#xff08;随意&#xff09;&#xff0c;确定。 编辑站点管理器里新建的站点的相关信息&#xff0c;包括站点名称、地址、用户名称、密码等。编辑完成&#xff0c;点应用保存站点信…

七 内置锁 wait notify notifyall; 显示锁 ReentrantLock

Object中对内置锁进行操作的一些方法&#xff1a; Java内置锁通过synchronized关键字使用&#xff0c;使用其修饰方法或者代码块&#xff0c;就能保证方法或者代码块以同步方式执行. 内置锁使用起来非常方便&#xff0c;不需要显式的获取和释放&#xff0c;任何一个对象都能作为…

php如何制定跳转到app原生页面,js实现界面向原生界面发消息并跳转功能

本文实例为大家分享了js界面向原生界面发消息并跳转的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下步骤一在idea中&#xff0c;打开rn项目下的./Android/app,这个过程需要一点儿时间&#xff0c;可能还需要下载gradle的依赖什么的。步骤二跟做原生app没差&#xff…

apm固定翼调试方法

APM飞控传说是大神的神器新手的噩梦,APM是个便宜又好用的飞控~刚开始给我的天行者X5按APM飞控的时候也查询搜索了很多,参数值,修改和混控和混控量的修改翻遍了资料发现咱们论坛教程比较少,所以开帖总结一下本人在用apm玩固定翼一些经验给想玩apm飞控的模友们.如果有哪里说错哪里…

你的工作单位也需善待

善待这个词&#xff0c;常常和家人、朋友联系在一起&#xff0c;其实你不仅要善待家人和朋友&#xff0c;还要善待你所在的工作单位。单位给了你创造财富生存的机会&#xff0c;给了你发挥聪明才智的平台&#xff0c;给了你体现人生价值的天空&#xff0c;所以要善待它。在单位…

识别图片baidu ai php,PHP+百度AI OCR文字识别实现了图片的文字识别功能

第一步可定要获取百度的三个东西 要到百度AI网站(http://ai.baidu.com/)去注册 然后获得-const APP_ID 请填写你的appid;-const API_KEY 请填写你的API_KEY;-const SECRET_KEY 请填写你的SECRET_KEY;第二步下载SDK或者使用官方的 http://ai.baidu.com/sdk 下载第三步 然后就…

Leetcode: Populating Next Right Pointers in Each Node II

Follow up for problem "Populating Next Right Pointers in Each Node".What if the given tree could be any binary tree? Would your previous solution still work?Note:You may only use constant extra space. For example, Given the following binary tre…

深入理解javascript原型和闭包(4)——隐式原型

注意&#xff1a;本文不是javascript基础教程&#xff0c;如果你没有接触过原型的基本知识&#xff0c;应该先去了解一下&#xff0c;推荐看《javascript高级程序设计&#xff08;第三版&#xff09;》第6章&#xff1a;面向对象的程序设计。 上节已经提到&#xff0c;每个函数…

ecshop 手机版的php代码在哪里,PHP 在ecshop上集成 手机网页支付_php

参考alipay网页支付接口的代码其实原理跟ecshop上集成的alipay支付差不多 就是因为利用curl请求的时候相应时间过长 所以不能直接去先post数据再生成button/*** 生成支付代码* param array $order 订单信息* param array $payment 支付方式信息*/function get…

技术回归本位:海尔引领空调产业重构格局

当前&#xff0c;互联网新思维方式日趋侵染&#xff0c;越来越多的细分领域在“互联网”理念下纷纷尝试跨界探索新的创新&#xff0c;一些商家除了推出全新战略型产品和服务之外&#xff0c;还在主打营销概念争夺舆论风口方面投入了巨大的精力与资源。在这种以理念为中心的时代…

护肤

选择什么 护肤品 2222选择什么 1氨基酸洗面奶&#xff1a;去油控油能力适中&#xff0c;用完皮肤清爽&#xff0c;比较亲和&#xff0c;一般成分里多次出现“氨酸”这两个字的就是氨基酸洗面奶&#xff0c;这种洗面奶适合长期使用.</p><p><b>皀基洗面奶&…

与TCP/IP协议的初次见面(一)

引言 最近LZ有了一点时间&#xff0c;于是便拿出TCP/IP的书本开始啃。开始的时候&#xff0c;啃起来枯燥无味&#xff0c;现在好不容易有点开窍&#xff0c;于是赶忙记录一下&#xff0c;生怕自己一转眼就给忘了。不过计算机系统原理就有点可惜了&#xff0c;最近一直没时间看&…

Oracle约数,Oracle约束简介

整理自《OCP认证指南》001 概述表约束是数据库能够实施业务规则以及保证数据遵循实体——关系模型的一种手段&#xff0c;其中&#xff0c;实体——关系模型由定义应用程序数据结构的系统分析所确定。在针对定义了约束的表执行任何DML时&#xff0c;如果DML违反了约束&#xff…

用cmd运行java可以javac不行(win10)

今天发现个有趣的问题&#xff0c;用cmd运行java可以javac不行。(win10) java-home和classpath配置没有问题,最后发现问提出先在path&#xff0c;在这里看并没有异常。 在上面图片中点击编辑文本&#xff0c;在这里可以清楚的看见多了引号和分号&#xff0c;将其删除&#xff0…

vs窗体 oracle,VS2010连接oracle数据库的简单例子

下面附有代码&#xff1a;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.OracleClient;namespace 连接oracle数据库…