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

掘金15W沸点简单分析(1)

时间:2023-03-26 18:00:57 Python

数据分析的数据采集(只与网络爬虫有关)。本文继续从爬虫开始。但是这次使用Python。1、爬虫的另一种方式:①获取目标网页的URL;②发起HTTP请求获取网页数据;③使用各种方法解析网页,得到想要的数据;一般情况下,在步骤②中,不会去执行页面中的JS代码。有些网站使用Ajax异步加载一些数据,然后渲染到页面上;或者用JS对页面Dom做一些修改。这样就会导致步骤②请求的页面中缺少甚至没有目标数据。这就需要在获取到网页数据后执行页面中的JS代码。最早的是使用phantomjs+selenium。后来Chrome从headless模式中走出来,基本一直用Chrome。处理逻辑大致为:①请求获取网页,执行JS代码;②保存处理后的页面数据;③后续处理(分析网页获取数据)。1.1Selenium使用示例下面以掘金为例,获取本文下的所有评论。注意:虽然可以通过接口直接获取,但是我们假设数据是不能直接获取的,必须要执行js才能获取到目标数据。要使用Selenium+Chrome,首先需要下载Chrome版本对应的ChromeDriver。示例代码如下:self.driver.get(self.article_url)#等待评论列表出现WebDriverWait(self.driver,10).until(EC.presence_of_element_located((By.CLASS_NAME,'comment-list')))self.save_page()在使用Selenium控制Chrome加载网页时,通常会遇到这样的问题:网络延迟,导致目标数据没有及时下载,但此时网页已经保存时间。最简单的方法就是每次加载网页时调用一个类似time.sleep(5)的方法,但是这个方法简单粗暴。更好的方法是使用Selenium提供的WebDriverWait来处理。不要错过官方文档:selenium-python。1.2页面的后续处理渲染好的网页保存之后,接下来就是解析和提取数据了。这次我们使用XPath来解析数据。或者先分析网页数据的位置://div[@class="comment-list-box"]/div[contains(@class,"comment-list")]/div[@class="item"].为了处理方便,我们只获取一级评论用户和内容。示例代码如下:root=etree.HTML(page_source)comments=root.xpath('//div[@class="comment-list-box"]/div[contains(@class,"comment-list")]/div[@class="item"]')在评论中进行评论:username=self.fix_content(comment.xpath('.//div[@class="meta-box"]//span[@class="name"]/text()'))content=self.fix_content(comment.xpath('.//div[@class="content"]//text()'))print(f'{username}-->{content}')结果数据:2.获取掘金的沸点,我们直接看沸点的API接口。接口分析:沸点接口地址:https://apinew.juejin.im/reco...请求方式:POST请求参数类型及格式:JSON格式数据,{cursor:"0",//cursor.第一次请求为“0”,该字段将包含在请求响应中。后续请求可以直接使用id_type:4,//沸点类别??(没关系)limit:20,//页面大小sort_type:200//某种排序类型??(无关)}然后我们可以用Python模拟请求,得到沸点数据。我们使用requests来模拟请求,具体使用请参考官方文档。代码示例:HOT_URL='https://apinew.juejin.im/recommend_api/v1/short_msg/hot'json_form={'cursor':'0','id_type':4,'limit':20,'sort_type':200,}resp=requests.post(HOT_URL,json=json_form)print(resp.json())#可以正常返回数据#{'err_no':0,'err_msg':'success','data':[{'msg_id':'6864704084000112654','msg_Info':{'id':980761,'msg_id':'6864704084000112654','user_id':'2207475080373639','topic_id':'6824731:'6824731:11620'别我去找我女朋友了,你女朋友来了',2.1保存所有数据根据上面的例子,我们优化一下代码:defsave_pins(idx=0,cursor='0'):json_data={'id_type':4,'sort_type':200,'cursor':cursor,'limit':200#这个值没有限制,但是如果太大,服务器会报错,或者用户信息丢失等}resp=sess.post(url,json=json_data)ifresp.ok:resp_json=resp.json()withopen(f'json_data/pins-{idx:04}.json','w+')作为json_file:json_file.write(resp.content.decode('UTF-8'))#是否还有更多ifresp_json['err_no']==0andresp_json['err_msg']=='success':logging.debug(f'noerror,idx={idx}')ifresp_json['has_more']:logging.debug(f'hasmore,nextidx={idx+1}')time.sleep(5)save_pins(idx+1,cursor=resp_json['cursor'])else:#发生异常logging.warning(resp_json['err_msg'])logging.debug(f'sleep10s,retryidx={idx}')time.sleep(10)save_pins(idx,cursor)部分数据如下:源码已经上传到GitHub,Gitee3.后记至此,整个热点数据采集完成结束了。由于直接请求接口返回的数据,除了一些数据重复外,几乎不需要任何数据处理。3.1后续处理方案将数据简单处理后存入MySQL数据库,然后使用superset制作图表。3.2掘金热点限制分页限制的建议,最大限制为:20?对于未登录的用户,限制可见数据量。