[pythonjava爬虫实战]-尊龙游戏旗舰厅官网
发布时间:2025/1/21
15
豆豆
尊龙游戏旗舰厅官网
收集整理的这篇文章主要介绍了
[pythonjava爬虫实战]-爬取学院老师信息之-java版本python版本
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
文章目录
- java 版本
- 思路:
- 预备工作:
- 简述
- 代码
- python版本
- 代码
这个实战文章仅作为自己学习笔记记录;使用java和python爬取相同的内容,由于爬取内容涉及个人信息,去除了敏感信息,作为学习记录!python实战那篇被官方禁了 苦笑
java 版本
思路:
预备工作:
导包
使用maven创建项目;
导包的时候直接在pom.xml添加依赖即可完成导包;不需要下载到本地添加;
jsoup 包依赖
jxl 包依赖
<dependency><groupid>net.sourceforge.jexcelapi</groupid><artifactid>jxl</artifactid><version>2.6.12</version></dependency>添加完刷新一下
也可以下载到本地(针对不是maven项目)
jxl 包下载尊龙游戏旗舰厅官网
简述
java:
提取到信息之后保存到表格的过程,第一思路是跟写python那一篇一样使用字典,但是查了一些资料,实现不了;
第二个想到的是一边查找一边写入,这个过程就要先创建出一个工作表,就需要导入jxl包,这个是表单创建需要的包;
在去除提取信息的问号:
java:str.resplaceall(“[?]”,"");使用这个一直去不掉?,
如果使用python str.strip("?") 直接将问号去掉;
去除空格:
java: str.trim() //去除首尾空格
python : str.strip() # 默认去除空格
字符串子串:
java : str.substring(beg,end); //需要开头和尾部的位置
python :直接使用切片;
文件格式 | 文本 | 二进制文件 |
全称 | comma separated values | 微软的电子文档excel |
操作 | 只是一个文本文件,存储数据,不包括格式,公式,宏; | 存储数据,还能对数据进行操作 |
后缀 | .csv分隔文本文件 | 电子表格.xls或者.xlsx |
打开方式 | 可以使用记事本打开编辑 | 不能使用记事本打开,只能用打开表格的方式打开,可以连接外部数据源获取数据 |
使用 | csv读取大文件不会像execl那么简单,生成csv比较容易 | excel 用于数据仓库,解析excel的编程语言库相对更大,更慢,更复杂 |
安全 | csv 相对安全,清楚区分数值和文本,按照原样存储 | 数值和文本没有明确的区分 |
标志 | 只能编写一次列标题 | 必须为每一行中的每一列都有一个开始标志和结束标志 |
导入 | 导入更快 | 导入慢,消耗更多的内存 |
内容 | 文本 | 文本,图表等 |
代码
import org.jsoup.jsoup; //java 爬虫的包 import org.jsoup.nodes.document; import org.jsoup.nodes.element; import org.jsoup.select.elements; import java.io.ioexception; import jxl.write.*; import jxl.*; // 写入表格的包 import java.io.*; public class spider {public static void main(string[] args) throws ioexception, writeexception {int teachernum = 1; //定义第 n 个老师int titlelen = 8;string biaoti = "姓名,职称,系、研究所,研究领域,讲授课程,办公电话,电子邮箱,办公地点,个人尊龙游戏旗舰厅官网主页"; // 定义表格的titlewritableworkbook book = workbook.createworkbook((new file("teacher_info.xls"))); // 创建新的表格writablesheet sheet = book.createsheet("no1",0); // 创建工作页for(int l=0;l<=titlelen;l) // 循环将title写入第一行{string[] title = biaoti.split(","); // 将上面定义的字符串按照逗号划分label label = new label(l,0,title[l]); // 循环写入sheet.addcell(label);}try {string url = ""; //爬取网址document document = jsoup.connect(url).get();elements titleelement = document.getelementsbyclass("mclb");//获取类名for(int i=0; i<4;i) // 循环前三个表单 教授,副教授,讲师{for (int j = 0; j<titleelement.get(i).children().size();j) // 遍历每个表单的每个老师{string herf = titleelement.get(i).children().get(j).attr("href"); //获取每个老师的信息链接string teacher_name = titleelement.get(i).children().get(j).attr("title"); // 获取名称label label = new label(0,teachernum,teacher_name); sheet.addcell(label); //添加到表单里string schoolhref = ""; //网址前缀string contentherf = schoolhref herf.substring(2,herf.length()); // 拼接成新的链接document contentdoc = jsoup.connect(contentherf).get(); // 获取新的链接内容element contentelement = contentdoc.getelementbyid("vsb_content"); //定位idfor(int p =0;p<contentelement.select("p").size();p) // 循环新的段落,每个段落为职称,邮箱等等;{string pcontent = contentelement.select("p").get(p).text(); //获取段落文本string s1 = ":";if(pcontent.contains(s1)) //匹配中文冒号是否在字符串中{string reg = "[^\u4e00-\u9fa5a-za-z1-9:.( )/:,@]"; // 匹配除了中文字母数字等等pcontent.trim(); // 去除字符串前后空格pcontent = pcontent.replaceall(reg, ""); //将上面这些存在的之外的用空字符进行替换string[] pcon = pcontent.split(":"); //按照中文冒号进行划分if(pcon[0].equals("职称")||pcon[0].equals("职务")) //进行判读之后填写入表格{label zhiwu = new label(1,teachernum, pcon[1]); //表示第1列第teachernum行;sheet.addcell(zhiwu);}if(pcon[0].equals("系研究所")||pcon[0].equals("部门")){label danwei = new label(2,teachernum, pcon[1]); //第二列第teachernum行sheet.addcell(danwei);}if(pcon[0].equals("研究领域")){label yanjiu = new label(3,teachernum, pcon[1]);sheet.addcell(yanjiu);}if(pcon[0].equals("讲授课程")||pcon[0].equals("讲述课程")){label course = new label(4,teachernum, pcon[1]);sheet.addcell(course);}if(pcon[0].equals("办公电话")){label phone = new label(5,teachernum, pcon[1]);sheet.addcell(phone);}if(pcon[0].equals("电子邮箱")||pcon[0].equals("电子邮件")||pcon[0].equals("个人邮箱")){label email = new label(6,teachernum, pcon[1]);sheet.addcell(email);}if(pcon[0].equals("办公地点")){label address = new label(7,teachernum, pcon[1]);sheet.addcell(address);}if(pcon[0].equals("个人尊龙游戏旗舰厅官网主页")){label personalweb = new label(8,teachernum, pcon[1]);sheet.addcell(personalweb);}}else {}}teachernum =1; //下一位老师}}}catch (ioexception e){e.printstacktrace();}book.write();book.close();}}由于之前这篇被官方认为是违规博文,所以之前的学习日记被禁了;搬一下上一篇的代码,后面学习记录更新
python版本
代码
# _*_coding:utf-8_*_ # create by jucw on 2021/11/24 11:44import requests import bs4 import re import pandas as pd # 存表格 n = 66 # 估计大概多少个教师 # 存储数据,这是对于每个老师的个人信息不是统一的,将没有的信息用空字符串填充 result = {"姓名": [""]*n,"职称": [""]*n,"系、研究所":[""]*n,"研究领域":[""]*n,"办公电话":[""]*n,"电子邮件":[""]*n,"讲授课程":[""]*n,"个人尊龙游戏旗舰厅官网主页":[""]*n,"办公地点":[""]*n}# 网址 url = ""# 网址设置了反爬虫,添加请求头模拟浏览器登录 headers = {'user-agent':'mozilla/5.0 (windows nt 10.0; win64; x64; rv:94.0) gecko/20100101 firefox/94.0' }# 请求数据 r = requests.get(url,headers=headers) # 设置编码方式,否则出现乱码 r.encoding='utf-8' # 解析 html = bs4.beautifulsoup(r.text, "html.parser") # 找到网页标签为 "ul" 下 class_="sdfasdjsf clearfloat" 下的所有 "li" 列表标签 每个列表代表一个老师 all_teacher = html.find("ul", class_="sdfasdjsf clearfloat").find_all("li") # count 代表第几个老师,用于将数据写入到字典对应的位置 count = 0for data in all_teacher:zhichenk = data.find("div", class_="fasf").get_text() # 找到div class_="fast" 教授这个块name = data.find("div", class_="mclb") # 找到对应的"mclb"类for j in range(len(name)): # 循环每个老师 第一次进入的是教授这个列表的老师,第二次进入副教授,第三次进入讲师k = j*21 # 这个是网页是每个老师信息出现之后会空一行,所以有用的信息在奇数行下if k>=len(name): # 越界退出breaka = name.contents[k] # 获取这一行的信息m_href = a.attrs['href'] # 找到进入老师详细信息的链接xinming = a.attrs['title'] # 这里通过debug 发现title 属性是教师名称result["姓名"][count] = xinming # 在字典对应位置写入m_href = ""m_href[3:] # 网址前缀 提取网址r1 = requests.get(m_href, headers=headers) # 请求新的链接进入信息页面r1.encoding='utf-8'bs1 = bs4.beautifulsoup(r1.text, 'html.parser')sour = bs1.find('div', id='vsb_content').find_all('p') # 信息在id 为"vsb_content" 的段内for x in sour: # 遍历每个段inflag = countstr = x.text # 获取文本信息str = str.lstrip() # 去除信息的左空格if str.count(":") >= 2: # 这一步判断是因为网页的信息有部分没有规矩,不能直接提取s = str.split(" ") # 取出字符串前后空格for i in s:title = i.split(":") # 按照: 进行分割字符串if len(title) == 1: # 空字符continueif title[0] == "职务":result["职称"][inflag] = title[1]elif title[0] == "电子邮箱" or title[0] == "个人邮箱":result["电子邮件"][inflag] = title[1]elif title[0] == "讲述课程":result["讲授课程"][inflag] = title[1]elif title[0] == "部门":result["系、研究所"][inflag] = title[1]else:result[title[0]][inflag] = title[1]continuestr = "".join(str.split()) # 去除字符串中的空格if str == '\n' or str == '' or len(str)==1 or str == '\r\n' or str == '\xa0\xa0\xa0': # 去除无关信息continuestr = str.strip() # 去除空格title = str.split(":") # 正常匹配按照冒号进行分割if title[0] == "职务":result["职称"][inflag] = title[1]elif title[0] == "电子邮箱" or title[0] == "个人邮箱":result["电子邮件"][inflag] = title[1]elif title[0] == "讲述课程":result["讲授课程"][inflag] = title[1]elif title[0] == "部门":result["系、研究所"][inflag] = title[1]else:result[title[0]][inflag]= title[1] # 不是特殊情况按照字典进行填写infalg = jcount = count 1 # 提取下一个老师信息 df = pd.dataframe(result) #将字典使用格式转换 df.to_csv("jiaoshi1.csv", encoding="utf_8_sig") # 保存信息 防止csv 产生乱码总结
以上是尊龙游戏旗舰厅官网为你收集整理的[pythonjava爬虫实战]-爬取学院老师信息之-java版本python版本的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: [python cookbook]阅读笔
- 下一篇: