使用码栈批量抓取店铺所有商品名称和价格

2020-03-12  本文已影响0人  龟仙人_9103

最近收到一个淘宝页面商品信息的需求,之前页弄过类似的需求;一开始想着使用python等爬虫工具,不过介于淘宝对爬虫机制的限制,还是果断放弃了;

然后选择了使用码栈这个神器,虽然他很多功能都需要收费,最关键的最后的数据结果的导出功能要收费;直接哭晕;但是身为程序员没有绕不过去的砍;请允许我慢慢道来;

下面简单介绍下我的开发:

这是我们整个可视化流程的截图,大概逻辑页很简单,

1、先遍历所有页面数(可以自动获取,也可以手动写,)

2、然后拼接url  基础URL+页数

3、。。。

4、对于很多不想付钱的老铁,遇到下面的问题是很是坑爹的

5、我的解决方法就算,通过get请求把最后的结果通过网络的方式传输出去;这方法对于程序员来说其实很简答,随随便便开个服务就能解决;但对于不是程序员的老铁可能比较困难了,可能又是一堆的折腾;

```package httpServer2;

import java.io.BufferedReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Map;

public class HTTPServer {

    public static void main(String[] args) {

        try {

            ServerSocket ss=new ServerSocket(8888);

            while(true){

                Socket socket=ss.accept();

                BufferedReader bd=new BufferedReader(new InputStreamReader(socket.getInputStream()));

                /**

                * 接受HTTP请求

                */

                String requestHeader;

                int contentLength=0;

                while((requestHeader=bd.readLine())!=null&&!requestHeader.isEmpty()){

                    //System.out.println(requestHeader);

                    /**

                    * 获得GET参数

                    */

                    if(requestHeader.startsWith("GET")){

                        int begin = requestHeader.indexOf("/?")+2;

                        int end = requestHeader.indexOf("HTTP/");

                        String condition=requestHeader.substring(begin, end);

                        System.out.println("GET参数是:"+condition);

                        String params = condition.substring(condition.indexOf("?") + 1, condition.length());

                        String[] aaa = params.split("&");

                        String ccc = "";

                        for(int i=0;i<aaa.length;i++) {

                        String[] bbb = aaa[i].split("=");

                        bbb[1] = java.net.URLDecoder.decode(bbb[1], "utf-8");

                        if(i==0) {

                        ccc = bbb[1];

                        }else {

                        ccc += ","+bbb[1];

                        }

                        }

                        HTTPServer.filewrite(ccc,"outData.csv");

                    }

                }

                StringBuffer sb=new StringBuffer();

                if(contentLength>0){

                    for (int i = 0; i < contentLength; i++) {

                        sb.append((char)bd.read());

                    }

                    System.out.println("POST参数是:"+sb.toString());

                }

                //发送回执

                PrintWriter pw=new PrintWriter(socket.getOutputStream());

                pw.println("HTTP/1.1 200 OK");

                pw.println("Content-type:text/html");

                pw.println();

                pw.println("<h1>访问成功!</h1>");

                pw.flush();

                socket.close();

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    public static void filewrite(String str, String ResultfilePath) throws IOException{

try {                                                                       

            // 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件     

            FileWriter writer = new FileWriter(ResultfilePath, true);                   

            writer.write(str+System.getProperty("line.separator"));   

            writer.close();                                                       

        } catch (IOException e) {                                                 

            e.printStackTrace();                                                   

        }

}

}

```

这java半的 简易Http服务; 可以接受GET服务,然后已csv的格式写入到文件中;-一切大功搞成;

上一篇 下一篇

猜你喜欢

热点阅读