我在实现抓取关键字搜索结果的时候确实遇到的验证码识别问题很蛋疼,一开始本来想破解验证码,后来查了资料发现,这个很难;就像实现手动填写验证码。
网上提供手动填写验证码的基本实现思路是:
1. 请求获取图片。
2. 保存图片至本地。
3. 打开图片。
4.手动填写验证码,模拟请求验证码识别验证。
后来看了别人的blog发现一个更简单暴力的方法,就是开浏览器填写验证码。
//打开浏览器,手动输入验证码
Desktop desktop = Desktop.getDesktop();
if (Desktop.isDesktopSupported()&& desktop.isSupported(Desktop.Action.BROWSE)) {
URI uri = new URI(searchUrl);
desktop.browse(uri);
}
这个方法虽然解决了验证码识别问题,但是需要人工反复填写验证码;抓取效率不高;只适合临时数据采集。
既然这个方法效率不高,那有没有其他实现办法呢!答案是有的,我们可以尝试抓取手机端新浪微博内容。
但是抓取手机端新浪微博的时候要注意额!抓取过于频繁ip可能会被封,一定要注意抓取时间间隔。代码如下:(其中的工具类代码就不贴了)
public void keyWordsSearch(String keyword){
try {
String searchHomeUrl = "http://weibo.cn/search/?tf=5_012&vt=4";
HtmlPage searchHomePage = client.getPage(searchHomeUrl);
//搜索表单
HtmlForm searchForm = searchHomePage.getForms().get(0);
HtmlTextInput keywordField = searchForm.getInputByName("keyword");
HtmlSubmitInput searchBlogField = searchForm.getInputByName("smblog");
//模拟设值搜索框操作
keywordField.click();
keywordField.setValueAttribute(keyword);
keywordField.blur();
//模拟设值搜索微博按钮操作
HtmlPage nowPage = searchBlogField.click();
// System.out.println(nowPage.asText());
HtmlPage nextPage = null;
HtmlAnchor nextAnchor = null;
for(int i=0; i<100; i++){
// System.out.println("第"+(i+1)+"页");
// System.out.println(nowPage.asText());
String responseContent = nowPage.getWebResponse().getContentAsString();
HtmlCleaner cleaner = new HtmlCleaner();
TagNode rootNode = cleaner.clean(responseContent);
Object[] cDivNodes