当前位置: 首页 > 科技观察

如何分析博客中最流行的编程语言

时间:2023-03-18 18:30:26 科技观察

摘要:在这篇文章中,我们将分析各种博客相对于其Google排名的流行程度。所有代码都可以在github上找到。想法的来源我一直在思考各种博客每天有多少浏览量,什么编程语言最受博客阅读人群的欢迎。我还对他们在Google中的网站排名是否与他们的受欢迎程度直接相关感兴趣。为了回答这些问题,我决定做一个Scrapy项目,收集一些数据,然后对获取的信息进行具体的数据分析和数据可视化。***部分:Scrapy我们将在工作中使用Scrapy,因为它提供了一个干净而强大的框架,用于在处理此请求后抓取和管理反馈。我们还将使用Splash来解析需要处理的Javascript页面。Splash使用自己的Web服务器充当代理并在将其重定向到我们的爬虫进程之前处理Javascript响应。我没有在这里描述Scrapy设置,也没有描述Splash集成。您可以在此处找到Scrapy示例,并在此处找到Scrapy+Splash指南。获取相关博客的第一步显然是获取数据。我们需要编程博客的Google搜索结果。你看,如果我们开始自己谷歌,比如说“Python”,除了博客,我们还会得到很多其他东西。我们需要做的是做一些过滤,只保留特定的博客。幸运的是,有一种叫做Google的自定义搜索引擎(CSE)的东西可以做到这一点。还有一个网站www.blogsearchengine.org完全可以满足我们的需求,它将用户请求委托给CSE,以便我们可以查看其查询并重用它们。因此,我们要做的是访问www.blogsearchengine.org网站,搜索“python”,然后在旁边的ChromeDevTools中打开“网络”选项卡。我们将看到这张截图:突出显示的是blogsearchengine将搜索请求委托给Google,因此我们将复制它并在我们的抓取工具中使用它。博客爬虫类看起来像这样:classBlogsSpider(scrapy.Spider):name='blogs'allowed_domains=['cse.google.com']def__init__(self,queries):super(BlogsSpider,self)。__init__()self.queries=queries与典型的Scrapy爬虫不同,我们的方法重写了__init__方法,它接受一个额外的参数queries,它指定了我们要执行的查询列表。现在,最重要的部分是构建和执行这个实际查询。这个过程是在start_requests爬虫方法中执行的,我们很乐意覆盖它:defstart_requests(self):params_dict={'cx':['partner-pub-9634067433254658:5laonibews6'],'cof':['FORID:10'],'ie':['ISO-8859-1'],'q':['query'],'sa.x':['0'],'sa.y':['0'],'sa':['Search'],'ad':['n9'],'num':['10'],'rurl':['http://www.blogsearchengine.org/search.html?cx=partner-pub''-9634067433254658%3A5laonibews6&cof=FORID%3A10&ie=ISO-8859-1&''q=query&sa.x=0&sa.y=0&sa=Search'],'siteurl':['http://www.blogsearchengine.org/']}params=urllib.parse.urlencode(params_dict,doseq=True)url_template=urllib.parse.urlunparse(['https',self.allowed_domains[0],'/cse','',params,'gsc.tab=0&gsc.q=query&gsc.page=page_num'])forqueryinself.queries:forpage_numinrange(1,11):url=url_template.replace('query',urllib.parse.quote(query))url=url.replace('page_num',str(page_num))yieldSplashRequest(url,self.parse,endpoint='render.html',args={'wait':0.5})这里可以看到相当复杂的params_dict字典,其中控制是我们之前找到的GoogleCSEURL的所有参数。然后我们准备好url_template中的所有内容,除了已经填写的查询和页码。我们为每种编程语言请求10个页面,每个页面包含10个链接,因此每种语言100个不同的博客用于分析。在第42-43行,我使用了一个特殊的类SplashRequest而不是Scrapy自带的Request类。它将重定向逻辑包装在Splash库中,因此我们无需担心。非常整洁。***,这是解析器:defparse(self,response):urls=response.css('div.gs-title.gsc-table-cell-thumbnail')\.xpath('./a/@href').extract()gsc_fragment=urllib.parse.urlparse(response.url).fragmentfragment_dict=urllib.parse.parse_qs(gsc_fragment)page_num=int(fragment_dict['gsc.page'][0])query=fragment_dict['gsc.q'][0]page_size=len(urls)fori,urlinenumerate(urls):parsed_url=urllib.parse.urlparse(url)rank=(page_num-1)*page_size+iyield{'rank':rank,'url':parsed_url.netloc,'query':query}所有Scraper的核心和灵魂是解析器逻辑。有几种方法可以了解响应页面的结构并构建XPath查询字符串。您可以随时使用Scrapyshell来试验和调整您的XPath查询,而不是运行爬虫。但我更喜欢视觉方法。它需要再次使用GoogleChromeDeveloperConsole。只需右键单击要在爬虫中使用的元素,然后按检查。它将打开控制台并导航到您指定位置的HTML源代码。在这种情况下,我们希望获得实际的搜索结果链接。他们的源码定位是这样的:看这个元素的描述,我们要找的有一个.gsc-table-cell-thumbnailCSS类,它是.gs-title的子元素,所以我们把它放到响应对象的css方法中(第46行)。然后,我们只需要获取博客文章的URL。它可以通过'./a/@href'XPath字符串轻松访问,该字符串可以从我们的直接子元素的href属性中找到。(LCTT译注:此处图文不符)寻找流量数据接下来的任务是估算每个博客每天获得的页面浏览量。有多种方式可以获取此类数据,有免费的也有付费的。快速搜索后,出于简单和免费的原因,我决定使用网站www.statshow.com。爬虫会爬取这个网站,将我们上一步获取到的博客的URL作为这个网站的入参,获取他们的流量信息。爬虫的初始化是这样的:.blogs_data=blogs_datablogs_data应该是以下格式的字典列表:{"rank":70,"url":"www.stat.washington.edu","query":"Python"}。请求构造函数如下:defstart_requests(self):url_template=urllib.parse.urlunparse(['http',self.allowed_domains[0],'/www/{path}','','',''])forbloginself.blogs_data:url=url_template.format(path=blog['url'])request=SplashRequest(url,endpoint='render.html',args={'wait':0.5},meta={'blog':blog})yieldrequest这很简单,我们只需将字符串/www/web-site-url/添加到'www.statshow.com'URL。现在让我们看看解析器是什么样的:defparse(self,response):site_data=response.xpath('//div[@id="box_1"]/span/text()').extract()views_data=list(过滤器(lambdar:'$'notinr,site_data))ifviews_data:blog_data=response.meta.get('blog')traffic_data={'daily_page_views':int(views_data[0].translate({ord(','):None})),'daily_visitors':int(views_data[1].translate({ord(','):None}))}blog_data.update(traffic_data)yieldblog_data类似于博客解析器,我们只是通过StatShow示例的后页,找到包含DailyPageViews和DailyVisiters的元素。这两个参数决定了网站的受欢迎程度,我们的分析只使用页面浏览量。第二部分:分析这部分是分析我们收集的所有数据。然后,我们使用名为Bokeh的库可视化准备好的数据集。我没有在此处提供运行器和可视化的代码,但可以在GitHub存储库中找到它,包括您在本文中看到的所有内容以及其他所有内容。初始结果集包含一些偏差太大的数据,(如google.com、linkedin.com、oracle.com等)。他们显然不应该被考虑。尽管他们中的一些人有博客,但他们不是特定于语言的。这就是我们根据此StackOverflow答案中建议的方法过滤异常值的原因。语言流行度比较首先,让我们对所有语言进行正面比较,看看在前100名博客中,哪种语言的浏览量最多。这是执行此操作的函数:defget_languages_popularity(data):query_sorted_data=sorted(data,key=itemgetter('query'))result={'languages':[],'views':[]}popularity=[]fork,groupgroupby(query_sorted_data,key=itemgetter('query')):group=list(group)daily_page_views=map(lambdar:int(r['daily_page_views']),group)total_page_views=sum(daily_page_views)popularity.append((group[0]['query'],total_page_views))sorted_popularity=sorted(popularity,key=itemgetter(1),reverse=True)languages,views=zip(*sorted_popularity)result['languages']=languagesresult['views']=viewsreturnresult在这里,我们首先将我们的数据按照语言(字典中的关键字“query”)进行分组,然后使用python的groupby函数,这是一个从SQL借来的奇妙函数,从我们的一组条目中生成数据列表,每个代表某种编程语言。然后,在第14行,我们计算每种语言的页面浏览总数,并将('Language',rank)形式的元组添加到流行度列表中。循环后,我们按总浏览量对流行度数据进行排序,并将这些元组扩展为两个单独的列表,并将它们返回到结果变量中。原始数据集高度倾斜。我检查了发生了什么,并意识到如果我在blogsearchengine.org上搜索“C”,我会得到很多包含字母“C”的不相关链接。因此,我必须将C排除在分析之外。“R”和其他类似C的名称几乎不会出现这种情况:“C++”、“C”。所以如果去掉C,再看其他语言,可以看到下图:评测结论:Java日浏览量超过400万,PHP和Go超过200万,R和JavaScript也突破百万标记。每日页面浏览量和谷歌排名现在让我们看看每日页面浏览量和谷歌博客排名之间的联系。从逻辑上讲,不受欢迎的博客应该排名较低,但并不是那么简单,因为其他因素也会影响排名,例如,如果不受欢迎的博客上的文章较新,那么它很可能会排在第一位。数据准备按以下方式进行:defget_languages_popularity(data):query_sorted_data=sorted(data,key=itemgetter('query'))result={'languages':[],'views':[]}popularity=[]fork,groupgroupby(query_sorted_data,key=itemgetter('query')):group=list(group)daily_page_views=map(lambdar:int(r['daily_page_views']),group)total_page_views=sum(daily_page_views)popularity.append((组[0]['query'],total_page_views))sorted_popularity=sorted(popularity,key=itemgetter(1),reverse=True)languages,views=zip(*sorted_popularity)result['languages']=languagesresult['views']=viewsreturnresult这个函数接受爬取的数据和要考虑的语言列表。我们按语言流行度对数据进行排序。后来,在类似的语言分组循环中,我们构建了(rank,views_number)元组(ranks从1开始),它们被转换成2个单独的列表。然后将这对列表写入生成的字典。排在前8位的GitHub语言(除C外)如下:评估结论:我们看到所有图表的PCC(皮尔逊相关系数)远非1/-1,这表明每日浏览量与排名之间缺乏相关性.值得注意的是,在大多数图表(8个中的7个)中,相关性是负的,这意味着较低的排名会导致较低的网页浏览量。结论因此,根据我们的分析,Java是目前排名第一的编程语言,其次是PHP、Go、R和JavaScript。排名前8的语言在每日浏览量和谷歌排名方面都没有很强的相关性,所以即使你刚刚开始写博客,你仍然可以在搜索结果中获得很高的评价。不过,要成为受欢迎的博主究竟需要什么,可以留待另一次讨论。这些结果非常有偏见,如果不进行更多分析就不能过于认真。首先,最好在更长的时间内收集更多的流量信息,然后分析每日综合浏览量和排名的平均值(中值)。也许我稍后会回来讨论这个问题。