后来,读研究生时,做项目的同时还要搞科研。项目和科研,都须要采集大量的网络数据。领头做项目的师兄,指定了一系列国内外网站,并把采集任务分配给我。对付当时啥都不咋会的我,内心“啥?这该咋弄啊?这咋弄啊?……”可是没办法,即便瑟瑟颤动,硬着头皮还是要上。
好在有着师兄指示,让我去学习网路爬虫,说网路爬虫可以搞定“我想要的数据”。为了“活”下去,我决定放手一搏,但在学习准备阶段我就碰着了我的第一个“爬虫难题”。
决定要用网络爬虫去采集数据,面临一个选择便是:是用Java还是Python写网络爬虫呢?对付一个新手,我翻阅了网上各种比拟的帖子,各有各的不雅观点,个中不少说Python上手随意马虎,写起来方便。但终极我还是选择了Java,有以下几点缘故原由:

1. Java火了很多年,而且依旧很火,其生态也比较完善。目前,很多大公司的系统皆采取Java设计,足以解释其强大之处。把Java学好了,足够让我找一份不错的事情,即入职大厂。
2. Java严谨规范,对付大型工程、大型程序,如果不规范不严谨掩护岂不随意马虎出问题。
3. 对网络爬虫而言,JAVA中也有很多大略易用的类库(如Jsoup、Httpclient等),同时还存在不少易于二次开拓的网络爬虫框架(Crawler4J、WebMagic等)。
4. 曾在一个帖子中看到,“天下上99%的人都会选择一条随意马虎走的大路,由于人都喜好安逸。这也是人的大脑的思维办法决定的,由于大脑的义务是为了让你生存,而不是求知。但成功是总是属于那1%的人,这类人是坚持让大脑做不愿意做的事的人——求知”。哎,这在我看来,还真有一定的道理。如果励志想成为一名真正的程序员,建议先学习Java。在此根本上,如果你对Python感兴趣,也是可以快速上手的。
1 网络爬虫流程
学习网络爬虫之前,先看了普通网络爬虫大致流程,如下图所示:
紧张包括5个步骤:
1. 选取部分种子URL(或初始URL),将其放入待采集的行列步队中。如在Java中,可以放入List、LinkedList以及Queue中。
2. 判断URL行列步队是否为空,如果为空则结束程序的实行,否则实行步骤3。
3. 从待采集的URL行列步队中取出一个URL,获取URL对应的网页内容。在此步骤须要利用HTTP相应状态码(如200和403等)判断是否成功获取到了数据,如相应成功则实行解析操作;如相应不堪利,则将其重新放入待采集URL行列步队(把稳这里须要过滤掉无效URL)。
4. 针对相应成功后获取到的数据,实行页面解析操作。此步骤根据用户需求获取网页内容中的部分字段,如汽车论坛帖子的id、标题和揭橥韶光等。
5. 针对步骤4解析的数据,实行数据存储操作。
2 须要节制的Java根本知识
在利用Java构建网络爬虫时,须要节制很多Java方面的根本知识。例如,Java中基本的数据类型、Java中的数组操作、判断语句的利用、凑集操作、工具和类的利用、String类的利用、日期和韶光的处理、正则表达式的利用、Maven工程的创建、多线程操作、日志的利用等。
看着知识点很多,但如果将其放入到详细的网络爬虫实战项目中去学习,会创造很大略。下面,我举两个例子。
在网络爬虫中,我们常常须要将待采集的URL放到凑集中,然后循环遍历凑集中的每个URL去采集数据。比如,我们利用Queue凑集操作:
Queue<String> urlQueue = new LinkedList<String>(); //添加要采集的URL urlQueue.offer("https://ccm.net/download/?page=1"); urlQueue.offer("https://ccm.net/download/?page=2"); urlQueue.offer("https://ccm.net/download/?page=3"); boolean t = true; while (t) { //如果行列步队为空,循环结束 if( urlQueue.isEmpty() ){ t = false; }else { //取出每个URL String url = urlQueue.poll(); //获取HTML String getHtml = ...; //判断是否成功要求到HTML if (成功要求到HTML) { //解析数据 ...; }else { //如果网页存在但没有要求到数据,重新添加到行列步队中 urlQueue.offer(url); } } }
其余,在采集数据时,不同网站的韶光利用格式可能不同。而不同的韶光格式,会为数据存储以及数据处理带来一定的困难。例如,下图为某汽车论坛中韶光利用的格式,即“yyyy-MM-dd”和“yyyy-MM-dd HH:mm”两种类型。
下图为某新闻网站中的韶光利用格式“yyyy-MM-dd HH:mm:ss”。
再如,艺术品网站deviantart的韶光利用的是UNIX韶光戳的形式。
针对汽车论坛中的“yyyy-MM-dd”和“yyyy-MM-dd HH:mm”格式,可以统一转化成“yyyy-MM-dd HH:mm:ss”格式,以方便数据存储以及后期数据处理。此时,可以写个方法将将字符串类型的韶光标准化成指定格式的韶光。如下程序:
import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class TimeTest { public static void main(String[] args) { System.out.println(parseStringTime("2016-05-19 19:17", "yyyy-MM-dd HH:mm","yyyy-MM-dd HH:mm:ss")); System.out.println(parseStringTime("2018-06-19", "yyyy-MM-dd","yyyy-MM-dd HH:mm:ss")); } / 字符型韶光格式标准化方法 @param inputTime(输入的字符串韶光),inputTimeFormat(输入的格式),outTimeFormat(输出的格式). @return 转化后的韶光(字符串) / public static String parseStringTime(String inputTime,String inputTimeFormat, String outTimeFormat){ String outputDate = null; try { //日期格式化及解析韶光 Date inputDate = new SimpleDateFormat(inputTimeFormat).parse(inputTime); //转化成新的形式的字符串 outputDate = new SimpleDateFormat(outTimeFormat).format(inputDate); } catch (ParseException e) { e.printStackTrace(); } return outputDate; }}
针对UNIX韶光戳,可以通过如下方法处理:
//将unix韶光戳转化成指定形式的韶光 public static String TimeStampToDate(String timestampString, String formats) { Long timestamp = Long.parseLong(timestampString) 1000; String date = new SimpleDateFormat(formats, Locale.CHINA).format(new Date(timestamp)); return date; }
3 HTTP协议根本与网络抓包
做网络爬虫,还须要理解HTTP协议干系的内容,即要清楚数据是怎么在做事器和客户端传输的。
详细须要理解的内容包括:
1. URL的组成:如协议、域名、端口、路径、参数等。
2. 报文:分为要求报文和相应报文。个中,要求报文包括要求方法、要求的URL、版本协议以及要求头信息。相应报文包括要求协议、相应状态码、相应头信息和相应内容。相应报文包括要求协议、相应状态码、相应头信息和相应内容。
3. HTTP要求方法:在客户端向做事器发送要求时,须要确定利用的要求方法(也称为动作)。要求方法表明了对URL指定资源的操作办法,做事器会根据不同的要求方法做不同的相应。网络爬虫中常用的两种要求方法为GET和POST。
4. HTTP状态码:HTTP状态码由3位数字组成,描述了客户端向做事器要求过程中发生的状况。常利用200判断网络是否要求成功。
5. HTTP信息头:HTTP信息头,也称头字段或首部,是构成HTTP报文的要素之一,起到通报额外主要信息的浸染。在网络爬虫中,我们常利用多个User-Agent和多个referer等要求头来仿照人的行为,进而绕过一些网站的防爬方法。
6. HTTP相应正文:HTTP相应正文(或HTTP相应实体主体),指做事器返回的一定格式的数据。网络爬虫中常碰着须要解析的几种数据包括:HTML/XML/JSON。
在开拓网络爬虫时,给定 URL,开拓者必须清楚客户端是怎么向做事器发送要求的,以及客户端要求后做事器返回的数据是什么。只有理解这些内容,开拓者才能在程序中拼接URL,针对做事返回的数据类型设计详细的解析策略。因此,网络抓包是实现网络爬虫必不可少的技能之一,也是网络爬虫开拓的出发点。
本文作者钱洋博士所著新书《网络数据采集技能:Java网络爬虫实战》现已上市。系统地先容了网络爬虫的理论知识和根本工具,并且选取范例网站,采取案例讲解的办法先容网络爬虫中涉及的问题,以增强大家的动手实践能力。
本书时候海内少见的Java爬虫宝典。与Python措辞比较,利用Java措辞进行网络数据采集,具有采集效率更高、框架性能更好、敏捷易用等优点,而且针对大型搜索引擎系统的数据采集事情更多利用Java措辞,故本书值得大家学习。
(扫码理解本书详情)
█ 关 于 作 者
钱洋
合肥工业大学管理科学与工程系博士、CSDN博客专家。作为技能职员参与过多个横向、纵向学术课题,卖力数据采集系统的设计与开拓事情。在CSDN(博客名称:HFUT_qianyang)上撰写了多篇关于数据采集、自然措辞处理、编程措辞等领域的原创博客。
姜元春
合肥工业大学教授、博士生导师。长期从事电子商务、商务智能、数据采集与挖掘等方面的理论研究与传授教化事情。先后主持过国家自然科学基金精良青年科学基金项目、国家自然科学基金重大研究操持造就项目、国家自然科学基金青年科学基金项目、教诲部人文社科青年基金项目、阿里巴巴青年学者支持操持、CCF-腾讯犀牛鸟基金项目等课题的研究事情。
█ 大 咖 推 荐
陈国青 / 清华大学教授、博士生导师程学旗 / 中国科学院打算技能研究所研究员、博士生导师卓训方 / 上海数据交易中央项目总监刘业政 / 合肥工业大学教授博士生导师█ 本书内容构造
第 1 ~3 章
这3 章重点先容与网络爬虫开拓干系的根本知识,个中包括网络爬虫的事理、Java 根本知识和HTTP 协议等内容。
第 4~6 章
这3 章分别从网页内容获取、网页内容解析和网络爬虫数据存储3 个方面先容网络爬虫开拓过程中所涉及的一系列技能。在这3 章中,涉及很多开源工具的利用,如Jsoup、HttpClient、HtmlCleaner、Fastjson、POI3 等。
第 7 章
本章利用详细的实战案例,讲解网络爬虫开拓的流程。通过对本章的学习,读者可以轻松开拓Java 网络爬虫。
第 8 章
针对一些繁芜的页面,如动态加载的页面(实行JavaScript 脚本),本章先容了一款实用的工具——Selenium WebDriver。
第 9 章
本章重点先容了3 种比较盛行的Java 网络爬虫开源框架,即Crawler4j、WebCollector 和WebMagic。读者可根据数据采集需求,自行开拓支持多线程采集、断点采集、代理切换等功能的网络爬虫项目。
▶ 博文菌●互动韶光 ◀
Java、Python、Js、C、PHP、Shell、Ruby等等措辞都可以实现爬虫,你考试测验过哪种措辞呢?欢迎在留言区与大家分享!