应用宝爬虫原理
导语
本程序旨在实现对 应用宝 网站中的所有APP信息进行爬取,
一:主要思路
首先,对要爬取的网站进行分析:目标网站 应用宝 是个静态网站,而且需要下拉才会加载后续的软件,通过浏览器的分析工具分析网站的请求过程,并在网络监视器中观察得知每次加载更多时,请求的URL是有规律的,例如http://sj.qq.com/myapp/cate/appList.htm?orgame=1&categoryId=0&pageSize=20&pageContext=40,在全部软件的分项里,每次加载后,只有pageContext的参数会变,而且除了第一次加载40个软件,之后每次加载都是20软件,相应的加载软件的多少与pageContext参数的取值有直接关系。
另外,该网址请求的数据为JSON格式,这样问题转化为获取JSON数据,并解析出来。通过对网站的分析关于每个软件的名称,版本号,包名,下载量,评分等数据在网响应过程中都存在于响应时的JSON数据中,如此抓取数据的过程就比较简单了。
二:重要代码分析
获取目标网站,并用该网站的消息请求头伪造,同时设置变量ADD_NUM动态改变pageContext的值:
ADD_NUM = 0 UPLOAD_URL='http://sj.qq.com/myapp/cate/appList.htm?orgame=1&categoryId=0&pageSize=20&pageContext=' current_url = UPLOAD_URL + str(ADD_NUM) request = requests.get(current_url, headers=HEAD)
Python的Requests模块有一个内置的JSON解码器,获取JSON响应内容:
home_page_json = request.json()
观察得知:只要加载内容未完,响应里的count内容就必定大于0,由此为控制条件,且获取的JSON响应内容已经转化为Python的字典型数据了,直接通过键值对获取:
if home_page_json['count'] > 0: for item in home_page_json['obj']: app_name = item['appName'] app_version = item['versionName'] app_mark = item['averageRating'] app_download_num = item['appDownCount'] app_package_name = item['pkgName']
由于响应内容没有关于软件的详细信息,只能进入软件页获取,这时我用了Python里的Beautiful Soup模块,该模块可以解析网页,并提供定位内容的便捷接口,而每个软件页的URL也是有规律的,即http://sj.qq.com/myapp/detail.htm加上软件的包名作为参数:
payload = {'apkName': app_package_name} detail_request = requests.get('http://sj.qq.com/myapp/detail.htm', params = payload) soup = BeautifulSoup(detail_request.text,"html.parser") info=soup.select('.det-app-data-info')[0] for item2 in info.children: while item2.next != None: if item2.name == None: app_info += item2.replace('\r', ' ') item2 = item2.next else: break
最后将数据存储进指定csv文件中。
三:其他思路及总结
思路2:
可以用BeautifulSoup模块直接在每个软件页直接抓取信息,但这种方法抓取的评分和下载量只是大致的数据,并不是具体数据,而且要考虑不同的信息在不同的标签中,较为麻烦,最为最初的实现方法相比较而言我选择后者。
两种思路的比较:在效率方面第二种方法应该会快一点,因为第一种方法在获取软件详细信息时还是要经过BeautifulSoup这个步骤的,但第一种方法简单,一目了然,且爬取的数据量不大,效率对比的差距不会很大。