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 相关文章推荐
gearman的安装启动及python API使用实例
Jul 08 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
解决.ui文件生成的.py文件运行不出现界面的方法
Jun 19 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
python实现串口通信的示例代码
Feb 10 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
May 20 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
python 元组和列表的区别
Dec 30 Python
Python paramiko使用方法代码汇总
Nov 20 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
php实现源代码加密的方法
2015/07/11 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
RequireJS入门一之实现第一个例子
2015/09/30 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
深入理解ES6中let和闭包
2018/02/22 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
python Pandas 读取txt表格的实例
2018/04/29 Python
Python对数据进行插值和下采样的方法
2018/07/03 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
flask开启多线程的具体方法
2020/08/02 Python
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
365 Tickets英国:全球景点门票
2019/07/06 全球购物
《蓝色的树叶》教学反思
2014/02/24 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
秋菊打官司观后感
2015/06/03 职场文书
SQL中的三种去重方法小结
2021/11/01 SQL Server