当前位置: 首页 > 后端技术 > Python

Python和Java爬取个人博客信息并导出Excel

时间:2023-03-26 18:52:27 Python

一、场景分析今天爬取我的个人博客,把我的文章标题和地址汇总成一个Excel方便查看。wshanshi能有什么坏念头?她只是……想总结一下她的文章和相关地址……2、界面简单分析:了解开发,开启调试模式。选择Elements,然后找到存放文章的框,如下图。经过分析发现,每个盒子对应的是一篇文章相关的店铺信息。如果你仔细看,你会发现所有的文章标签都是同一个类。哎呀,他们看起来都一样,所以没关系。将标签与类选择器结合起来,你可以一次搞定。点击任意一个文章div,你会发现里面有文章超链接、标题和描述信息。结合本次操作的最终目的,得到以下步骤。场景分析完了,下面开始说。发布者将使用两种方法(Python、Java)为个人文章收集数据。justdoit...3.Python实现示例版本:Python3.8安装包:requests、beautifulsoup4、pandas库包安装命令(windows下)pipinstallrequestspipinstallbeautifulsoup4pipinstallpandas3.1,常用库说明3.1.1。请求什么是请求?请求的优点和缺点是什么?中文网址:https://docs.python-requests.org/zh_CN/latest/user/quickstart.html3.1.2,BeautifulSoup4.4.0说明:是一个可以从HTML或XML文件中提取数据的Python库。中文网址:https://beautifulsoup.readthedocs.io/zh_CN/latest/3.1.3,Pandas说明:强大的Python数据分析支持库中文网址:https://www.pypandas.cn/docs/具体使用详情看对于happy官网,这里就不多介绍了!!!3.2.代码示例直接贴代码:整合获取的文章标题和文章链接,导出为.csv文件。#-*-coding:UTF-8-*-frombs4importBeautifulSoupportrequestsimportpandasaspdimportopenpyxlimportreimportosdefis_in(full_str,sub_str):returnfull_str.count(sub_str)>0defblogOutput(df,url):#如果文件是不存在写头如果不是os.path.isfile(url):df.to_csv(url,index=False)else:#else它存在所以追加而不写头df.to_csv(url,mode='a',index=False,header=False)if__name__=='__main__':target='https://blog.csdn.net/weixin_43770545'headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/87.0.4280.67Safari/537.36Edg/87.0.664.47'}res=requests.get(target,headers=headers)#div_bf=BeautifulSoup(res.text)soup=BeautifulSoup(res.text,'html.parser')#确定输出数组result=[]foriteminsoup.find_all("article",{"class":"blog-list-box"}):#提取文章标题#打印(item.find(“h4”).text.strip())#提取文章地址链接#print(item.find("a").get('href'))data=[]data.append(item.find("h4").text.strip())data.append(item.find("a").get('href'))result.append(data)df=pd.DataFrame(result,columns=['文章标题','文章地址'])#调用函数将数据写入表格blogOutput(df,'F:/blog_result.csv')print('输出完成')编码完成后开始运行,如下图,运行(快捷键F5)。提示输出完成,可以查看导出的文件。好的,得到数据!!!Python方法的演示就那么多(毕竟我不擅长),还是看Java小弟吧。4、Java实现方法Java操作使用Jsoup库,本质上是操作Dom。一白教程网站(友情链接):https://www.yiibai.com/jsoup/jsoup-quick-start.html4.1,环境,库包JsoupMaven:org.jsoupjsoup1.11.24.2、代码示例定义BlogVoclasspublicclassBlogVoimplementsSerializable{/***文章标题*/privateStringtitle;/***文章地址*/privateStringurl;@Excel(colName="文章标题",sort=1)publicStringgetTitle(){返回标题;}publicvoidsetTitle(Stringtitle){this.title=title;}@Excel(colName="文章标题",sort=2)publicStringgetUrl(){返回url;}publicvoidsetUrl(Stringurl){this.url=url;}}服务接口/***获取提取的博客信息**@return*/ListgetBlogList();/***导出csv文件**@paramhttpServletResponse*@throwsException*/voidexport(HttpServletResponsehttpServletResponse)throwsException;serviceImpl实例@OverridepublicListgetBlogList(){Listlist=newArrayList<>();try{Documentdocument=Jsoup.connect("https://blog.csdn.net/weixin_43770545").timeout(20000).get();元素e=document.getElementsByClass("博客列表框");元素h4=e.select(".blog-list-box-top").select("h4");元素a=e.select(".blog-list-box").select("a");列表<字符串>h4List=newArrayList<>();列表aList=newArrayList<>();h4.forEach(item->{h4List.add(item.text());});a.forEach(item->{Stringhref=item.attr("href");aList.add(href);});for(inti=0;iobjClass,ListdataList,HttpServletResponseresponse,StringfileName)throwsException{ResponseInit(response,fileName);类excelClass=Class.forName(objClass.toString().substring(6));方法[]方法=excelClass.getMethods();MapmapCol=newTreeMap<>();MapmapMethod=newTreeMap<>();对于(方法方法:方法){Excelexcel=method.getAnnotation(Excel.class);如果(excel!=null){mapCol.put(excel.sort(),excel.colName());mapMethod.put(excel.sort(),method.getName());}}HSSFWorkbookwb=newHSSFWorkbook();POIBuildBody(POIBuildHead(wb,"sheet1",mapCol),excelClass,mapMethod,(List)dataList);POIOutPutStream(响应,wb);}publicHSSFSheetPOIBuildHead(HSSFWorkbookwb,StringsheetName,MapmapCol){HSSFSheetsheet01=wb.createSheet(sheetName);HSSFRow行=sheet01.createRow(0);HSSFCell细胞;诠释我=0;for(Map.Entryentry:mapCol.entrySet()){cell=row.createCell(i++);cell.setCellValue(entry.getValue());}返回sheet01;}publicvoidPOIBuildBody(HSSFSheetsheet01,ClassexcelClass,MapmapMethod,ListdataList)throwsException{HSSFRowr=空;HSSFCellc=null;if(dataList!=null&&dataList.size()>0){for(inti=0;ientry:mapMethod.entrySet()){c=r.createCell(j++);对象obj=excelClass.getDeclaredMethod(entry.getValue()).invoke(dataList.get(i));c.setCellValue(obj==null?"":obj+"");}}}}}PostMan测试导出,效果如下哦,是的。虽然数据导出了,但是发现了一个问题。数据少?之前用python得到的数据明显是90多条。为什么这次只有20多个请求?这有点奇怪。仔细看了界面,原来是页面改成了加载缓慢。滑动到底部时请求分页。哇,原来如此。不过,既然已经看到界面了,那么……用postMan调白。我的giao,我是直接拿到数据的……所以,还有一个办法。就是直接通过Http请求这个接口,设置页数大一些。示例代码如下:publicListblogHttp(){Listlist=newArrayList<>();Strings=HttpClientUtils.doGetRequest("https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=300&businessType=blog&orderby=&noMore=false&username=weixin_43770545",null,null,无效的);RespDTOblogDTO=JSON.parseObject(s,RespDTO.class);DataEntitydata=blogDTO.getData();data.getList().forEach(item->{BlogVoblogVo=newBlogVo();blogVo.setUrl(item.getUrl());blogVo.setTitle(item.getTitle());list.add(blogVo);});returnlist;}效果如下,自己试试吧。知道……害处,还是先这样吧!不要学坏东西...