java相关。爬虫问题,关于新浪微博。谢谢!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java相关。爬虫问题,关于新浪微博。谢谢!相关的知识,希望对你有一定的参考价值。
目标是新浪微博的某用户的相册模块中的某个具体的相册里面的图片,比如头像相册。之前的网页都爬下来了。但是到了具体的相册里面,居然在源码中找不到任何一张图片的位置和地址。
而且把源码复制到本地新建的html文件,双击打开,照片不显示。当且仅当从上级的相册名称那里点就去才显示,虽然源码一样。
请问,新浪相册是一种什么加载机制,该如何爬下图片?谢谢!
首先你用jsoup或者apache的httpclient爬到你能够爬到的那一层,即可以通过response传回的html静态页面可以知道下一步爬哪个连接的那一层。
然后到爬不动的那一层,比如你说图片动态加载,抓回的html上找不到图片的链接了,那么你在使用上述两个工具其中一个。
大致思路我絮叨的如上。然后说一下二者的异同。
————————————————————————————————
这两个你选用一个就好,不过爬虫用htmlunit就可以了。这俩都是做页面测试方面很好用的工具,不同于其它的工具是他们可以模拟一个浏览器引擎,通过这句话我想你就应该知道你给他一个地址他就可以像浏览器那样解析,既然如此浏览器本身应该知道解析后的html啊,所以就可以拿到了。不同点是selenuim会弹出一个框,后者后台静默的为你奉献。当然,出发点不同,前者更善于肉眼可见的模拟,都很好用,简单爬虫推荐用后者。又絮叨了一堆,好了,你对这两个工具有个了解了。下面附上一个htmlunit的demo,你就可以用了。
————————————————————————————————
新浪微博需要登录,所以你需要模拟登录过程,并保持一个登录后的WebClient对象,然后用它来访问那些动态生成的网页。
WebClient webClient = new WebClient();
HtmlPage page1 = webClient.getPage(登录的url);
HtmlForm form = page1.getFormByName("myform");
HtmlSubmitInput button = form.getInputByName("submitbutton");
HtmlTextInput textField = form.getInputByName("userid");
textField.setValueAttribute("root");
HtmlPage page2 = button.click();
好了,你已经可以做了。这个工具一定可以帮你完成你的功能需求。htmlunit的例子也很多,百度一下试试。 参考技术A 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中
2.java中的类大致分为三种:
1.系统类
2.扩展类
3.由程序员自定义的类
3.类装载方式,有两种
1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。
2.显式装载, 通过class.forname()等方法,显式加载需要的类
想必您肯定也上网查过,但是我想具体是什么机制,属于内部的机密了吧。毕竟网上查的到的话,那结果可想而知了。 参考技术B 你给那个不显示照片的链接看看.. 参考技术C 一
定向爬虫 - Python模拟新浪微博登录
- 写在前面
当我们试图从新浪微博抓取数据时,我们会发现网页上提示未登录,无法查看其他用户的信息.
模拟登录是定向爬虫制作中一个必须克服的问题,只有这样才能爬取到更多的内容.
实现微博登录的方法有很多,一般我们在模拟登录时首选WAP版.
因为PC版网页源码中包括很多的js代码,提交的内容也更多,不适合机器模拟登录.
我们实现微博登录的大体思路是这样的:
- 用抓包工具把正常登录时要提交的字段都记录下来.
- 模拟提交这些字段.
- 判断是否登录成功.
原理很简单,让我们一步一步来实现吧.
一.抓包利器Fiddler
在电脑和互联网之间的通信是通过不同的数据包收发来实现的。
Fiddler可以从中间对数据进行拦截,拷贝一份数据以后再将数据发送给目的端。(这也是为什么说咖啡馆的公共WIFI不安全的原因)
同类的还有WireShark。为何这儿不用WireShark呢?
Wireshark太过于专业了,它可以实现抓取各种包,抓下来的包也很乱,针对性没Fiddler那么强。
- 下载安装
1.下载地址:http://www.telerik.com/fiddler
2.安装方法:fiddler依赖.Net环境,如果已经有则无需配置,直接点击下一步就行.
- 使用方法
1.启动Fiddler
2.配置Fiddler
点击左上角的“ WinConfig”,找到你使用的浏览器并勾选,点击“Save Changes”
3.使用Fiddler开始抓包
打开浏览器访问WAP版新浪微博网站weibo.cn
Fiddler窗口左侧找到weibo.cn /pub/的数据包,并双击,这时我们就能够在右侧看到抓取到的信息.
找到Cookies字段,这正是我们需要的.
二.Cookies与保持登录
- 关于Cookies
维基百科是这样解释的:
Cookie(复数形态Cookies),中文名称为“小型文本文件”或“小甜饼”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密).
通俗来说就是服务器端为了确认用户终端的身份而设定的一种加密标识,它是存储在本地终端上的。
当然,随着Cookies技术的发展,Cookies的作用已经不止于用户身份标识。
当登陆一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。
如果勾选了,那么下次访问同一个网站时,用户会发现没输入用户名和密码就已经登录了。
这正是因为前一次登陆时服务器发送了包含登录凭据(用户名+密码的某种加密形式)的Cookie到用户的硬盘上。
第二次登录时,如果该Cookies尚未到期,浏览器会发送该Cookies,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。
三.Cookies模拟登录
下面将介绍使用 Fiddler 获取新浪微博 Cookies,然后使用 Requests 提交 Cookies 从而实现模拟登录。
- 抓取登录数据包
使用Fiddler抓取数据包.
- 获取Cookies
打开新浪微博WAP版页面(weibo.cn),点击登录,然后填写账号密码,勾选“记住登录状态”,切记要勾选此项.
登录成功后,从Fiddler中选择最新的那个weibo.cn,然后复制Cookies字段的内容,填写到代码内.
代码如下:
#coding=utf8
""" Simulate a user login to Sina Weibo with cookie.
You can use this method to visit any page that requires login.
"""
import urllib2
import re
cookie = ‘your-cookie‘ # get your cookie from Fiddler11
headers = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0‘,
‘cookie‘: cookie
}
def visit():
url = ‘http://weibo.com‘
req = urllib2.Request(url, headers=headers)
text = urllib2.urlopen(req).read()
# print the title, check if you login to weibo sucessfully
pat_title = re.compile(‘<title>(.+?)</title>‘)
r = pat_title.search(text)
if r:
print(r.group(1))
if __name__ == ‘__main__‘:
visit()
四.使用 Post 提交数据的方法实现模拟登录
由于使用Cookies登录存在很多的弊端,一般我们都使用Post提交数据的方法来实现模拟登录.
- 通过Fiddler来抓取http数据包来分析该网站的登录流程;
- 分析抓到的post包的数据结构和header,要根据提交的数据结构和heander来构造自己的post数据和header;
- 构造自己的HTTP数据包,并发送给指定url;
- 通过urllib2等几个模块提供的API来实现request请求的发送和相应的接收;
大部分网站登录时需要携带cookie,所以我们还必须设置cookie处理器来保证cookie.
代码如下:
import HTMLParser
import urlparse
import urllib
import urllib2
import cookielib
import string
import re
#登录的主页面
hosturl = ‘******‘ //自己填写
#post数据接收和处理的页面(我们要向这个页面发送我们构造的Post数据)
posturl = ‘******‘ //从数据包中分析出,处理post请求的url
#设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
#打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
h = urllib2.urlopen(hosturl)
#构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。
headers = {‘User-Agent‘ : ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1‘,
‘Referer‘ : ‘******‘}
#构造Post数据,他也是从抓大的包里分析得出的。
postData = {‘op‘ : ‘dmlogin‘,
‘f‘ : ‘st‘,
‘user‘ : ‘******‘, //你的用户名
‘pass‘ : ‘******‘, //你的密码,密码可能是明文传输也可能是密文,如果是密文需要调用相应的加密算法加密
‘rmbr‘ : ‘true‘, //特有数据,不同网站可能不同
‘tmp‘ : ‘0.7306424454308195‘ //特有数据,不同网站可能不同
}
#需要给Post数据编码
postData = urllib.urlencode(postData)
#通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成登录过程
request = urllib2.Request(posturl, postData, headers)
print request
response = urllib2.urlopen(request)
text = response.read()
print text
转载请注明:http://www.cnblogs.com/crazyacking/p/5230196.html
以上是关于java相关。爬虫问题,关于新浪微博。谢谢!的主要内容,如果未能解决你的问题,请参考以下文章