吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15286|回复: 70
收起左侧

[其他原创] 【原创源码】网络爬虫

  [复制链接]
曾Jing最美 发表于 2015-12-4 10:12
本帖最后由 奋斗丶小Z 于 2015-12-4 12:42 编辑

最近由于女朋友工作需求,需要获取各大团购网站上的商家信息,这样手动一个一个点不得累死,于是我就写了一个网络爬虫来解决这个问题,是用java写的,主要用到了两个开源库,httpclient和jsoup...用来获取网页数据和得到想要的数据,不过最好是有点web基础,这样就可以只要想要的值,不然会有好多没用的数据,后期还要手动删除,比较麻烦...下面附上源码和说明...
[Asm] 纯文本查看 复制代码
public static String getHtmlByUrl(String url){  
        String html = null;  
       
                HttpClient httpClient = new DefaultHttpClient();//创建httpClient对象  
        HttpGet httpget = new HttpGet(url);//以get方式请求该URL  
        try {  
            HttpResponse responce = httpClient.execute(httpget);//得到responce对象  
            int resStatu = responce.getStatusLine().getStatusCode();//返回码  
            if (resStatu==HttpStatus.SC_OK) {//200正常  其他就不对  
                //获得相应实体  
                HttpEntity entity = responce.getEntity();  
                if (entity!=null) {  
                    //html = EntityUtils.toString(entity);//获得html源代码
                        
                    InputStream in = entity.getContent();
                    entity.getContentType();
                    Scanner sc = new Scanner(in);
                    StringBuffer str = new StringBuffer("utf-8");
                    while(sc.hasNextLine()){
                            str.append(sc.nextLine());
                    }
                    html = str.toString();
                    //sc.close();
                }  
            }  
        } catch (Exception e) {  
            System.out.println("访问【"+url+"】出现异常!");
            e.printStackTrace();  
        } finally {  
            httpClient.getConnectionManager().shutdown();
        }  
        
        return html;  
    }  

上面的就是httpclient库的内容,用它来获取html页面的数据


[Java] 纯文本查看 复制代码
public static void main(String[] args) throws WriteException, IOException {  
                String html = getHtmlByUrl("需要获取数据的网址"); 
                if (html!=null&&!"".equals(html)) {  
                    Document doc = Jsoup.parse(html);  
                    Elements linksElements = doc.select("div.basic>a"); //如果有web基础的话,可以设置一下这里,知道自己想要的数据
                     
                    for (Element ele:linksElements) {  
                        String href = ele.attr("href");  
                        String title = ele.text();  
                        System.out.println(href+","+title);  
                    }  
                } 
    }  


这个就是解析获取来的html数据,找到自己想要的数据....
然后把取到的数据存入excel获取txt里就随大家便了,不过这个方法有一个漏洞就是,只能取静态页面,动态页面无法实现,我还要再继续研究一下,研究出来了,再发出来,如果有什么不懂的,可以问我,知道的一定告诉大家,希望大家多评分,多鼓励,非常感谢!!!!

点评

【【【感谢发布原创作品】】】  发表于 2015-12-4 20:48

免费评分

参与人数 21吾爱币 +1 热心值 +20 收起 理由
zhangzhaoshuai + 1 热心回复!
jzdzdn + 1 谢谢@Thanks!
kenmin + 1 谢谢@Thanks!
kyosnow + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
POH + 1 谢谢@Thanks!
应聘上门女婿 + 1 鼓励转贴优秀软件安全工具和文档!
飘零的殇 + 1 谢谢@Thanks!
大大怪 + 1 会Java的都是大牛
双木 + 1 【【【感谢发布原创作品】】】
零下274度 + 1 谢谢@Thanks!
阿萨德22 + 1 热心回复!
酶心酶肺 + 1 不懂也可以问我啊,python爬虫,基本都可以.
小小欣 + 1 666666 虽然我没什么用 但还是支持
youyudewo99 + 1 鼓励转贴优秀软件安全工具和文档!
逝走青春 + 1 已答复!
tflyr + 1 话说你真的有女朋友么
ppszxc + 1 谢谢@Thanks!
king82 + 1 鼓励转贴优秀软件安全工具和文档!
Poison丶biting + 1 求整个项目源码
anywhere + 1 鼓励转贴优秀软件安全工具和文档!
红枫叶 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

狄安娜 发表于 2015-12-4 20:27
看到有人写爬虫滚进来了。
首先按作者说的 鼓励一下。
然后我要开始说重点了。

1.你参考了百度或者是httpclient API介绍的代码,但是httpclient 在4.5.1 和3.1的中间是有一个较大变化的版本的(我写两次爬虫 间隔1年左右。发现的)
你没有注意到,所以后面有人下了httpclient的包 但还是找不到。
因为版本的原因方法名和使用方式变了。(下面有部分关键代码 注意区别
4.5.1的写法:
DefaultHttpClient httpclient = new DefaultHttpClient(); //实例化 相当于打开浏览器
httpget=new HttpGet("http://**********.com"); //创建连接
response=httpclient.execute(httpget);//提交
entity = response.getEntity();//获得内容放入实体中 (新版本的概念)
printEntity(entity);//这里是自定义的方法,里边还有处理中文的问题 提示:System.out.println(new String(a, "UTF-8")) 这里影响接收的字符,提交到服务器的字符处理下面再说
httpget.abort();//释放连接(很重要!)

旧版本写法:
HttpClient client = new HttpClient(connectionManager); //实例化 相当于打开浏览器
GetMethod get = new  GetMethod("http://**********.com");  //设置获取方式
client.executeMethod(get); //提交
String responseString = get.getResponseBodyAsString();//获得返回流
System.out.println(responseString);//输出网页内容
get.releaseConnection();   //释放连接(很重要!)

2.LZ的爬虫是获取网页信息,只是简单查询或者浏览指定页面。那么大多数网页用GET方式即可,这是
但是!200正常  其他就不对  这种说法不正确。如果出现302跳转怎么办?
这个是爬虫需要处理的。

3.中文编码的问题。使用GET方式提交访问网页URL最保险的做法
提示:URLEncoder.encode("字符串","UTF-8")
比如你在百度搜索:utf-8编码
在URL里GET的内容会被转换成utf-8%E7%BC%96%E7%A0%81
就是为了避免中文 韩文这些语言的乱码(影响服务器收到的内容)

4.验证码,多线程提高效率。POST查询(一部分动态页面)

5.讨论一下,共勉。但,神啊,啥时候才能有个妹子呢。

免费评分

参与人数 1热心值 +1 收起 理由
双木 + 1 我很赞同!

查看全部评分

anywhere 发表于 2015-12-4 10:17
 楼主| 曾Jing最美 发表于 2015-12-4 11:01
我还是统一发一下源码吧,我的源码里还有一个方法是把取到的数据写如excel,大家根据自己的需求改一下吧

[Java] 纯文本查看 复制代码
public class JustTest {

	
	public static void main(String[] args) throws WriteException, IOException {  
        
		
	        String html = getHtmlByUrl("http://hrb.meituan.com/category/meishi/pingfangqu?mtt=1.index%2Fdefault%2Fpoi.0.0.ihlo3zbw");  
	        String[][] arr = new String[1024][2];
	        if (html!=null&&!"".equals(html)) {  
	            Document doc = Jsoup.parse(html);  
	            Elements linksElements = doc.select("div.basic>a");  
	            int i=0;
	            for (Element ele:linksElements) {  
	                String href = ele.attr("href");  
	                String title = ele.text();  
	                System.out.println(href+","+title);
			arr[i][0] = href;
			arr[i][1] = title;
	            }  
	        } 
		createExcel(arr); 
	     
    }  
	
	
	
	
	
	public static String getHtmlByUrl(String url){  
        String html = null;  
       
		HttpClient httpClient = new DefaultHttpClient();//创建httpClient对象  
        HttpGet httpget = new HttpGet(url);//以get方式请求该URL  
        try {  
            HttpResponse responce = httpClient.execute(httpget);//得到responce对象  
            int resStatu = responce.getStatusLine().getStatusCode();//返回码  
            if (resStatu==HttpStatus.SC_OK) {//200正常  其他就不对  
                //获得相应实体  
                HttpEntity entity = responce.getEntity();  
                if (entity!=null) {  
                    //html = EntityUtils.toString(entity);//获得html源代码
                	
                    InputStream in = entity.getContent();
                    entity.getContentType();
                    Scanner sc = new Scanner(in);
                    StringBuffer str = new StringBuffer("utf-8");
                    while(sc.hasNextLine()){
                    	str.append(sc.nextLine());
                    }
                    html = str.toString();
                    //sc.close();
                }  
            }  
        } catch (Exception e) {  
            System.out.println("访问【"+url+"】出现异常!");
            e.printStackTrace();  
        } finally {  
            httpClient.getConnectionManager().shutdown();
        }  
        
        return html;  
    }  
	
	public static void createExcel(String[][] allArray) throws WriteException,IOException{
        //创建工作薄
        WritableWorkbook workbook = Workbook.createWorkbook(new File("D://excel.xls"));
        //创建新的一页
        WritableSheet sheet = workbook.createSheet("First Sheet",0);
        //创建要显示的内容,创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容
        
        Label xuhao = new Label(0,0,"商户名称");
        sheet.addCell(title);
        Label shopname = new Label(1,0,"商户链接");
        sheet.addCell(href);
  
        
        for(int i=0;i<allArray.length;i++){
        	for(int j=0;j<2;j++){
                Label oneInfo = new Label(j+1,i+1,allArray[i][j]);
                sheet.addCell(oneInfo);
        	}
        }
        //把创建的内容写入到输出流中,并关闭输出流
        workbook.write();
        workbook.close();
    }
}
红枫叶 发表于 2015-12-4 10:16
支持优秀作品
1643111374 发表于 2015-12-4 10:19
有这样的男朋友也是极大的方便
 楼主| 曾Jing最美 发表于 2015-12-4 10:20
anywhere 发表于 2015-12-4 10:17
楼主真会开玩笑,程序员哪来的女朋友!

我还真有
 楼主| 曾Jing最美 发表于 2015-12-4 10:21
1643111374 发表于 2015-12-4 10:19
有这样的男朋友也是极大的方便

技术就是这么回事,可以节省很多的时间和体力
Poison丶biting 发表于 2015-12-4 10:21
求整个项目源码
 楼主| 曾Jing最美 发表于 2015-12-4 10:22

其实这个东西很简单,一共就三个方法,已经发两个了,还有一个是把取到的数据写入excel,如果需要私信我,可以发给你
Poison丶biting 发表于 2015-12-4 10:24
曾Jing最美 发表于 2015-12-4 10:22
其实这个东西很简单,一共就三个方法,已经发两个了,还有一个是把取到的数据写入excel,如果需要私信我 ...

发给我下
 楼主| 曾Jing最美 发表于 2015-12-4 10:31

私信给你了,查收
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-4 13:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表