申明:本文出自我自己的微信号python1024,属于个人原创。
先看下代码目录结构:
有三个.py文件,map_craw.py、stat.py、store.py分别的功能是爬取数据、数据分析、将爬取的数据存储入mysql数据库中,由于stat.py还没写完,这篇文章主要讲数据的爬取与存储。
这里的地图就是baidu map,如果是没有爬虫基础的同学先到CSDN里面搜一下,安装个Chrome浏览器,顺便在浏览器的右上角更多中找到更多工具—>扩展程序选项将JSONView扩展程序安装一下。
要想爬取数据首先要分析网站中你想要的数据在那里,有的可能直接就在前端接口页面中获取到,有的可能需要请求后端的接口。如果请求的是前端页面的接口,请求完以后需要对前端页面进行解析、提取拿到你想要的信息。常用的页面解析python包有xml、beautiful(bs4)等,提取的方式包括xpath定位、select选择器、CSS选择器等。通常在解析包里可以调用接口函数实现这几种提取方式。如果是请求后端接口的话,搞懂请求类型是get、post的哪一种(很简单在headers里查看一下Request Method即可),然后分析url的Query String Parameters参数。找到规律后,查看Reponse返回的类型。如果是html页面,那就和前端一样的方法去解析提取,如果返回的是JSON数据格式,你需要解析JSON数据得到你想要的信息(超级简单啊)。
我们这次爬取的信息就从搜索关键词火锅后所有城市的火锅店的信息。包括名称、地址、人均消费、电话、评论条数、全部评价分数等。
这次map的数据返回格式就是JSON。在Chrome浏览器中,右键点击检查Inspect,找到Network并点击,然后选择XHR选项。刷新一下抓取到一些数据包。首先找到哪些包返回的reponse包含你所需要的信息,然后查看这些包的Request请求中url的Query String Parameters参数的规律,找到这些规律你才能爬取所有页面的数据。
我们来看下面的代码,顶部是导的一些包,中间两句是连接数据库的下面讲,def是定义了一个work的函数,用来执行爬取的步骤。for语句是一个循环语句,目的是从第一页爬取到第几页,那边的2是爬取到第二页。如果有基础的人不需要解释,没有基础的就跟着看懂就好了,慢慢学就会知道了。其实我想说的是下面的url参数的分析,其他的东西都是可以查阅学到的。但分析url这件事却是需要你足够的耐性,才能发现它的规律,而且每个网站的接口参数是不同的,这是需要花费时间的最重要一步。
这些参数data其实还有很多(很多删掉了),可以实现更多的搜索方法,比如根据经纬度去搜索指定区域的火锅店。这里我只介绍几个重要的参数,wd:是指要搜索的关键词,这里是火锅(其实你可以替换成任意的,想爬什么就爬什么)。
c:是指城市的代码(这里同样需要找到规律,只要你知道baidu所有城市的代码,你就可以爬取所有城市的了,我有哦!很容易一搜一大把,需要你自己甑别)。pn和nn是重点啦,决定你爬取的页数啦,找到规律哦。当页数为第一页的时候,pn和nn都为0。当页数为第二页的时候pn为1,nn为10(是不是很好找),然而接下来你就入坑了,你只能爬到两页。
继续找规律你会发现当pn竟然没有等于2的,当pn等于3的时候,nn等于20,当pn等于4的时候,nn等于30。找到规律了吧,很坑吧(烦就不能好好的吗,一点都不能玩耍)。
接下来是页面的解析,在找到规律后将刚才在浏览器上看到的url用一个新的窗口打开,你就会发现数据是下面这样的(不是这样的那你就是人气大爆发了,被狗吃了,其实是你没在浏览器加入JSONView扩展程序)。
直接看代码,经过上面的分析可以得下面的代码,我们用requests库去发送请求,返回得到的reponse数据是json格式的。然后去分析发现我们要的信息其实在content下(页面很大,截图只截取了一小部分),content有很多条所以需要for循环遍历一下,然后发现数据都在ext中的detail_info下,就像下面代码那样取,然后信息又分别在下面name、poi_address等下面。通过下面的方式分别取出来(try是用来尝试一下可不可以取到,不会因为没取到报错,程序不能继续执行)。
下面headers是将爬虫程序伪装成一个浏览器请求头,url是基础的网址,因为是get请求,刚才解析的url参数会直接拼接在上面,然后形成一个巨长的url,这个url就是你刚才解析页面时复制的url。key_word就是你要爬取时搜索的关键词,下面for遍历其实你可以在上面key_word写多个,然后都爬。然后我开了5个线程加快爬取的速度,其实baidu很友好的,没有什么反爬机制。