java爬虫爬取网页内容,并导出到Excel

准备的jar

        <!--json-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

        <!--excel-->
        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>2.6.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
        <!--爬虫-->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.13.1</version>
        </dependency>

实体类:

public class Weather {

    /**
     * 日期
     */
    private String date;

    /**
     * 最高气温
     */
    private String maxTemperature;

    /**
     * 最低气温
     */
    private String minTemperature;

    /**
     * 白天天气
     */
    private String dayTimeWeather;

    /**
     * 夜间天气
     */
    private String nightWeather;

    /**
     * 风向
     */
    private String windDirection;

    /**
     * 风力
     */
    private String windPower;

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getMaxTemperature() {
        return maxTemperature;
    }

    public void setMaxTemperature(String maxTemperature) {
        this.maxTemperature = maxTemperature;
    }

    public String getMinTemperature() {
        return minTemperature;
    }

    public void setMinTemperature(String minTemperature) {
        this.minTemperature = minTemperature;
    }

    public String getDayTimeWeather() {
        return dayTimeWeather;
    }

    public void setDayTimeWeather(String dayTimeWeather) {
        this.dayTimeWeather = dayTimeWeather;
    }

    public String getNightWeather() {
        return nightWeather;
    }

    public void setNightWeather(String nightWeather) {
        this.nightWeather = nightWeather;
    }

    public String getWindDirection() {
        return windDirection;
    }

    public void setWindDirection(String windDirection) {
        this.windDirection = windDirection;
    }

    public String getWindPower() {
        return windPower;
    }

    public void setWindPower(String windPower) {
        this.windPower = windPower;
    }

    @Override
    public String toString() {
        return "Weather{" +
                "date='" + date + '\'' +
                ", maxTemperature='" + maxTemperature + '\'' +
                ", minTemperature='" + minTemperature + '\'' +
                ", dayTimeWeather='" + dayTimeWeather + '\'' +
                ", nightWeather='" + nightWeather + '\'' +
                ", windDirection='" + windDirection + '\'' +
                ", windPower='" + windPower + '\'' +
                '}';
    }
}

测试类

public class WeatherTest {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        List<Weather> list = getInfo("http://www.tianqi234.com/2020shanghai/1yue.html", 12);
        for (Weather weather : list) {
            System.out.println(weather.toString());
        }
        testHSSFWorkbook(list);
    }

    //可以指定网址,并且按照需求爬取前多少页的数据
    public static List<Weather> getInfo(String url, int month) {
        List<Weather> weatherList = new ArrayList<Weather>();
        for (int i = 1; i < month + 1; i++) {
            try {
                System.out.println("url:" + url);
                Document doc = Jsoup.connect(url).get();
                Elements table = doc.select(".graybox_cnt");
                /*  Elements tbody = table.select("tbody");*/
                Elements trList = table.select("tr");
                //每次移除的时候,你的列表长度就会发生新的变化,所以要结合实际进行移除
                trList.remove(0);
                if (i > 1) {
                    trList.remove(0);
                    trList.remove(10);
                    trList.remove(10);
                    trList.remove(20);
                    trList.remove(20);
                    trList.remove(20);
                } else {
                    trList.remove(11);
                    trList.remove(11);
                    trList.remove(21);
                    trList.remove(21);
                    trList.remove(21);
                }

                for (Element tr : trList) {
                    Elements tdList = tr.select("td");
                    Elements aList = tdList.select("a");//查询a标签
                    Weather weather = new Weather();
                    if (aList != null && aList.size() > 0) {
                        weather.setDate(aList.get(0).html().toString());
                    } else {
                        weather.setDate(tdList.get(0).html().toString());
                    }
                    weather.setMaxTemperature(tdList.get(1).html().toString());
                    weather.setMinTemperature(tdList.get(2).html().toString());
                    weather.setDayTimeWeather(tdList.get(3).html().toString());
                    weather.setNightWeather(tdList.get(4).html().toString());
                    weather.setWindDirection(tdList.get(5).html().toString());
                    weather.setWindPower(tdList.get(6).html().toString());
                    weatherList.add(weather);
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            url = "http://www.tianqi234.com/2020shanghai/" + (i + 1) + "yue.html";
        }
        return weatherList;

    }

    public static void testHSSFWorkbook(List<Weather> list) throws IOException {
        HSSFWorkbook workbook = new HSSFWorkbook();//创建excel文件(workbook)
        
        HSSFSheet sheet = workbook.createSheet("2020年上海天气统计");
        HSSFRow row = sheet.createRow(0);//创建行 从0开始

        HSSFCellStyle style = workbook.createCellStyle();//设置单元格样式
        style.setAlignment(HorizontalAlignment.CENTER);//水平居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sheet.setDefaultColumnWidth(30);
        row.setHeightInPoints(25);
        Map<String, String> map = (Map<String, String>) getMap(list.get(0));
        //设置表头
        int c = 0;
        for (String key : map.keySet()) {
            HSSFCell cell = row.createCell(c);//创建行的单元格,从0开始
            cell.setCellValue(map.get(key));//设置单元格内容
            cell.setCellStyle(style);
            c++;
        }
        Map<Integer, Weather> weatherMap = new HashMap<>();
        //除去表头
        for (int i = 1; i < list.size(); i++) {
            weatherMap.put(i, list.get(i));
        }
        for (int i = 1; i <= weatherMap.size(); i++) {
            HSSFRow rowInfo = sheet.createRow(i);
            rowInfo.setHeightInPoints(30);
            Map<String, String> map1 = (Map<String, String>) getMap(list.get(i));
            int j = 0;
            for (String key : map1.keySet()) {
                HSSFCell cellInfo = rowInfo.createCell(j);
                cellInfo.setCellValue(map1.get(key));
                cellInfo.setCellStyle(style);
                j++;
            }
        }
        FileOutputStream out = new FileOutputStream("D:\\weather1.xlsx");
        workbook.write(out);
        out.close();

    }

    /**
     * json转map
     *
     * @param object
     * @return
     */
    public static Map<?, ?> getMap(Object object) {
        if (object == null) {
            throw new RuntimeException("对象为空,转json失败");
        }
        Map<String, Object> map = new HashMap<>();
        try {
            map = (Map) JSON.parse(JSON.toJSONString(object));
        } catch (Exception e) {
            System.out.println("对象转map转换失败");
        }
        return map;
    }


}

效果:

 

### 回答1: 下面是一个Python爬虫爬取哔哩哔哩视频信息并导出Excel的示例代码,具体步骤如下: 1. 导入需要的库。 ``` import requests import json import xlwt ``` 2. 定义请求头和请求参数。 ``` headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} params = { 'mid': '9144082', # 用户id 'pagesize': '30', # 每页大小 'tid': '0', # 0为全部,其他为分类id 'page': '1', # 页码 'keyword': '', # 搜索关键字 'order': 'senddate' # 排序方式,按照发布时间排序 } ``` 3. 发送HTTP请求,并解析响应数据。 ``` url = 'https://space.bilibili.com/ajax/member/getSubmitVideos' video_list = [] while True: response = requests.get(url, headers=headers, params=params) data = json.loads(response.text) vlist = data['data']['vlist'] if len(vlist) == 0: break for video in vlist: item = { 'title': video['title'], # 视频标题 'play': video['play'], # 播放数 'review': video['review'], # 弹幕数 'comment': video['comment'], # 评论数 'favorite': video['favorites'], # 收藏数 'coin': video['coins'], # 硬币数 'share': video['share'], # 分享数 'time': video['created'] # 发布时间 } video_list.append(item) params['page'] += 1 ``` 4. 将数据导出Excel文件中。 ``` workbook = xlwt.Workbook(encoding='utf-8') worksheet = workbook.add_sheet('Sheet1') row = 0 for item in video_list: worksheet.write(row, 0, item['title']) worksheet.write(row, 1, item['play']) worksheet.write(row, 2, item['review']) worksheet.write(row, 3, item['comment']) worksheet.write(row, 4, item['favorite']) worksheet.write(row, 5, item['coin']) worksheet.write(row, 6, item['share']) worksheet.write(row, 7, item['time']) row += 1 workbook.save('video_info.xls') ``` 完整代码如下: ### 回答2: 爬虫是一种通过自动化方式来获取网页信息的程序,它可以模拟人类浏览网页的行为,访问网页并提取所需的数据。哔哩哔哩是一个知名的在线视频网站,通过爬虫可以获取其网页上的各种信息。 首先,我们可以使用Python编写一个爬虫程序,使用爬虫框架如Scrapy或BeautifulSoup来获取哔哩哔哩网页上的数据。可以选择爬取视频的标题、观看次数、弹幕数量等信息。通过分析网页的HTML结构,可以编写代码来提取所需的数据。 然后,我们可以将获取到的数据进行处理。可以使用Python中的数据处理库如Pandas来进行数据清洗和整理。可以对数据进行筛选、去除重复项、填充缺失值等处理操作,使得数据更加规整。 最后,我们可以使用Python中的Excel处理库如Openpyxl或XlsxWriter来将处理后的数据导入到Excel中。可以创建一个新的Excel文件,或者将数据写入已有的Excel文件的指定工作表中。可以设置Excel中的单元格样式、格式等,使得数据在Excel中展示更为美观。 总之,我们可以通过编写爬虫程序来获取哔哩哔哩网站上的数据,并使用数据处理库对数据进行清洗和整理,最后使用Excel处理库将数据导入到Excel中,从而实现对哔哩哔哩数据的爬取和处理。 ### 回答3: 爬虫是一种程序,能够自动化地收集互联网上的数据。而哔哩哔哩是一个知名的视频分享平台,所以我们可以使用爬虫来收集并处理哔哩哔哩的数据,然后将其导入到Excel表格中。 首先,我们需要使用Python编写一个爬虫程序。我们可以使用第三方库如Requests和BeautifulSoup来获取和解析哔哩哔哩的网页内容。通过发送HTTP请求,我们可以获取到哔哩哔哩的页面数据。然后,我们可以使用BeautifulSoup库来解析网页的HTML结构,提取出我们需要的数据,如视频的标题、播放量、评论数等。 接下来,我们可以使用Pandas库来处理和转换数据。Pandas是一个强大的数据处理工具,我们可以使用它来将获取到的数据存储为一个数据框(DataFrame)的形式。通过Pandas,我们可以对数据进行清洗、过滤和转换等操作,使得数据变得更加规整和易于分析。 最后,我们可以使用Openpyxl库来将数据导入到Excel中。Openpyxl是一个用于读写Excel文件的库,它允许我们在Python中操作Excel表格。通过将数据框转换为Excel的工作表,我们可以将收集到的哔哩哔哩数据保存到Excel文件中,以便于后续的数据分析和可视化。 总之,利用爬虫爬取哔哩哔哩并处理数据导入Excel,可以帮助我们更好地分析和利用哔哩哔哩的数据资源。这不仅有助于我们了解用户行为和兴趣,还可以帮助企业做出更好的营销和业务决策。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值