如何把Volley改成一个爬虫--HttpClient设置

  闲的时候一直在自己研究爬虫相关的东西,看过一两个开源框架,自己照猫画虎的写了一个,目前看来我的爬虫可以用了,但还是有很多不足,把我目前的经验写出来跟大家分享一下。

  国外爬虫的局限

    1.太守规矩(如果有Robot文件就要按着爬)

    2.无法自由切换代理,如果切换代理对所有线程都有影响,由于是单HtttpClient(我没有找到办法,crawler4j)

    3.会把页面都爬下来,我只想要部分文字或者图片而已

    4.过于完善,所以臃肿庞大

  我希望我的爬虫第一阶段具有的功能是

    1.多线程

    2.多HttpClient爬取,可以自由切换代理(由于单HttpClient爬取所有无法对每个线程分别单独设置proxy,我目前正在寻找解决办法)

    3.可以记录爬过的页面,或者所爬取内容的ID

    4.只针对文字和图片

  由于技术能力确实有限,所以我没有从头开始重新写一个,选择了把我比较熟悉的Volley改成爬虫。Google的Volley真的不错,足够我把它扩展成一个爬虫。

  Volley采用的是生产者消费者模式,将连接放入生产队列,然后Request从队列中取内容获得Response,最后通过Listener通知等待线程。

  首先是关于HttpClient即Volley的newRequestQueue

 1        HttpParams params = new BasicHttpParams();
 2
 3             params.setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES);
 4             params.setParameter(CoreProtocolPNames.USER_AGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
 5             params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 1000);
 6             params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000);
 7
 8             params.setBooleanParameter("http.protocol.handle-redirects", false);
 9
10             SchemeRegistry schemeRegistry = new SchemeRegistry();
11             schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
12
13             PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(schemeRegistry);
14             connectionManager.setMaxTotal(10);
15             connectionManager.setDefaultMaxPerRoute(10);
16             DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager, params);
17
18             stack = new HttpClientStack(httpClient);

  由于爬虫的特点是加入队列前都会对是否爬过进行判断所以不需要做缓存 ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES 由于其特殊性,爬虫一般自己处理302和301跳转 params.setBooleanParameter("http.protocol.handle-redirects", false); 由于从安卓中抽离Volley所以删掉了Httpclient以外的其他Stack实现。

  注意

Cache noCache=new NoCache();

  同样由于爬虫不需要缓存。

  或者可以把与Cache相关的代码删掉。

  希望对大家的工作有所帮助。  

  

如何把Volley改成一个爬虫--HttpClient设置

时间: 2024-10-12 19:15:17

如何把Volley改成一个爬虫--HttpClient设置的相关文章

动态ip代理:反网络爬虫之设置User-Agent的常规方法

爬虫过程中的反爬措施非常重要,其中设置随机 User-Agent 是一项重要的反爬措施.常规情况,比较方便的方法是利用 fake_useragent包,这个包内置大量的 UA 可以随机替换,这比自己去搜集罗列要方便很多,下面来看一下如何操作. 1.首先,安装好fake_useragent包,一行代码搞定:2.可以测试一下3.这里,使用了 ua.random 方法,可以随机生成各种浏览器的 UA,见下图:4.如果只想要某一个浏览器的,比如 Chrome ,那可以改成 ua.chrome,再次生成随

httpclient设置超时。

// 1.生成 HttpClinet 对象并设置参数 HttpClient httpClient = new DefaultHttpClient(); // 设置 HTTP 连接超时 5s httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); // 2.生成 GetMethod 对象并设置参数 HttpGet httpGet = new HttpGet(url); // 设置 get

java HttpClient设置代理

HttpClient client = new HttpClient(); UsernamePasswordCredentials creds = new UsernamePasswordCredentials(userData.id, userData.password); client.getState().setProxyCredentials(AuthScope.ANY, creds);

HttpClient设置编码类型

笔者引用的是commons-httpclient这个jar包httpclient 可是通过get/post方式获取带有中文页面的html文件时.返回的是乱码,在网上找了非常久.最终找到一个合适的: HttpClient client = new HttpClient(); GetMethod getMethod = new getMethod("http://www.sougou.com"); getMethod.getParams().setParameter(HttpMethodP

爬虫平台设置代理ip

首先从国外一个网站爬取了免费的代理ip信息存到mongodb中:接着代码设置: 在爬虫客户端抽象类中添加属性: 设置代理的代码其实就以下几句: firefoxProfile.setPreference("network.proxy.type", 1); firefoxProfile.setPreference("network.proxy.no_proxies_on", "localhost, 127.0.0.1"); //设置当没有代理ip时本

C# HttpClient设置cookies的两种办法

一般有两种办法 第一种handler.UseCookies=true(默认为true),默认的会自己带上cookies,例如 var handler = new HttpClientHandler() { UseCookies = true }; var client = new HttpClient(handler);// { BaseAddress = baseAddress }; client.DefaultRequestHeaders.Add("user-agent", &qu

HttpClient 设置超时问题

jps -lvmjstack -l pid requestConfig 设置timeout不生效 job出现卡死杜塞情况,查看线程如下"dcpUpdateOtrAccessTokenCronJob::de.hybris.platform.servicelayer.internal.jalo.ServicelayerJob" prio=5 tid=0x54068 nid=0xd334 RUNNABLE (JNI Native Code) - stats: cpu=344392 blk=-

亿牛云爬虫代理设置自主切换IP的方案

1.自主切换IP?该模式适合一些需要登陆.Cookie缓存处理等爬虫需要精确控制IP切换时机的业务. 爬虫程序可以通过设置HTTP头Proxy-Tunnel: 随机数, 当随机数相同时,访问目标网站的代理IP相同. 例如 需要登录,获取数据两个请求在一个IP下,只需对这组请求设置相同Proxy-Tunnel,例如:Proxy-Tunnel: 12345, 该组请求在代理有效期内使用相同的代理IP. 注意 同一时间不同请求组可以设置不同Proxy-Tunnel: 随机数,并发完成数据爬取. 使用相

httpclient: 设置请求的超时时间,连接超时时间等

public static void main(String[] args) throws Exception{ //创建httpclient CloseableHttpClient httpClient = HttpClients.createDefault(); //创建http get HttpGet httpGet = new HttpGet("http://www.taotao.com/"); //构建超时等配置信息 RequestConfig config = Reques