通过Java爬虫实现51job申请职位
抓包部分
1.抓到申请职位的封包
随便搜索一个职业(我这里搜索Java)
启动抓包后点申请职位,抓到下面这个包:
可以看到这就是我们需要的封包
打开调试窗口,分析一下请求地址
这个地址有时间戳,可能不能重复提交。我们手动发送请求试一下
可以看到他再次申请了刚才的职位,说明这个地址可以重复请求
2.尝试使用发送封包的方式申请一个职位
通过上文我们对封包的分析可以看到,这个地址中包含了一个
jobid
标签以及他的值,我们查看这个网页的源代码,查找jobid:
每个职位都对应一个jobid,即我们可以通过更换jobid来实现申请职位
把这个jobid的值替换到我们封包的请求地址中
然后发送请求:
?what
回到网页中找到这个id对应的职位,按下申请,发现跳转到了响应正文中的网址,是一个填志愿的网站。
好的,这个网站并不是所有公司职位都可以一键申请。
但并不妨碍我们继续,我们换一个jobid再次发送请求:
成功了!
Java部分
3.使用Java发送请求
直接上代码
- getsend类
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
/**
*这个
*/
public class getsend {
public static String sendGet(String url) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url;
// 打开和URL之间的连接
URL realUrl = new URL(urlNameString);
URLConnection connection = realUrl.openConnection();
// 设置请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
// 浏览器标识
connection.setRequestProperty("user-agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0");
// 提交cookie
connection.setRequestProperty("Cookie",
"此处为提交的Cookie,因为太多了所以不写出来了");
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) { //读出流中的数据
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
} // 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
}
- main主方法
public class testsend {
public static void main(String[] args) {
getsend getsend = new getsend();
System.out.println(getsend.sendGet( //请求地址
"https://i.51job.com/delivery/delivery.php?rand=0.0901649582236812&jsoncallback=jQuery18308038288213724798_1619579431652&jobid=(118850218%3A0)&prd=search.51job.com&prp=sou_sou_soulb&cd=search.51job.com&cp=search_list&resumeid=&cvlan=&coverid=&qpostset=&elementname=delivery_jobid_126898406&deliverytype=1&deliverydomain=%2F%2Fi.51job.com&language=c&imgpath=%2F%2Fimg01.51jobcdn.com&_=1619579441083"));
}
}
执行,输出:
OK,现在我们只需要爬取每个职位的jobid再添加到请求地址内即可实现申请职位
4.使用Java实现申请职位
- 爬取jobid
用Jsoup取出整个网页源码
Jsoup.connect(url).get();
可以发现职位信息全部存在一个js文本里,所以我们这里使用字符处理来取出jobid
这里用到了两个方法:
- 文本位置搜索
indexOf("欲搜索的文本",起始搜索位置)
- 子文本取出
substring(起始位置,结束位置)
即我们要使用两次indexOf()
方法分别找出我们需要的值的起始位置与结束位置,然后把这两个位置传进substring()
中。
这里注意indexOf()
这个方法还有第二个参数,即"起始搜索位置",我们创建一个"起始搜索位置"的变量,让他等于substring()
中的结束位置,这样在循环中每次进行文本位置搜索时,都是从上一个jobid的下面开始搜索,这样就可以达到将整个网页的jobid全部取出的目的。
代码如下:
//欲处理的字符串:> "jobid":"130114485","coid" <
//要取出的值:130114485
int 起始位置 = 网页源代码.indexOf("jobid",起始搜索位置) + "jobid\":\"".length();
\\这里加上> jobid":" <这个字符串的长度是为了直接取出130114485,否则取出的就是jobid":"130114485
int 结束位置 = 网页源代码.indexOf("\",\"coid",起始搜索位置);//这里取出的是130114485之后的字符串> ","coid" <的位置,也就是我们需要的结束位置
网页源代码.substring(起始位置, 结束位置)//取出jobid
Head_i = (结束位置 + 1); //结束位置+1,防止原地搜索
把jobid取出后,我们就可以开始申请职位操作了
实例化getsend类,把jobid传进去:
运行:
手机要静音两天了
- 以上即为本案例全部内容,如有纰漏或错误,还请指出
本程序仅为学习交流,无意冒犯任何人,给您带来的不便我很抱歉