开源爬虫框架各有什么优缺点?
首先爬虫框架有三种
分布式爬虫:Nutch
JAVA单机爬虫:Crawler4j,WebMagic,WebCollector
非JAVA单机爬虫:scrapy
第一类:分布式爬虫
优点:
海量URL管理
网速快
缺点:
Nutch是为搜索引擎设计的爬虫,大多数用户是需要一个做精准数据爬取(精抽取)的爬虫。Nutch运行的一套流程里,有三分之二是为了搜索引擎而设计的。对精抽取没有太大的意义。
用Nutch做数据抽取,会浪费很多的时间在不必要的计算上。而且如果你试图通过对Nutch进行二次开发,来使得它适用于精抽取的业务,基本上就要破坏Nutch的框架,把Nutch改的面目全非。
Nutch依赖hadoop运行,hadoop本身会消耗很多的时间。如果集群机器数量较少,爬取速度反而不如单机爬虫。
Nutch虽然有一套插件机制,而且作为亮点宣传。可以看到一些开源的Nutch插件,提供精抽取的功能。但是开发过Nutch插件的人都知道,Nutch的插件系统有多蹩脚。利用反射的机制来加载和调用插件,使得程序的编写和调试都变得异常困难,更别说在上面开发一套复杂的精抽取系统了。
Nutch并没有为精抽取提供相应的插件挂载点。Nutch的插件有只有五六个挂载点,而这五六个挂载点都是为了搜索引擎服务的,并没有为精抽取提供挂载点。大多数Nutch的精抽取插件,都是挂载在“页面解析”(parser)这个挂载点的,这个挂载点其实是为了解析链接(为后续爬取提供URL),以及为搜索引擎提供一些易抽取的网页信息(网页的meta信息、text)
用Nutch进行爬虫的二次开发,爬虫的编写和调试所需的时间,往往是单机爬虫所需的十倍时间不止。了解Nutch源码的学习成本很高,何况是要让一个团队的人都读懂Nutch源码。调试过程中会出现除程序本身之外的各种问题(hadoop的问题、hbase的问题)。
Nutch2的版本目前并不适合开发。官方现在稳定的Nutch版本是nutch2.2.1,但是这个版本绑定了gora-0.3。Nutch2.3之前、Nutch2.2.1之后的一个版本,这个版本在官方的SVN中不断更新。而且非常不稳定(一直在修改)。
第二类:JAVA单机爬虫
优点:
支持多线程。
支持代理。
能过滤重复URL的。
负责遍历网站和下载页面。爬js生成的信息和网页信息抽取模块有关,往往需要通过模拟浏览器(htmlunit,selenium)来完成。
缺点:
设计模式对软件开发没有指导性作用。用设计模式来设计爬虫,只会使得爬虫的设计更加臃肿。
第三类:非JAVA单机爬虫
优点:
先说python爬虫,python可以用30行代码,完成JAVA
50行代码干的任务。python写代码的确快,但是在调试代码的阶段,python代码的调试往往会耗费远远多于编码阶段省下的时间。
使用python开发,要保证程序的正确性和稳定性,就需要写更多的测试模块。当然如果爬取规模不大、爬取业务不复杂,使用scrapy这种爬虫也是蛮不错的,可以轻松完成爬取任务。
缺点:
bug较多,不稳定。
爬虫可以爬取ajax信息么?
网页上有一些异步加载的数据,爬取这些数据有两种方法:使用模拟浏览器(问题1中描述过了),或者分析ajax的http请求,自己生成ajax请求的url,获取返回的数据。如果是自己生成ajax请求,使用开源爬虫的意义在哪里?其实是要用开源爬虫的线程池和URL管理功能(比如断点爬取)。
如果我已经可以生成我所需要的ajax请求(列表),如何用这些爬虫来对这些请求进行爬取?
爬虫往往都是设计成广度遍历或者深度遍历的模式,去遍历静态或者动态页面。爬取ajax信息属于deepweb(深网)的范畴,虽然大多数爬虫都不直接支持。但是也可以通过一些方法来完成。比如WebCollector使用广度遍历来遍历网站。爬虫的第一轮爬取就是爬取种子集合(seeds)中的所有url。简单来说,就是将生成的ajax请求作为种子,放入爬虫。用爬虫对这些种子,进行深度为1的广度遍历(默认就是广度遍历)。
爬虫怎么爬取要登陆的网站?
这些开源爬虫都支持在爬取时指定cookies,模拟登陆主要是靠cookies。至于cookies怎么获取,不是爬虫管的事情。你可以手动获取、用http请求模拟登陆或者用模拟浏览器自动登陆获取cookie。
爬虫怎么抽取网页的信息?
开源爬虫一般都会集成网页抽取工具。主要支持两种规范:CSSSELECTOR和XPATH。
网页可以调用爬虫么?
爬虫的调用是在Web的服务端调用的,平时怎么用就怎么用,这些爬虫都可以使用。
爬虫速度怎么样?
单机开源爬虫的速度,基本都可以讲本机的网速用到极限。爬虫的速度慢,往往是因为用户把线程数开少了、网速慢,或者在数据持久化时,和数据库的交互速度慢。而这些东西,往往都是用户的机器和二次开发的代码决定的。这些开源爬虫的速度,都很可以。
java爬虫 登陆qun.qq.com 然后获取登录后的页面 求实现代码 真的万分感谢
推荐大家使用神箭手云爬虫写爬虫,完全在云上编写和执行爬虫,不需要配置任何开发环境,快速开发快速实现。
简单几行
javascript
就可以实现复杂的爬虫,同时提供很多功能函数:反反爬虫、
js
渲染、数据发布、图表分析、反防盗链等,这些在开发爬虫过程中经常会遇到的问题都由神箭手帮你解决。
神箭手上有开发者文档,详细说明了如何编写爬虫脚本,还有很多网站的源码分享哦。
java 爬虫登陆网页
最简单的办法就是 在论坛页面审查元素,找到登录按钮,找到他的action,把它传到你的程序里面就好了,比如我现在回答你的问题,下面的提交回答按钮也会有一个action
python爬虫模拟登录是什么意思
有些网站需要登录后才能爬取所需要的信息,此时可以设计爬虫进行模拟登录,原理是利用浏览器cookie。
一、浏览器访问服务器的过程:
(1)浏览器(客户端)向Web服务器发出一个HTTP请求(Http request);
(2)Web服务器收到请求,发回响应信息(Http Response);
(3)浏览器解析内容呈现给用户。
二、利用Fiddler查看浏览器行为信息:
Http请求消息:
(1)起始行:包括请求方法、请求的资源、HTTP协议的版本号
这里GET请求没有消息主体,因此消息头后的空白行中没有其他数据。
(2)消息头:包含各种属性
(3)消息头结束后的空白行
(4)可选的消息体:包含数据
Http响应消息:
(1)起始行:包括HTTP协议版本,http状态码和状态
(2)消息头:包含各种属性
(3)消息体:包含数据
从上面可见,cookie在Http请求和Http响应的头消息中是很重要的属性。
三、什么是cookie:
当用户通过浏览器首次访问一个域名时,访问的Web服务器会给客户端发送数据,以保持Web服务器与客户端之间的状态,这些数据就是Cookie。
它是站点创建的,为了辨别用户身份而储存在用户本地终端上的数据,其中的信息一般都是经过加密的,存在缓存或硬盘中,在硬盘中是一些小文本文件。
当访问该网站时,就会读取对应网站的Cookie信息。
作用:记录不同用户的访问状态。
四、操作过程:
在知乎登录界面输入用户名和密码,然后登录。
利用Fiddler来查看这期间浏览器和知乎服务器之间的信息交互。
(1)浏览器给服务器发送了一个POST,携带帐号和密码等信息;
从起始行可见,POST是发送给这个网址,内容在最下面消息体里,
也可以在Fiddler的Webforms标签下查看POST的内容,如下:
可以发现,信息里不仅有帐号(email)和密码(password),其实还有_xsrf(具体作用往后看)和remember_me(登录界面的“记住我”)两个值。
那么,在python爬虫中将这些信息同样发送,就可以模拟登录。
在发送的信息里出现了一个项:_xsrf,值为2fc4ab0f0f144c2e478c436fe3160443
这个项其实是在访问知乎登录网页时,网页发送过来的信息,在浏览器源码中可见:
所以需要先从登录网址获取这个_xsrf的值,
并连同帐号、密码等信息再POST到真正接收请求的网址。
(2)获取_xsrf的值:
爬取登录网址,从内容中获取_xsrf的值。
正则表达式。
(3)发送请求:
xsrf = 获取的_xsrf的值
data = {“email”:”xxx”,”password”:”xxx”,”_xsrf”:xsrf}
login = s.post(loginURL, data = data, headers = headers)
loginURL:是真正POST到的网址,不一定等同于登录页面的网址;
(4)爬取登录后的网页:
response = s.get(getURL, cookies = login.cookies, headers = headers)
getURL:要爬取的登陆后的网页;
login.cookies:登陆时获取的cookie信息,存储在login中。
(5)输出内容:
print response.content
五、具体代码:
[python] view plain copy
# -*- coding:utf-8 -*-
# author:Simon
# updatetime:2016年3月17日 17:35:35
# 功能:爬虫之模拟登录,urllib和requests都用了…
import urllib
import urllib2
import requests
import re
headers = {‘User-Agent’:’Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11′}
def get_xsrf():
firstURL = “”
request = urllib2.Request(firstURL,headers = headers)
response = urllib2.urlopen(request)
content = response.read()
pattern = re.compile(r’name=”_xsrf” value=”(.*?)”/’,re.S)
_xsrf = re.findall(pattern,content)
return _xsrf[0]
def login(par1):
s = requests.session()
afterURL = “” # 想要爬取的登录后的页面
loginURL = “” # POST发送到的网址
login = s.post(loginURL, data = par1, headers = headers) # 发送登录信息,返回响应信息(包含cookie)
response = s.get(afterURL, cookies = login.cookies, headers = headers) # 获得登陆后的响应信息,使用之前的cookie
return response.content
xsrf = get_xsrf()
print “_xsrf的值是:” + xsrf
data = {“email”:”xxx”,”password”:”xxx”,”_xsrf”:xsrf}
print login(data)
六、补充:
用知乎网做完试验,发现这里好像并不需要发送_xsrf这个值。
不过有的网站在登陆时确实需要发送类似这样的一个值,可以用上述方法。
java爬虫怎么抓取登陆后的网页数据
一般爬虫都不会抓登录以后的页面,
如果你只是临时抓某个站,可以模拟登录,然后拿到登录以后的Cookies,再去请求相关的页面。