1.要求和配置
要求:抓取JD.COM手机搜索页面信息,记录每部手机的名称、价格、评论号,形成数据表,可用于实际分析。
在Maven项目中,log4j记录日志,日志只导出到控制台。
Maven依赖于以下内容(pom.xml)
依赖关系依赖关系groupIdorg.apache.httpcomponents/groupId artifactIdhttpclient/artifactId版本4 . 5 . 3/版本/依赖关系依赖关系!- jsoup HTML解析器库@ https://jsoup.org/-groupIdorg.jsoup/groupId artifactIdjsoup/artifactId版本1 . 11 . 2/版本/依赖!-https://mvnrepository.com/artifact/log4j/log4j-dependency group idlog4j/group id artifactIdlog4j/artifactId version 1 . 2 . 17/version/dependency/dependencies log4j配置(log4j.properties),向控制台输出INFO及以上级别信息,不单独设置输出文档。
log4j.rootLogger=INFO,Console # Console log4j . appender . Console=org . Apache . log4j . Console penderlog4j . appender . Console . layout=org . Apache . log4j . patternlayou . appender . Console t . conversion pattern=% d[% t]%-5p[% c]-% m % N2,需求分析和代码
2.1需求分析
第一步是建立客户端和服务器端的连接,通过URL获取网页上的HTML内容。
其次,解析HTML内容并获取所需的元素。
第三步是将HTML内容输出到本地文本文档中,可以直接通过其他数据分析软件进行分析。
根据上面的分析,建立了四个类,GetHTML(用于获取网站HTML)、ParseHTML(用于解析HTML)、WriteTo(用于输出文档)和Maincontrol(主控)。下面分别描述四类。为了使代码尽可能简洁,所有异常都直接从方法中抛出,并且不进行捕获。
2.2代码
2.2.1GetHTML类
这个类有两种方法:geth(字符串URL)和urlcontrol(字符串基URL,int page),分别用来获取网页的HTML和控件URL。由于被抓取网页的内容只是JD.COM某类商品的搜索结果,因此不需要遍历页面上的所有URL,只需要观察翻页时URL的变化并推导出规则即可。只公开了urlControl方法,在类中设置了私有日志属性:私有静态logger log=logger . getlogger(gethtml . class);用于日志记录。
获取单个网址的HTML内容。
Url控件(字符串基URL,int page),它设置循环并访问多个页面的数据。通过检查元素,我们可以看到JD.COM上搜索页面的变化实际上是一个奇怪的顺序变化。
查看点击后URL的变化,可以发现实际变化的是页面属性的值。下一个网页的地址很容易通过拼接得到。
https://search.jd.com/Search?关键字=手机enc=utf-8 qrst=1rt=1 stop=1vt=2 cid 2=653 cid 3=655 page=3s=47 click=0https://search.jd.com/search?关键字=手机enc=utf-8 qrst=1rt=1 stop=1vt=2 cid 2=653 cid 3=655 page=5s=111 click=0https://search.jd.com/search?关键字=手机enc=utf-8 qrst=1rt=1 stop=1vt=2 cid 2=653 cid 3
整体代码:
导入Java。io。ioexception导入组织。阿帕奇。http。Httpentity导入组织。阿帕奇。http。客户。clientprotocolexception导入组织。阿帕奇。http。客户。方法。closeablehttpresponse导入组织。阿帕奇。http。客户。方法。HttpGet导入组织。阿帕奇。http。impl。客户。closeablehttpclient导入组织。阿帕奇。http。impl。客户。httpclients导入组织。阿帕奇。http。乌提尔。entityutils导入组织。阿帕奇。log4j。伐木工人;公共类getHTML { //建立日志私有静态记录器日志=记录器。getlogger(gethtml。类);私有静态字符串getH(字符串url)引发ClientProtocolException,IOException { //控制台输出日志,这样每条访问的统一资源定位器都可以在控制台上看到访问情况log.info('正在解析网址);/* * 以下内容为HttpClient建立连接的一般用法* 使用HttpClient建立客户端* 使用得到方法访问指定网址*获得应答* */CloseableHttpClient客户端=httpclients。创建默认值();http get=新的Http get(URL);CloseableHttpResponse响应=客户端。执行(获取);/* * 以下内容为将超文本标记语言内容转化为字符串*获得应答体* 将应答体转为线格式,此处使用了EntityUtils中的toString方法,编码格式设置为utf-8' *完成后关闭客户端与应答* */HttpEntity实体=响应。GetEntity();字符串内容;如果(实体!=null){ content=entity TLS。ToString(实体,' utf-8 ');客户。close();回应。close();返回内容;}其他返回空}公共静态无效网址控件(字符串基网址,整页)引发ClientProtocolException,IOException { //设置当前页count int count=1;//如果当前页小于想要爬取的页数则执行而(计数页面){ //实际访问的统一资源定位器为不变的统一资源定位器值拼接上统一资源定位器变化的值字符串u=基本URL(2 * count-1)‘click=0’;//此处调用ParseHTML类中的方法对统一资源定位器中的超文本标记语言页面进行处理,后面详细介绍该类字符串内容=ParseHTML.parse(getH(u)).toString();//此处调用写给类中的方法对解析出来的内容写入到本地,后面详细介绍该类WriteTo.writeto(内容);计数;} }}2.2.2ParseHTML类
该步骤需要通过审查元素对需要爬取内容的标签进行确定,再通过Jsoup中的半铸钢钢性铸铁(铸造半钢)选择器进行获取。
导入组织。js oup。js oup导入组织。js oup。节点。文件;导入组织。js oup。节点。元素;导入组织。js oup。选择。元素;公共类ParseHTML {公共静态StringBuilder解析(字符串内容){ //使用Jsoup中的从语法上分析方法对已经转换为线的超文本标记语言内容进行分析,返回值为文件类document=Jsoup。解析(内容);//使用选择器挑选对需要找的元素进行抓取,例如第一个挑选中选择的是保险商实验所标签中班级属性等于gl-warp clearfix的内容ele=doc。选择(' ul[class=GL-warp clear fix]).选择('李[类=GL-item]');//设置一个容器,用于装各个属性StringBuilder sb=new StringBuilder();//通过上一个选择器可以获得整个页面中所有符合要求的元素,也即各款手机,下面则需要对每款手机进行遍历,获取其属性for (Element e : ele) { //此处对各个属性的获取参考了网上一篇爬取京东上内容的文章,应该有其他不同的写法字符串id=e . attr('数据-PID ');字符串子明=e . select(' div[class=p-name p-name-type-2]).选择(' a ').选择(' em ').text();字符串jiage=e . select(' div[class=p-price]').选择(“强”).选择(“我”).text();字符串ping LUN=e . select(' div[class=p-commit]').选择(“强”).选择(' a ').text();//向容器中添加属性某人(somebody的简写)追加(id ' t ');追加(子明 t ');某人(somebody的简写)追加(jiage ' t ');某人(somebody的简写)追加(ping LUN ' t ');某人(somebody的简写)追加(' r n ');}归还某人;}}2.2.3WriteTo类
此类中的方法将解析完成的内容写入到一个本地文件中。只是简单的输入输出。
导入Java . io . bufferedwriter;导入Java . io . file;导入Java . io . FileWriter;导入Java . io . ioexception;公共类WriteTo {//设置文件存储位置私有静态文件f=新文件(' c: 京东. txt ');public static void write to(string content)引发io异常{//使用连续写入方法避免覆盖以前写入的内容缓冲写入程序bw=新缓冲写入程序(new filewriter (f,true));bw.append(内容);bw . flush();bw . close();} } 2 . 2 . 4 ain control类
主控程序写入基址和要获取的页数。在getHTML类中调用urlControl方法抓取页面。
导入Java . io . ioexception;import org . Apache . http . client . clientprotocolexception;公共类main control { public static void main(String[]args)引发ClientProtocolException,IOException { //TODO自动生成的方法存根String base URL=' https://Search . JD.com/Search?Keyword=手机enc=' ' utf-8qrst=1rt=1s top=1vt=2cid 2=653 cid 3=655 page=';int page=5;//设置gethtml.urlcontrol (baseurl,page)的已爬网页数;}}3.搜索结果
爬20页。
3.1控制台输出
3.2文件输出
可以直接用Excel打开,分隔符为tab。栏目有商品编号、名称、价格、备注号。
4.摘要
HttpClient和Jsoup用于这种抓取,我们可以看到这些工具对于简单的需求非常有效。其实所有的类都可以写成一个类,写多个类的方式也很明确。
上面的Java爬虫实现爬取了JD.COM上的手机搜索页面HttpCliient Jsoup,这是边肖分享的所有内容。希望能给大家一个参考,支持我们。