新浪微博爬虫v1.0

                 心血来潮想看看自己这几年都去过什么地方,因为我的动态信息基本上都发布在微博上面的,上面也记录了地址,我查看了一下,即使定位名称显示的笼统,但是定位了的都有较详细的经纬度。于是就想做个爬虫,把数据搞下来,然后弄到地图上看看。因为工作基本上都在做Java,所以爬虫也用Java写了,等把爬虫写完善一点,再去试试别的语言吧。

                 以下是爬虫采集程序,项目在我的GitHub上:https://github.com/callELPSYCONGROO/WeiboCrawler


一、 模拟登录

a)  登录分为几个步骤:

     1)获取登录请求地址及登录参数名称
      这里是通过http://weibo.cn/pub/手机版微博登录URL,获取到登录地址。获取到登录页面之后,下载验证码,保存到本地。
     2)发送登录请求
      通过登录页面获取到的登录地址及参数,发送到https://login.weibo.cn/login/,请求登录。

b) 这里使用了ApacheHttpComponents,主要使用了其中的几个类:

i. HttpClient,这个类作用就相当于是客户端,创建一个客户端之后,执行其execute方法,向服务器发送请求。

ii. HttpGet/HttpPost,这两个类是模拟Get/Post请求。

iii. HttpEntity,这个类储存请求/相应所需参数。

c) 处理HTML格式数据,使用的是Jsoup,处理起来挺方便的。

 

二、 跳转到需要查询的页面

a) 我的微博地址是:http://weibo.cn/2959779932/profile?vt=4(随便找的一个微博账号),中间的数字因账号而异,可从登录之后的页面中抽取,想要爬取固定组的微博账号,可以新建一个分组,从分组页面中获得索要爬取的账号的微博首页。

b) 登录一个账号之后,查询其他账号(非登录的账号),地址是:http://weibo.cn/u/2787081310?vt=4,若该帐号设置了个性域名,则地址为:http://weibo.cn/maemiiiiii?vt=4,后面的“maemiiiiii”即为用户自己设置的域名。

 

三、 爬取微博

a) 得到微博页面以后,每条微博都是由一个带id属性的<div>标签所包括,取到这个标签,就可以提取对应的信息了。

b) 由于手机版的微博每次只显示一张图片,而且是一张缩略图,想要获得微博原图,需要进入“查看原图”去下载。


四、 数据库

a)  数据库使用的是Mysql5.7,这里因为微博正文里面会有emoji表情符,往数据库中存的时候会报错,所以,创建数据库及表的时候,将字符集设置为utf8mb4格式,这种格式兼容emoji。


五、 下载图片

 

六、 存在问题

a) 没有判断访问的页面是否为正确的页面。不知道用什么方法去判断是我访问的那个页面。假如要访问http://sina.com/pub这个页面,但是却访问到了http://sina.com/asd,两个页面都不会返回404之类的,如何去判断呢?只能严格检查访问的URL

b) 基于问题a),用户名和密码必须填写正确,否则爬取结果不正确。

c)    有一个字符串问题比较疑惑,获取到的微博发布时间格式并不都是yyyy-MM-dd HH:mm:ss,还有这种MM月dd日 HH:

 
  

System.out.println("***"+"01-05 20:15 ".trim()+"****");
String d = "01-05 20:15 ".trim() + " ";
System.out.println("***"+d+"****");
d = d.substring(0, d.lastIndexOf(" "));
System.out.println("***"+d+"****");

这里打印输出为:

 
  

***01-05 20:15 ****
***01-05 20:15 ****
***01-05 20:15****

             字符串 d 最后的一个空格,并未被trim()去掉,导致若用这个字符串转换成Date类型的话会报ParseException类型异常。使用d = d.substring(0, d.lastIndexOf(" "));这句在测试的时候可行(把尾部空格去掉),但是从页面获取到之后的字符串使用这个方法却去不掉空格。

            所以后来将字符串String转换为Date类型使用的方法都是:

 
  

String s = "2017-01-05 20:15 ";
Date d = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(s);
System.out.println("***"+d+"***");
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d));

            我猜测,trim()去不掉空格的原因是因为获取到的字符串最后一个看上去像空格的字符应该是个占位符什么的,现在的trim()方法(我使用的是JDK1.6)里面没有去掉那种格式符号的东西,所以才导致去不掉。(希望有人看到能帮我解惑)


猜你喜欢

转载自blog.csdn.net/qq_20112609/article/details/65440584