Java爬虫实战:高效抓取百度搜索结果及美团商家信息
创始人
2024-12-28 09:23:14
0 次浏览
0 评论
【教你写爬虫】用Java爬虫爬取百度搜索结果!可爬10w+条!
【学习如何编写爬虫】使用Java爬取百度搜索结果实用指南这篇文章我们将学习如何使用Java编写爬虫来爬取百度搜索结果,最多10万条数据。
首先,目标是捕获搜索结果中的五个关键信息:标题、原始链接、链接来源、简介和发布时间。
实现这一目标的关键技术创新包括Puppeteer(网站自动化工具)、Jsoup(浏览器元素分析器)和Mybatis-Plus(数据仓库)。
在爬取过程中,我们首先分析了百度搜索结果网站的结构,通过控制台查看,发现包含所需信息的元素位于类为“resultc-containerxpath-lognew-pmd”的div标签中。
爬虫的基本步骤包括:1)初始化浏览器,打开百度搜索页面2)模拟用户输入关键字并点击搜索;3)使用代码分析页面;每个搜索结果的详细信息4)重复此过程以处理多个关键字和附加逻辑,例如随机等待、数据保存等。
通过这样的通用方法,我们实现了高效的数据捕获。
综上所述,爬虫的本质就是模仿人类操作,获取互联网上的数据。
Puppeteer通过模拟人类点击来接收信息,我们的目标是更高效地接收和处理数据。
如果您对完整源码感兴趣,可以在公众号获取包括爬虫代码、数据库脚本和网站结构分析在内的案例信息。
Kotlin采集美团商家信息同行竞争价格监控
“南方马铃薯”在哈尔滨旅游市场引起关注,一个冬天,哈尔滨名声大噪,吸引了全国各地游客的目光。很有趣,但是我要加班写代码,休息的时间很少。
最近用Java写了一个美团爬虫程序。
现在我们将使用Java中的Kotlin库创建一个美团商家爬虫来监控同行定价信息并进行比较分析以了解竞争格局。
爬虫程序的代码和步骤如下。
每行代码的说明如下:1.valproxyHost="duoip":指定代理服务器地址为duoip。
2.valproxyPort=8000:指定代理服务器端口为8000。
3.valurl=URL("meituan"):指定抓取的URL为meituan。
4、valproxy=Proxy(Proxy.Type.HTTP,java.net.InetSocketAddress(proxyHost,proxyPort)):创建代理对象,指定代理类型为HTTP,代理地址为duoip,代理端口为8000。
.valconnection=URL(url).openConnection():创建一个URLConnection对象,并指定连接的URL为美团。
6.connection.setRequestProperty("Proxy-Connection","Keep-Alive"):将请求头“Proxy-Connection”设置为“Keep-Alive”。
这表明请求完成后连接应保持打开状态。
7、connection.setRequestProperty("User-Agent","Mozilla/5.0"):将请求头“User-Agent”设置为“Mozilla/5.0”,以指示客户端使用的浏览器类型。
8.connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded"):将请求头中的“Content-Type”设置为“application/x-www-form-urlencoded”。
请求的正文类型。
9、connection.setRequestProperty("Accept-Language","zh-CN,zh;q=0.8,en;q=0.6"):设置请求头中的“Accept-Language”为“zh-CN,zh;”我会。
q=0.8,en;q=0.6''表示客户端接受的语言。
10、valcookieParams=connection.getHeaderFields().get("Cookie").split(","):获取响应头“Cookie”,并用“,”分割得到字符串数组。
11.if(cookieParams.isNotEmpty()){connection.setRequestProperty("Cookie",cookieParams.joinToString(";"))}:如果“Cookie”不为空,则将请求头中的“Cookie”设置为字符串。
马苏。
数组元素用“;”分隔。
12.connection.connect():建立连接。
13.connection.responseCode:获取服务器返回的状态码。
以上是整个代码。
虽然这是一个比较详细的介绍,但可能还存在一些不完善的地方。
请随时向我们发送您的宝贵反馈。
不用说,我已经买好了去哈尔滨的机票,不过趁着天气还热,我打算成为南方的小土豆,体验一下哈尔滨美丽的冰雪世界。
JAVA怎么弄爬虫
下面是java实现的一个简单的爬虫核心代码:publicvoidcrawl()throwsThrowable{while(continueCrawling()){CrawlerUrlurl=getNextUrl();//获取队列中下一个要爬取的URLif(url!=null){printCrawlInfo();Stringcontent=getContent(url);//获取URL的文字信息//聚焦爬虫只爬取与主题网页相关的内容,正则匹配这里用于简单处理if(isContentRelevant(content,this.regexpSearchPattern)){saveContent(url,content);//保存网页到本地//获取网页内容中的链接放入待爬取的队列中CollectionurlStrings=extractUrls(content,url);addUrlsToUrlQueue(url,urlStrings);}else{System.out.println(url+"isnotrelevantignoring...");}//延迟,防止被对方阻塞Thread.sleep(this.delayBetweenUrls);}}closeOutputStream();}privateCrawlerUrlgetNextUrl()throwsThrowable{CrawlerUrlnextUrl=null;while((nextUrl==null)&&(!urlQueue.isEmpty())){CrawlerUrlcrawlerUrl=this.urlQueue.remove();//doWeHavePermissionToVisit:是否有权限访问该URL,友好的爬虫会根据网站提供的“Robot.txt”抓取配置的规则//isUrlAlreadyVisited:是否该URL已被访问。大型搜索引擎经常使用BloomFilter进行重复数据删除。
这里简单使用HashMap//isDepthAcceptable:是否已经达到指定的深度限制。
爬虫一般采用广度优先的方式。
有些网站会构建爬虫陷阱(自动生成一些无效链接,让爬虫陷入无限循环),并使用深度限制来避免if(doWeHavePermissionToVisit(crawlerUrl)&&(!isUrlAlreadyVisited(crawlerUrl))&&isDepthAcceptable(crawlerUrl)){nextUrl=crawlerUrl;//System.out.println("Nexturltobevisitedis"+nextUrl);}}returnnextUrl;}privateStringgetContent(CrawlerUrlurl)throwsThrowable{//HttpClient4.1调用方式与之前方法不同HttpClientclient=newDefaultHttpClient();HttpGethttpGet=newHttpGet(url.getUrlString());StringBufferstrBuf=newStringBuffer();HttpResponseresponse=client.execute(httpGet);if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){HttpEntityentity=response.getEntity();if(entity!=null){BufferedReaderreader=newBufferedReader(newInputStreamReader(entity.getContent(),"UTF-8"));Stringline=null;if(entity.getContentLength()>0){strBuf=newStringBuffer((int)entity.getContentLength());while((line=reader.readLine())!=null){strBuf.append(line);}}}if(entity!=null){nsumeContent();}}//将url标记为已访问markUrlAsVisited(url);returnstrBuf.toString();}publicstaticbooleanisContentRelevant(Stringcontent,PatternregexpPattern){booleanretValue=false;if(content!=null){//是否满足正则表达式的条件Matcherm=regexpPattern.matcher(content.toLowerCase());retValue=m.find();}returnretValue;}publicListextractUrls(Stringtext,CrawlerUrlcrawlerUrl){MapurlMap=newHashMap();extractHttpUrls(urlMap,text);extractRelativeUrls(urlMap,text,crawlerUrl);returnnewArrayList(urlMap.keySet());}privatevoidextractHttpUrls(MapurlMap,Stringtext){Matcherm=(text);while(m.find()){Stringurl=m.group();String[]terms=url.split("ahref=\"");for(Stringterm:terms){//System.out.println("Term="+term);if(term.startsWith("http")){intindex=term.indexOf("\"");if(索引>0){term=term.substring(0,index);}urlMap.put(term,term);System.out.println("超链接:"+term);}}}}privatevoidextractRelativeUrls(MapurlMap,Stringtext,CrawlerUrlcrawlerUrl){Matcherm=relativeRegexp.matcher(text);URLtextURL=crawlerUrl.getURL();Stringhost=textURL.getHost();while(m.find()){Stringurl=m.group();String[]terms=url.split("ahref=\"");for(Stringterm:terms){if(term.startsWith("/")){intindex=term.indexOf("\"");if(index>0){term=term.substring(0,index);}Strings=//"+host+term;urlMap.put(s,s);System.out.println("相对url:"+s);}}}}publicstaticvoidmain(String[]args){尝试{Stringurl=“”;QueueurlQueue=newLinkedList();Stringregexp="java";urlQueue.add(newCrawlerUrl(url,0));NaiveCrawlercrawler=newNaiveCrawler(urlQueue,100,5,1000L,regexp);//booleanallowCrawl=crawler.areWeAllowedToVisit(url);//System.out.println("Allowedtocrawl:"+url+""+//allowCrawl);crawler.crawl();}catch(Throwablet){System.out.println(t).toString());t.printStackTrace();}}
用java写爬虫程序,有个网站获取不到链接,求指导
//读取网页内容的方法------------2010.01.25publicStringgetOneHtml(Stringhtmlurl)throwsIOException{URLurl;Stringtemp;finalStringBuffersb=newStringBuffer();try{url=newURL(htmlurl);//读取网页全部内容FinalBufferedReaderin=newBufferedReader(newInputStreamReader(url.openStream(),"GBK"))while((temp=in.readLine())!=null){sb.append(temp);}in.close();}catch(finalMalformedURLExceptionme){System.out.println("您输入的网址已格式化")查询请小心。Enter";me.getMessage();}catch(finalIOExceptione){e.printStackTrace();}returnsb.toString();}上面的方法会根据你输入的URL抓取整个网页的内容然后写入匹配该字符串内容的正则表达式。
上一篇:
C语言编程:教你如何用代码绘制爱心图形
相关文章
Java基础:深入理解类与对象的区别及实...
2024-12-29 22:22:12Java开发工程师:职责详解与职业发展路...
2024-12-24 06:38:04C语言教程:实现多组数据输入与处理技巧
2024-12-18 15:45:17C语言实现int fun(int x, ...
2025-01-09 19:35:48Windows Java环境误配:AJN...
2024-12-17 03:36:36C语言实现:二维数组存储3个字符串,输入...
2024-12-27 01:34:15Java变量命名规范:详解命名规则与编程...
2024-12-21 00:51:08C语言中的指数e:规则与应用解析
2024-12-18 10:38:36Java编程入门:简单示例教你理解类、对...
2024-12-15 18:03:45Java字符串处理与键盘输入、文件读取技...
2024-12-23 12:31:35最新文章
13
2025-01
13
2025-01
13
2025-01
13
2025-01
13
2025-01
13
2025-01
13
2025-01
13
2025-01
13
2025-01
13
2025-01
热门文章
1
Java字符串分割技巧:轻松获取逗号前的...
java任意一个字符串,当它碰到第一个逗号时,返回逗号前面的字符串,例如:str...
2
SQL多表连接查询全解析:JOIN语句应...
sql多表关联查询在执行SQL多表连接查询时,可以使用JOIN语句将多个表连接在...
3
Java中字符串类型详解:String与...
变量有字符类型,为什么没有字符串类型??基本类型:charshort、int、l...
4
JavaSE与JavaEE:从基础到企业...
javase 和javaee的区别?JavaSE和JavaEE...
5
Java程序员面试必知:核心技术问答与技...
java编程程序员技术面试常见面试?随着互联网的不断发展,Java开发已经成为很...
6
Java.exe与Javaw.exe:区...
程序中java和javaw有什么区别java和javaw的区别:两者都是Java...
7
深入解析:Java中的javax包及其与...
JAVA导入时,什么是javax?awt是java1.0,swing是java2...
8
Python编程:两行代码实现正整数相加...
python编程上分2行输入两个正整数输出两个数的和、差(要求大数减小数)以下是...
9
Java后端开发薪资水平解析
java后端开发工资一般多少?Java工程师的典型薪资是多少?Java软件工程师...
10
Java包基础:命名空间与代码组织指南
java中的包是什么意思?包是Java中组织代码的基本结构。这种结构可以帮助我们...