1.起因:
今天是有趣的一天,她只说找到12年的老接口,很多喜欢的图片都没有;我想随便对她说随便找个图片吧,她说用户需要,没办法那我就试试吧
2.经过
研究了一下微博官网
起初感觉很好爬,我直接正则匹配 <img src开头到>结尾然后提取出url地址不就行了吗?然而出乎我的意料的是要弄一个get请求才行,https://weibo.com/ajax/log/action?type=pic&uicode=20000401&fid=232174&act_code=4874&ext=module%3A01&luicode=&t=1644817383343
没办法,我太菜了不能直接根据dom来设置显示再来爬虫。然后我分析了一下network中img请求,发现表情包的地址这不是出来了吗?然后我百度搜索能不能直接直接下载呢,发现不能,可以根据游览器缓存找到他们,然而我也不知道怎么操作。没办法为了节日的快乐,只有费体力了,等等,我突然想到利用批量下载可以省力,那我就干吧。
首先我建立一个url.txt把图片的地址一行行保存下来,然后使用我的java语言爬虫。
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class DownloadPicFromURL {
public static void main(String[] args) throws IOException {
// 文件夹路径
String path = "C:\\Users\\11209\\Desktop\\生信\\url.txt";
List<String> scanListPath = readFile02(path);
scanListPath.forEach(url->{
System.out.println(url);
String imageName = "C:\\Users\\11209\\Desktop\\生信\\img_down\\"+url.substring(url.lastIndexOf("/")+1);
downloadPicture(url,imageName);
});
}
/**
* 读取一个文本 一行一行读取
*
* @param path
* @return
* @throws IOException
*/
public static List<String> readFile02(String path) throws IOException {
// 使用一个字符串集合来存储文本中的路径 ,也可用String []数组
List<String> list = new ArrayList<String>();
FileInputStream fis = new FileInputStream(path);
// 防止路径乱码 如果utf-8 乱码 改GBK
// eclipse里创建的txt 用UTF-8,在电脑上自己创建的txt 用GBK
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = "";
while ((line = br.readLine()) != null) {
// 如果 t x t文件里的路径 不包含---字符串 这里是对里面的内容进行一个筛选
if (line.lastIndexOf("---") < 0) {
list.add(line);
}
}
br.close();
isr.close();
fis.close();
return list;
}
//链接url下载图片
private static void downloadPicture(String urlList,String path) {
URL url = null;
try {
url = new URL(urlList);
DataInputStream dataInputStream = new DataInputStream(url.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(new File(path));
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = dataInputStream.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
fileOutputStream.write(output.toByteArray());
dataInputStream.close();
fileOutputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是效果。