使用Jersey、Tomcat和Java解析网站-编码问题



我的目标是:给定一个预定义的顶级域和一个通用搜索URL,并将附加的输入查询作为参数传递,下载所述网站的源代码并在浏览器中显示。

最终,我将使用各种解析技术(子字符串、lol)来提取和整理JaxWS+POJO中的数据,但我需要看到原始HTML输出,才能知道我的程序正确理解其编码。

我已经从响应返回变成了简单的字符串返回,因为我得到了胡言乱语的编码。我尝试过设置1000种不同的编码方式,但这似乎无关紧要。

注意:我还使用了其他方法来整理数据等,但我已经将问题归结为两种麻烦的方法。

public List<String> DownloadResultSource(URL url)
{
    List<String> source = new ArrayList<String>();
    BufferedReader br;
    String curLine = null;
    try
    {
        br = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
        while((curLine = br.readLine()) != null)
        {
            source.add(curLine);
        }
        return source;
    }
    catch(Exception ex)
    {
        return null;
    }
}

@GET
@Path("/{parameter}")
//@Produces(MediaType.TEXT_HTML + ";charset=utf-8")
public String searchSites(@PathParam("parameter") String parameter,
        @DefaultValue("") @QueryParam("query") String query)
{           
        //crawl website with specified query
        Crawler crawler = new Crawler();
        //DEBUG
        Host host = hostEnum.STACKOVERFLOW.getHost();
        try
        {
            List<String> source = crawler.DownloadResultSource(new URL(host.getTopLevelDomain() + host.getDefaultSearch(query)));
            StringBuilder sb = new StringBuilder();
            sb.append(new URL(host.getTopLevelDomain() + host.getDefaultSearch(query)));
            for(String line : source)
            {
                sb.append(line);
            }
            return sb.toString();
            //return Response.status(Response.Status.OK).entity(sb.toString()).build();
        } 
        catch (Exception ex)
        {
            return ex.toString();
        }
        // end DEBUG
        // ORIGINAL return marshalResponse(crawler.SearchHost(hostEnum.STACKOVERFLOW, query));
    }
    return null;
}

就像我说的那样,我得到的是胡言乱语的输出,减去我附加的原始URL的行(sb.append(新URL…).

下面的回复示例。请记住,当前是String,而不是Response return,尽管Response。。。。。build()产生相同的结果:

https://stackoverflow.com/search?q=my+搜索+查询��}yw�H��������n’�b_�9BKw��t����y�����$#Py��|��VHh9�[��AQw��������o�[�~�A.�d��==!t3����6L��q�q} }��|�我��R��/:��IT#Oa�={����'6英寸或����:����A.�]��q9��i-

潜在的曲球:我正在通过Eclipse在Windows上进行开发,尽管Tomcat服务器位于Ubuntu服务器上,但我使用HTML管理器来升级代码。也许Ubuntu上缺少UTF-8支持?我不这么认为,但我已经无计可施了。

编辑-更多信息:该项目是一个Maven项目,这里是Pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>my package</groupId>
  <artifactId>my project</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.9</version>
    </dependency>
  </dependencies>
</project>

My Web.xml指定UTF-8,因此:<?xml version="1.0" encoding="UTF-8"?>

我找到的解决方案不是我想要的,而是网站负责发回胡言乱语。我尝试了一个类似的网站,它按预期返回了源代码。

再多的指定cookie或用户代理也不会改变我在第一个网站上的结果,所以我得出的结论是,这是爬虫故意混淆数据。

最新更新