html转微信公众号,通过htmlparse动态抓取微信公众号的文章

真的是很久没有更新我的博客了,刚开始,我还真的不知道爬虫是什么东西,但是由于项目需要,老板要我做个简单的爬虫,就是去人家的微信公众号去把里面的文章动态的抓取下来,当听到这个事情的时候,我是激动的,因为要我接触一个未知的领域,这是一个很值得装逼的是!!!!

好了屁话就不多逼逼了。首先呢,我是通过搜狗来找到微信公众号的,因为搜狗那边比较容易入手,可以绕过校验。但是我估计也是时日不长。在这之前,我们需要用到htmlparser这个类来操作,可以在maven里面配置:

a98cb2a0132862e75deca4c2cfdfedd4.png

也可以通过去下载jar包

我们现在抓取这个公众号:http://weixin.sogou.com/weixin?type=1&query=%E5%B0%9A%E6%B1%87%E5%9F%8E&ie=utf8&_sug_=n&_sug_type_=,然后用浏览器打开打开源代码来产看进入这个公众号文章的那个连接,然后进行分析:

2600610db6bc42a738e24094519f77a3.png

我们可以看到它的onclick事件之后是跳转到一个文章列表,所以我们要首先拿到那个连接,进入连接后是文章列表:

e92d6919a19f65ac7bdc1eaedfe64d70.png

接下来就像上一步一样打开源代码分析:每一篇文章都有一个连接,只要截取到这个连接即可:

894e1c778db352fc4b61ccc523e3e209.png

接下来就是点击其中一篇文章进去,然后在进行分析,可以看到文章的详情都有一个id = js_content的一个div,接下来就是根据这个id来获取文章内容

所有代码如下:

private List fetchArticles(String url) throws Exception {

List ats = new ArrayList();

String h1 = getHtml(url);

Parser parser = new Parser(h1, null);

NodeList nl = parser.extractAllNodesThatMatch(new NodeFilter() {

@Override

public boolean accept(Node node) {

// TODO Auto-generated method stub

if (node instanceof Div) {

Div shc = (Div) node;

String onclick = shc.getAttribute("onclick");

if (onclick != null && onclick.contains("gotourl(")) {

return true;

}

}

return false;

}

});

//获取文章列表

if (nl != null && nl.size() > 0) {

Div shc = (Div) nl.elementAt(0);

String urlL1 = shc.getAttribute("href");

if (StringUtil.isNotEmpty(urlL1)) {

urlL1 = decode(urlL1);

System.out.println("goto:" + urlL1);

String html = getHtml(urlL1);

if (StringUtil.isNotEmpty(html)) {

String[] arr = html.split("\\\\/s\\?timestamp=");

if (arr.length > 1) {

for (int i = 1; i < arr.length; i++) {

// for (int i = 1; i < 5; i++) {

String s2 = arr[i];

String[] arr3 = s2.split("","source_url");

if (arr3.length == 2) {

String urlL3 = ("http://mp.weixin.qq.com/s?timestamp=" + decode(arr3[0].trim()));

System.out.println("goto:" + urlL3);

//获取文章的详情

At at = getArticleByUrl(urlL3);

if (at != null) {

ats.add(at);

}

}

}

}

}

// System.out.println(arr.length);

}

}

return ats;

}

以下是上面方法调用到的方法:

//获取html源码

public static String getHtml(String url) {

try {

HttpClient httpclient = new HttpClient();

GetMethod method = new GetMethod(url);

httpclient.executeMethod(method);

return method.getResponseBodyAsString();

} catch(Exception ex) {

ex.printStackTrace();

}

return null;

}

获取文章详情方法:

@Override

public At getArticleByUrl(String url) {

// TODO Auto-generated method stub

String s3 = getHtml(url);

try {

Parser parser = new Parser(s3, null);

NodeList titles = parser.extractAllNodesThatMatch(new NodeFilter() {

@Override

public boolean accept(Node node) {

if (node instanceof TitleTag) {

return true;

}

return false;

}

});

if (titles != null && titles.size() > 0) {

String title = titles.elementAt(0).toPlainTextString();

At at = new At();

at.setTitle(title);

parser = new Parser(s3, null);

NodeList contents = parser.extractAllNodesThatMatch(new NodeFilter() {

@Override

public boolean accept(Node node) {

// TODO Auto-generated method stub

if (node instanceof Div && "js_content".equals(((Div) node).getAttribute("id"))) {

return true;

}

return false;

}

});

if (contents != null && contents.size() > 0) {

String body = contents.elementAt(0).toHtml();

at.setContent(body);

}

if(StringUtil.isNotEmpty(at.getContent())) {

parser = new Parser(at.getContent(), null);

NodeList imgs = parser.extractAllNodesThatMatch(new NodeFilter() {

@Override

public boolean accept(Node node) {

// TODO Auto-generated method stub

if (node instanceof ImageTag) {

return true;

}

return false;

}

});

if (imgs != null && imgs.size() > 0) {

int start = 0;

if(imgs.size() > 1) {

start = 1;

}

for(int i=start; i

ImageTag img = ((ImageTag)imgs.elementAt(i));

if(StringUtil.isNotEmpty(img.getAttribute("data-src"))) {

at.setThumb(img.getAttribute("data-src"));

break;

}

}

}

}

return at;

}

} catch(Exception ex) {

log.error(ex.getMessage(), ex);

}

return null;

}

有时候当点击那个公众号进去之后是一个验证页面:

5790af945b1c5a74b666fb22ce26cdb9.png

这个不要紧的,点多几次就可以了。

这是调用:

244cbe4881eb0800562046061a0f8561.png

要注意框框的那个代码,如果不要的话好像会不行,应该是因为tomcat里面不能直接翻译中文,所以要进行转码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
按DOM模型解析html文件的工具包 已下是源码列表: META-INF/MANIFEST.MF META-INF/maven/org.htmlparser/htmlparser/pom.properties META-INF/maven/org.htmlparser/htmlparser/pom.xml org.htmlparser.Parser.class org.htmlparser.PrototypicalNodeFactory.class org.htmlparser.beans.BeanyBaby.class org.htmlparser.beans.FilterBean.class org.htmlparser.beans.HTMLLinkBean.class org.htmlparser.beans.HTMLTextBean.class org.htmlparser.beans.LinkBean.class org.htmlparser.beans.StringBean.class org.htmlparser.filters.AndFilter.class org.htmlparser.filters.CssSelectorNodeFilter.class org.htmlparser.filters.HasAttributeFilter.class org.htmlparser.filters.HasChildFilter.class org.htmlparser.filters.HasParentFilter.class org.htmlparser.filters.HasSiblingFilter.class org.htmlparser.filters.IsEqualFilter.class org.htmlparser.filters.LinkRegexFilter.class org.htmlparser.filters.LinkStringFilter.class org.htmlparser.filters.NodeClassFilter.class org.htmlparser.filters.NotFilter.class org.htmlparser.filters.OrFilter.class org.htmlparser.filters.RegexFilter.class org.htmlparser.filters.StringFilter.class org.htmlparser.filters.TagNameFilter.class org.htmlparser.http.HttpHeader.class org.htmlparser.sax.Attributes.class org.htmlparser.sax.Feedback.class org.htmlparser.sax.Locator.class org.htmlparser.sax.XMLReader.class org.htmlparser.scanners.CompositeTagScanner.class org.htmlparser.scanners.JspScanner.class org.htmlparser.scanners.ScriptDecoder.class org.htmlparser.scanners.ScriptScanner.class org.htmlparser.scanners.StyleScanner.class org.htmlparser.tags.AppletTag.class org.htmlparser.tags.BaseHrefTag.class org.htmlparser.tags.BlockquoteTag.class org.htmlparser.tags.BodyTag.class org.htmlparser.tags.Bullet.class org.htmlparser.tags.BulletList.class org.htmlparser.tags.CompositeTag.class org.htmlparser.tags.DefinitionList.class org.htmlparser.tags.DefinitionListBullet.class org.htmlparser.tags.Div.class org.htmlparser.tags.DoctypeTag.class org.htmlparser.tags.FormTag.class org.htmlparser.tags.FrameSetTag.class org.htmlparser.tags.FrameTag.class org.htmlparser.tags.HeadTag.class org.htmlparser.tags.HeadingTag.class org.htmlparser.tags.Html.class org.htmlparser.tags.ImageTag.class org.htmlparser.tags.InputTag.class org.htmlparser.tags.JspTag.class org.htmlparser.tags.LabelTag.class org.htmlparser.tags.LinkTag.class org.htmlparser.tags.MetaTag.class org.htmlparser.tags.ObjectTag.class org.htmlparser.tags.OptionTag.class org.htmlparser.tags.ParagraphTag.class org.htmlparser.tags.ProcessingInstructionTag.class org.htmlparser.tags.ScriptTag.class org.htmlparser.tags.SelectTag.class org.htmlparser.tags.Span.class org.htmlparser.tags.StyleTag.class org.htmlparser.tags.TableColumn.class org.htmlparser.tags.TableHeader.class org.htmlparser.tags.TableRow.class org.htmlparser.tags.TableTag.class org.htmlparser.tags.TextareaTag.class org.htmlparser.tags.TitleTag.class org.htmlparser.util.CharacterReference.class org.htmlparser.util.CharacterReferenceEx.class org.htmlparser.util.DefaultParserFeedback.class org.htmlparser.util.FeedbackManager.class org.htmlparser.util.IteratorImpl.class org.htmlparser.util.NodeTreeWalker.class org.htmlparser.util.ParserFeedback.class org.htmlparser.util.ParserUtils.class org.htmlparser.util.Translate.class org.htmlparser.visitors.HtmlPage.class org.htmlparser.visitors.LinkFindingVisitor.class org.htmlparser.visitors.ObjectFindingVisitor.class org.htmlparser.visitors.StringFindingVisitor.class org.htmlparser.visitors.TagFindingVisitor.class org.htmlparser.visitors.TextExtractingVisitor.class org.htmlparser.visitors.UrlModifyingVisitor.class org/htmlparser/beans/images/Chain16.gif org/htmlparser/beans/images/Chain32.gif org/htmlparser/beans/images/Knot16.gif org/htmlparser/beans/images/Knot32.gif
在线HTML字符串是指将HTML代码换为纯文本字符串的过程。这在编程中经常用于将从网页中爬取的HTML数据处理为可读性更好、方便处理的纯文本格式。 在进行在线HTML字符串时,可以使用各种编程语言的库、框架或工具来实现。例如,使用Python的BeautifulSoup库、JavaScript的DOM解析器、PHP的HTMLParse库等工具可以帮助我们将HTML换为字符串。 一般来说,在线HTML字符串的步骤包括: 1. 获取HTML代码:可以通过网络请求获取网页源代码,或者将HTML代码作为输入参数传入程序中。 2. 解析HTML代码:使用相应的工具对HTML代码进行解析,将其换为可操作的数据结构,如DOM树或AST(抽象语法树)。 3. 提取文本内容:从解析后的HTML数据结构中提取出所需的文本内容,并进行必要的处理和清洗,例如去除标签、去除空格等。 4. 将文本内容为字符串:将处理后的文本内容换为字符串形式,即在线HTML字符串的最终结果。 需要注意的是,在进行HTML字符串的过程中,需要考虑HTML代码中可能存在的各种标签、属性和样式等各种复杂情况,以及特殊字符的处理。因此,对于不同的HTML结构和要求,可能需要在解析和提取文本内容的过程中做一些特殊处理和调整。 总之,在线HTML字符串是一项常用的数据处理任务,通过使用合适的工具和方法,可以将HTML代码换为更易于处理的纯文本格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值