Python爬取APP下载链接的实现方法


Posted in Python onSeptember 30, 2016

首先是准备工作

Python 2.7.11:下载python

Pycharm:下载Pycharm

其中python2和python3目前同步发行,我这里使用的是python2作为环境。Pycharm是一款比较高效的Python IDE,但是需要付费。

实现的基本思路

首先我们的目标网站:安卓市场

点击【应用】,进入我们的关键页面:

Python爬取APP下载链接的实现方法

跳转到应用界面后我们需要关注三个地方,下图红色方框标出:

Python爬取APP下载链接的实现方法

首先关注地址栏的URL,再关注免费下载按钮,然后关注底端的翻页选项。点击“免费下载”按钮就会立即下载相应的APP,所以我们的思路就是拿到这个点击下载的连接,就可以直接下载APP了。

编写爬虫

第一个需要解决的点:我们怎么拿到上面说的下载链接?这里不得不介绍下浏览器展示网页的基本原理。说简单点,浏览器是一个类似解析器的工具,它得到HTML等代码的时候会按照相应的规则解析渲染,从而我们能够看到页面。

这里我使用的是谷歌浏览器,对着页面右键,点击“检查”,可以看到网页原本的HTML代码:

Python爬取APP下载链接的实现方法

看到眼花缭乱的HTML代码不用着急,谷歌浏览器的审查元素有一个好用的小功能,可以帮我们定位页面控件对应的HTML代码

位置:

Python爬取APP下载链接的实现方法

如上图所示,点击上方矩形框中的小箭头,点击页面对应的位置,在右边的HTML代码中就会自动定位并高亮。

接下来我们定位到下载按钮对应的HTML代码:

Python爬取APP下载链接的实现方法

可以看到按钮对应的代码中,存在相应的下载链接:【/appdown/com.tecent.mm】,加上前缀,完整的下载链接就是 http://apk.hiapk.com/appdown/com.tecent.mm

首先使用python拿到整个页面的HTML,很简单,使用“requests.get(url) ” ,url填入相应网址即可。

Python爬取APP下载链接的实现方法

接着,在抓取页面关键信息的时候,采取“先抓大、再抓小”的思路。可以看到一个页面有10个APP,在HTML代码中对应10个item:

Python爬取APP下载链接的实现方法

而每个 li 标签中,又包含各自APP的各个属性(名称、下载链接等)。所以第一步,我们将这10个 li 标签提取出来:

def geteveryapp(self,source):
  everyapp = re.findall('(<li class="list_item".*?</li>)',source,re.S)
  #everyapp2 = re.findall('(<div class="button_bg button_1 right_mt">.*?</div>)',everyapp,re.S)
  return everyapp

这里用到了简单的正则表达式知识

提取 li 标签中的下载链接:

def getinfo(self,eachclass):
  info = {}
  str1 = str(re.search('<a href="(.*?)">', eachclass).group(0))
  app_url = re.search('"(.*?)"', str1).group(1)
  appdown_url = app_url.replace('appinfo', 'appdown')
  info['app_url'] = appdown_url
  print appdown_url
  return info

接下来需要说的难点是翻页,点击下方的翻页按钮后我们可以看到地址栏发生了如下变化:

Python爬取APP下载链接的实现方法

Python爬取APP下载链接的实现方法

豁然开朗,我们可以在每次的请求中替换URL中对应的id值实现翻页。

def changepage(self,url,total_page):
  now_page = int(re.search('pi=(\d)', url).group(1))
  page_group = []
  for i in range(now_page,total_page+1):
   link = re.sub('pi=\d','pi=%s'%i,url,re.S)
   page_group.append(link)
  return page_group

爬虫效果

关键位置说完了,我们先看下最后爬虫的效果:

Python爬取APP下载链接的实现方法

在TXT文件中保存结果如下:

Python爬取APP下载链接的实现方法

直接复制进迅雷就可以批量高速下载了。

附上全部代码

#-*_coding:utf8-*-
import requests
import re
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

class spider(object):
 def __init__(self):
  print u'开始爬取内容'
 def getsource(self,url):
  html = requests.get(url)
  return html.text

 def changepage(self,url,total_page):
  now_page = int(re.search('pi=(\d)', url).group(1))
  page_group = []
  for i in range(now_page,total_page+1):
   link = re.sub('pi=\d','pi=%s'%i,url,re.S)
   page_group.append(link)
  return page_group

 def geteveryapp(self,source):
  everyapp = re.findall('(<li class="list_item".*?</li>)',source,re.S)
  return everyapp

 def getinfo(self,eachclass):
  info = {}
  str1 = str(re.search('<a href="(.*?)">', eachclass).group(0))
  app_url = re.search('"(.*?)"', str1).group(1)
  appdown_url = app_url.replace('appinfo', 'appdown')
  info['app_url'] = appdown_url
  print appdown_url
  return info

 def saveinfo(self,classinfo):
  f = open('info.txt','a')
  str2 = "http://apk.hiapk.com"
  for each in classinfo:
   f.write(str2)
   f.writelines(each['app_url'] + '\n')
  f.close()

if __name__ == '__main__':

 appinfo = []
 url = 'http://apk.hiapk.com/apps/MediaAndVideo?sort=5&pi=1'
 appurl = spider()
 all_links = appurl.changepage(url, 5)
 for link in all_links:
  print u'正在处理页面' + link
  html = appurl.getsource(link)
  every_app = appurl.geteveryapp(html)
  for each in every_app:
   info = appurl.getinfo(each)
   appinfo.append(info)
 appurl.saveinfo(appinfo)

总结

选取的目标网页相对结构清晰简单,这是一个比较基本的爬虫。代码写的比较乱请见谅,以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有问题大家可以留言交流。

Python 相关文章推荐
Python全局变量操作详解
Apr 14 Python
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
python脚本作为Windows服务启动代码详解
Feb 11 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
python基于递归解决背包问题详解
Jul 03 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
Python如何使用函数做字典的值
Nov 30 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
Python脚本实现12306火车票查询系统
Sep 30 #Python
Python ldap实现登录实例代码
Sep 30 #Python
python之Socket网络编程详解
Sep 29 #Python
python 排序算法总结及实例详解
Sep 28 #Python
一些常用的Python爬虫技巧汇总
Sep 28 #Python
Python三级目录展示的实现方法
Sep 28 #Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 #Python
You might like
php生成zip压缩文件的方法详解
2013/06/09 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
Python tkinter label 更新方法
2018/10/11 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
捷科时代的软件测试笔试题
2015/11/09 面试题
先进德育工作者事迹材料
2014/01/24 职场文书
优秀本科生求职推荐信
2014/02/24 职场文书
农村葬礼主持词
2014/03/31 职场文书
承诺函格式模板
2015/01/21 职场文书
质量负责人岗位职责
2015/02/15 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python
Mysql案例刨析事务隔离级别
2021/09/25 MySQL