网络爬虫案例解析
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常被称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本,已被广泛应用于互联网领域。搜索引擎使用网络爬虫抓取Web网页、文档甚至图片、音频、视频等资源,通过相应的索引技术组织这些信息,提供给搜索用户进行查询。网络爬虫也为中小站点的推广提供了有效的途径,网站针对搜索引擎爬虫的优化曾风靡一时。
网络爬虫的基本工作流程如下:
1.首先选取一部分精心挑选的种子URL;
2.将这些URL放入待抓取URL队列;
3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。
4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。
当然,上面说的那些我都不懂,以我现在的理解,我们请求一个网址,服务器返回给我们一个超级大文本,而我们的浏览器可以将这个超级大文本解析成我们说看到的华丽的页面
那么,我们只需要把这个超级大文本看成一个足够大的String 字符串就OK了。
下面是我的代码
| |
代码如下 | 复制代码 |
packagemain.spider; importorg.jsoup.Jsoup; importorg.jsoup.nodes.Document; importorg.jsoup.nodes.Element; importorg.jsoup.select.Elements; importjava.io.IOException; /** * Created by 1755790963 on 2017/3/10. */ publicclassSecond { publicstaticvoidmain(String[] args)throwsIOException { System.out.println("begin"); Document document = Jsoup.connect("http://tieba.baidu.com/p/2356694991").get(); String selector="div[class=d_post_content j_d_post_content clearfix]"; Elements elements = document.select(selector); for(Element element:elements){ String word= element.text(); if(word.indexOf("@")>0){ word=word.substring(0,word.lastIndexOf("@")+7); System.out.println(word); } System.out.println(word); } } } |
我在这里使用了apache公司所提供的jsoup jar包,jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
在代码里,我们可以直接使用Jsoup类,并.出Jsoup的connect()方法,这个方法返回一个org.jsoup.Connection对象,参数则是网站的url地址,Connection对象有一个get()方法返回Document对象
document对象的select方法可以返回一个Elements对象,而Elements对象正式Element对象的集合,但select()方法需要我们传入一个String参数,这个参数就是我们的选择器
String selector="div[class=d_post_content j_d_post_content clearfix]";
我们的选择器语法类似于jquery的选择器语法,可以选取html页面中的元素,选择好后,就可以便利Elements集合,通过Element的text()方法获取html中的代码
这样,一个最简单的网络爬虫就写完了。
我选择的网址是 豆瓣网,留下你的邮箱,我会给你发邮件 这样一个百度贴吧,我扒的是所有人的邮箱地址
附上结果:
本文介绍了Android中使用 AutoCompleteTextView 实现手机号格式化附带清空历史的操作,非常实用,有兴趣的同学可以参考一下有个小伙伴遇到了这样一个问题,就是AutoCompleteTextView实现自动填充的功能。同时要具备手机格式化的功能。下拉列表最后一行是有个清除历史的功能。可是点击“清除历史”却把文字要设置进去AutoCompleteTextView中。这样的效果显然很糟糕。所以我就写了这样一个简单的demo。来帮助遇到这种问题的朋友解决这样一个问题。二话不多说直接上代码。
布局文件(activity_main.xml)代码如下:
代码如下 | 复制代码 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Please input:"/> <AutoCompleteTextView android:id="@+id/actv" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
|
java文件(MainActivity.java)代码如下:
代码如下 | 复制代码 |
importandroid.app.Activity; importandroid.os.Bundle; importandroid.text.Editable; importandroid.text.Selection; importandroid.text.TextWatcher; importandroid.view.View; importandroid.widget.AdapterView; importandroid.widget.AdapterView.OnItemClickListener; importandroid.widget.ArrayAdapter; importandroid.widget.AutoCompleteTextView; importandroid.widget.EditText; importandroid.widget.TextView; importandroid.widget.Toast; publicclassMainActivityextendsActivity { privateAutoCompleteTextView mAutoCompleteTextView; privateString[] mAutoStrs =newString[] {"138 0013 8000","13800138001", "13800138002","13800138003","13800138004","138 0013 800清除记录"}; privateString mBeforeTextChangedStr =""; publicvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.actv); ArrayAdapter android.R.layout.simple_dropdown_item_1line, mAutoStrs); mAutoCompleteTextView.setAdapter(_arrayAdapter); mAutoCompleteTextView.setThreshold(1);// 设置输入一个字符就提示 mAutoCompleteTextView.setOnItemClickListener(newOnItemClickListener() { @Override publicvoidonItemClick(AdapterView arg0, View arg1,intarg2, longarg3) { String _clearStr =""; if(arg1instanceofTextView) { _clearStr = ((TextView) arg1).getText().toString(); } if(_clearStr.equals("138 0013 800清楚记录")) { mAutoCompleteTextView.setText(mBeforeTextChangedStr); Editable _editable = mAutoCompleteTextView.getText(); Selection.setSelection(_editable, _editable.length()); Toast.makeText(MainActivity.this,"清除成功了!", Toast.LENGTH_LONG).show(); } } }); phoneNumAddSpaceOne(mAutoCompleteTextView); } /** * 手机号格式化代码 * * @param editText * EditText对象 */ publicvoidphoneNumAddSpaceOne(finalEditText editText) { editText.addTextChangedListener(newTextWatcher() { privateintstart; privateintbefore; privateStringBuilder stringBuilder; @Override publicvoidonTextChanged(CharSequence s,intstart,intbefore, intcount) { this.start = start; this.before = before; } @Override publicvoidbeforeTextChanged(CharSequence s,intstart,intcount, intafter) { } @Override publicvoidafterTextChanged(Editable s) { String _str = s.toString(); if(!isNumeric(_str.replace(" ",""))) { return; } mBeforeTextChangedStr = _str; // 手机号格式化xxx xxxx xxxx if(s ==null|| s.length() ==0) return; if(stringBuilder ==null) { stringBuilder =newStringBuilder(); }else{ stringBuilder.delete(0, stringBuilder.length()); } for(inti =0; i < s.length(); i++) { if(i !=3&& i !=8&& s.charAt(i) ==' ') { continue; }else{ stringBuilder.append(s.charAt(i)); if((stringBuilder.length() ==4|| stringBuilder .length() ==9)&& stringBuilder.charAt(stringBuilder.length() -1) !=' ') { stringBuilder.insert(stringBuilder.length() -1,' '); } } } if(!stringBuilder.toString().equals(s.toString())) { intindex = start +1; if(stringBuilder.charAt(start) ==' ') { if(before ==0) { index++; }else{ index--; } }else{ if(before ==1) { index--; } } editText.setText(stringBuilder.toString()); editText.setSelection(index); } } }); } /** * 判断字符串是否是数字 * * @param str * 需要判断的字符串 * @return */ publicbooleanisNumeric(String str) { for(inti = str.length(); --i >=0;) { intchr = str.charAt(i); if(chr<48|| chr="">57) returnfalse; } returntrue; } } |
本文给大家介绍了android动态设置app当前运行语言的方法,非常有用,不懂的同学可以考虑
android开发中有时候碰到切换语言的需求,这时候需要通过代码动态改变当前运行语言。
代码如下 | 复制代码 |
packagecom.example.androidtest;
importjava.util.Locale;
importandroid.os.Bundle; importandroid.app.Activity; importandroid.content.Intent; importandroid.content.res.Configuration; importandroid.content.res.Resources; importandroid.util.DisplayMetrics; importandroid.view.Menu; importandroid.view.View; importandroid.widget.Button;
publicclassMainActivityextendsActivity {
@Override protectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
Button btnLang = (Button) findViewById(R.id.btn); // 按下按钮改变语言类型,在“简体中文”和“英文”之间切换 btnLang.setOnClickListener(newView.OnClickListener() {
@Override publicvoidonClick(View v) { // 获取当前Locale(包含语言信息) Locale curLocale = getResources().getConfiguration().locale;
// 判断语言类型,有以下两种判断方式
// 方法一,通过Locale的equals方法 // public boolean equals (Object object) // Returns true if object is a locale with the same language, country and variant. if(curLocale.equals(Locale.SIMPLIFIED_CHINESE)) { setLang(Locale.ENGLISH); }else{ setLang(Locale.SIMPLIFIED_CHINESE); }
// 方法二,通过语言码,getLanguage()方法可以获得对应语言码 // public String getLanguage () // Returns the language code for this Locale or the empty string if no language was set. // if (curLocale.getLanguage().equals(Locale.SIMPLIFIED_CHINESE.getLanguage())) { // setLang(Locale.ENGLISH); // } else { // setLang(Locale.SIMPLIFIED_CHINESE); // } } }); }
privatevoidsetLang(Locale l) { // 获得res资源对象 Resources resources = getResources(); // 获得设置对象 Configuration config = resources.getConfiguration(); // 获得屏幕参数:主要是分辨率,像素等。 DisplayMetrics dm = resources.getDisplayMetrics(); // 语言 config.locale = l; resources.updateConfiguration(config, dm);
// 刷新activity才能马上奏效 startActivity(newIntent().setClass(MainActivity.this, MainActivity.class)); MainActivity.this.finish(); }
@Override publicbooleanonCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); returntrue; }
} |
通过下面一行代码获得当前语言信息
Locale curLocale = getResources().getConfiguration().locale;
判断语言和设置语言部分有详细注释,就不做过多解释啦!
资源文件需要支持多语言环境,这样才能看到切换语言的效果!
创建values-en文件夹,并创建英文版的strings.xml文件。
相关文章
- 这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
- 一、常量常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。按照惯例常量标识符总是大写的。 常量名和其它任何 PHP 标签遵循...2015-10-30
- 在本篇内容里小编给大家分享的是关于用C#做网络爬虫的步骤和方法,需要的朋友们可以参考下。...2020-06-25
- 今天带大家来学习selenium库的使用方法及相关知识总结,文中非常详细的介绍了selenium库,对正在学习python的小伙伴很有帮助,需要的朋友可以参考下...2021-05-25
- 这篇文章主要介绍了JS跨浏览器解析XML应用过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-16
- 这篇文章主要介绍了selenium 反爬虫之跳过淘宝滑块验证功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-27
- JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧,下面通过本文给大家介绍JS中Eval解析JSON字符串的一个小问题,需要的朋友参考下吧...2016-02-23
- 这篇文章主要介绍了C# 如何解析获取Url参数值,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2020-09-01
- 这篇文章主要介绍了Nginx中配置过滤爬虫的User-Agent的简单方法,文中罗列了一些常用搜索引擎的爬虫名称以免造成不必要的过滤,需要的朋友可以参考下...2016-01-27
- 这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...2020-06-25
- 本文主要讲述了利用Python网络爬虫对指定京东商城中指定商品下的用户评论进行爬取,对数据预处理操作后进行文本情感分析,感兴趣的朋友可以了解下...2021-05-28
- 这篇文章主要介绍了JavaScript实现解析INI文件内容的方法,结合实例形式分析了javascript通过自定义函数实现针对ini文件解析操作的相关处理技巧,需要的朋友可以参考下...2016-11-22
error LNK2019: 无法解析的外部符号 问题的解决办法
error LNK2019: 无法解析的外部符号 问题的解决办法,需要的朋友可以参考一下...2020-04-25- 这篇文章主要介绍了node.js爬虫框架node-crawler的相关资料,帮助大家利用node.js进行爬虫,感兴趣的朋友可以了解下...2020-10-29
python爬虫用request库处理cookie的实例讲解
在本篇内容里小编给大家整理的是一篇关于python爬虫用request库处理cookie的实例讲解内容,有需要的朋友们可以学习参考下。...2021-02-21- 这篇文章主要介绍了C#网络请求与JSON解析的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要为大家详细介绍了基于C#实现网页爬虫的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
c# Selenium爬取数据时防止webdriver封爬虫的方法
这篇文章主要介绍了c# Selenium爬取数据时防止webdriver封爬虫的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-15- 本篇文章给大家分享了C#爬虫通过代理刷文章浏览量的详细步骤和方法,有兴趣的朋友可以参考学习下。...2020-06-25
- 这篇文章主要介绍了如何快速一键生成Python爬虫请求头,帮助大家更好的理解和学习使用python爬虫,感兴趣的朋友可以了解下...2021-03-05