TIP
又在琢磨爬虫,我本以为像以前一样,没想到又不知道踩什么坑进去了。
这一次也是主要利用了三个接口,只需要一个BDUSS
就可以了,到期时间在2028年,挺长的。一个是类似于登录的接口,用于拿到tbs,使用签到接口的时候需要用到这个参数,还有一个接口是用于获取贴吧列表的,万事必备。
HttpUrlConnection
在安卓网络开发中曾经使用过,仍旧记得volley
的post请求携带参数,总是返回参数错误信息,这次仍然使用的是HttpUrlConnection
。get请求不必多说,借于前面的经验,我仍然像以前那么携带参数,如下代码所示。
URL url = new URL(SIGN_URL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestProperty("connection","keep-alive");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36");
connection.setRequestProperty("Cookie", "BDUSS="+BDUSS);//设置请求头
connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");//设置参数类型是json格式
connection.connect();
String body = "kw="+name+"&tbs="+tbs+"&sign="+enCodeMd5("kw="+name+"tbs="+tbs+"tiebaclient!!!");
/**
* 说起来都是泪,为什么这种方式不行,还非得弄成get添加参数的形式,唉。
*/
// String body = "{\n" +
// " \"kw\": \""+name+"\"\n" +
// " \"tbs\": \""+tbs+"\"\n" +
// " \"sign\": \""+enCodeMd5("kw="+name+"tbs="+tbs+"tiebaclient!!!")+"\"\n" +
// "}";
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
writer.write(body);
writer.close();
注释的部分就是以前在安卓中post请求携带参数的格式,我满怀信心的这样写,结果就失败了,总是爆出一个参数错误,找了很久也没有怀疑是这个地方的问题。爬虫仍然是python
和php
比较多一点,因此,大多数参考他们的经验,python
不得不说是真的好,请求参数就像是axios
中那么清晰,php
写的也很简洁,不过我不太熟悉。
python
携带的参数是这样的
data = {
'BDUSS': bduss,
'_client_type': '2',
'_client_id': 'wappc_1534235498291_488',
'_client_version': '9.7.8.0',
'_phone_imei': '000000000000000',
'from': '1008621y',
'page_no': '1',
'page_size': '200',
'model': 'MI+5',
'net_type': '1',
'timestamp': str(int(time.time())),
'vcode_tag': '11',
}
php
携带参数是这样的
$postdata='BDUSS='.urlencode($bduss).'&_client_version=8.1.0.4'.'&page_no=' . $pageno.'&page_size=100'.'&sign='.md5('BDUSS='.$bduss.'_client_version=8.1.0.4'.'page_no='.$pageno.'page_size=100'.'tiebaclient!!!');
两个都是post
请求,可是php
的却像是get
请求,我以为只是php
特有,没想到java
也得那样写才行。我很不明白为什么不行,难道是后端识别的问题?以前明明用着好好的,可是还是出了问题。
String body = "kw="+name+"&tbs="+tbs+"&sign="+enCodeMd5("kw="+name+"tbs="+tbs+"tiebaclient!!!");
不过,最后还是想说,自动签到还是挺爽的。自动签到地址 (opens new window),欢迎fork
。