日常爬虫过程中我们对于爬取到的网页数据需要进行解析,因为大多数数据是不需要的,所以我们需要进行数据解析,常用的数据解析方式有正则表达式,xpath,bs4。今天我们重点来了解一下什么是json。欢迎收藏学习,喜欢点赞支持。
json(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。json模块提供了四个功能:dumps、dump、loads、load,用于字符串 和 python数据类型间进行转换。
在日常执行爬虫项目的过程中,有时返回的不是一个html页面而是json格式数据,此时对数据的解析非常重要比,比如以下2种方式:
1.Json格式数据的爬取,采用request对以上的url进行爬取,在爬取的过程中,考虑到需要模拟真实的用户,因此需要添加cookie或者header参数。

import  requests

content=requests.get(url,headers=headers).content

2.对爬取的json格式数据的解析,数据已经爬取下来,存放在contend里面,接下来就是对数据的处理,这种可以在 www.bejson.com,对于这个数据的解析可以采用采用正则表达式解析,使用正则提取title字段、

import re

project = re.findall(r'"title":(.*?),', content)

实际项目案例测试,我们以爬取淘票票官网最近比较火的电影为例使用Java和爬虫代理IP,通过Jackson库解析stream流式JSON数据的示例代码,实现代码有亿牛云提供、

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.InputStream;

public class StreamJsonParserExample {

    public static void main(String[] args) throws IOException {
        // 亿牛云(动态转发隧道代理) 爬虫代理加强版  代理服务器和端口
        HttpHost proxy = new HttpHost("www.16yun.cn", 8080);
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        // 亿牛云(动态转发隧道代理) 爬虫代理加强版 用户名和密码
        credentialsProvider.setCredentials(
                new AuthScope(proxy.getHostName(), proxy.getPort()),
                new UsernamePasswordCredentials("16YUN", "16IP"));

        // 创建HTTP客户端
        CloseableHttpClient httpClient = HttpClientBuilder.create()
                .setProxy(proxy)
                .setDefaultCredentialsProvider(credentialsProvider)
                .build();

        // 创建HTTP请求
        HttpGet httpGet = new HttpGet("http://example.com/stream.json");

        // 执行HTTP请求
        CloseableHttpResponse response = httpClient.execute(httpGet, HttpClientContext.create());

        // 获取HTTP响应的输入流
        InputStream inputStream = response.getEntity().getContent();

        // 创建Jackson解析器
        JsonFactory jsonFactory = new JsonFactory();
        JsonParser jsonParser = jsonFactory.createParser(inputStream);
        ObjectMapper objectMapper = new ObjectMapper();

        // 逐个解析JSON对象
        while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
            if (jsonParser.currentToken() == JsonToken.FIELD_NAME && "name".equals(jsonParser.getCurrentName())) {
                jsonParser.nextToken();
                String name = objectMapper.readValue(jsonParser, String.class);
                System.out.println("Name: " + name);
            }
            // 解析其他字段
        }

        // 关闭HTTP响应和输入流
        EntityUtils.consume(response.getEntity());
        inputStream.close();
    }
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐