Connection conn =Jsoup.connect(url).validateTLSCertificates(false)
.timeout(30000);
/*设置请求头 为了模拟浏览器顺利爬取 同时忽略tls证书的错误(有些网站检测
出为爬虫后直接给出证书错误 50开头的服务器错误;同时有些盗版网站服务器连接较慢 设置超时时间
*/
conn.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
conn.header("Accept-Encoding", "gzip, deflate, sdch");
conn.header("Accept-Language", "zh-CN,zh;q=0.8");
conn.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");
Document doc=conn.get();
//猜测jsoup的链接为httpclient获取的html 并转为string
Element aim=doc.select("#search-main > div.search-list > ul > li:nth-child(2) > a").first();
//其中的select的选择器语法可直接从浏览器f12右击获取
//但如果是动态生产页面 就只能自己写选择语法
String nexturl=aim.attr("href");
2.遇到的主要问题
大多数网站暴露的接口多为http链接下的; 但是在安卓9及以上版本,默认不支持http这样的不安全链接
遇到很多网页中查询中文的编码问题
String name="text";
//utf-8转为gbk编码
byte[] temp=name.getBytes("utf-8");//这里写原编码方式
String newStr=new String(temp,"gbk");//这里写转换后的编码方式
//url编码
String newStr=java.net.URLEncoder.encode(name, "UTF-8");//这里写转换后的编码方式
同时在爬取某网站的免费小说遇到很多问题 用了将近12h
首先返回 stl证书错误 validateTLSCertificates(false)
常见的40错误 是在确定url无错误只是单纯被检测为爬虫 ignoreHttpErrors(true)
忽略的http错误不包括50错误 于是直接选出返回码 如果不为200 直接重连
但这样爬去不到100章又被检测 怀疑是浏览时间固定 暴露 遂随机等待时间 终于成功
if(conn.execute().statusCode()!=200){
Random random = new Random();//默认构造方法
int j=random.nextInt(60);
TimeUnit.SECONDS.sleep(j);
//再次爬取
Find_Txt_BQG(secondurl,name);
}
如果要直接下载 网页中 的 mp3 我没做到 用jsoup的方法实现下载 accept的格式总是出错 即使不出错也无法下载 正确 于是自制一个建议的mp3下载器
// 获取songURL
URL url = new URL(DownUrl);
// 获得连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置10秒的相应时间
connection.setConnectTimeout(10 * 1000);
connection.setReadTimeout(6000);
int code = connection.getResponseCode();
if (code != HttpURLConnection.HTTP_OK) {
throw new Exception("文件读取失败");
}
// 获得输入流
DataInputStream in = new DataInputStream(connection.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream(Path);//path为地址+要创建的mp3文件
//设计缓存区
byte[] buffer = new byte[2048];
int count = 0;
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
out.close();
in.close();
1.接触安卓的ui设计的环境创建
开始使用的eclipse结果出现build——tool和tools不匹配
即使我架梯子去科学上网也无法找到匹配的tools
转用as
2.as的主要配置
gradle的下载需要架梯子
不会的程序员不是好程序员
基本都是傻瓜式制作 注意用空白activity会出现app为红×的现象
3安卓的网络访问
自安卓4版本以来网络访问需要设计在 子线程中
由于第一次接触安卓编程 并没有学会bundle的使用
我采用了类的全局变量 来正常爬取进程
4安卓9对于http不在支持
主要解决方法
rec下新建xml文件夹 建立
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
androidmanifest.xml下的application添加
android:networkSecurityConfig="@xml/network_security_config">
实现的为全部http都可访问 但有更安全的策略 请自行google
本来打算一周实现这个toy程序的 没想到还是用了两周 ui确实没有想象的简单