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使用multiprocessing创建进程的方法
Jun 04 Python
深入理解python多进程编程
Jun 12 Python
python实现简单中文词频统计示例
Nov 08 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
python实现旋转和水平翻转的方法
Oct 25 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
scrapy redis配置文件setting参数详解
Nov 18 Python
Python爬虫新手入门之初学lxml库
Dec 20 Python
python数字图像处理之图像自动阈值分割示例
Jun 28 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 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
Jquery判断$(&quot;#id&quot;)获取的对象是否存在的方法
2013/09/25 Javascript
jquery动态添加option示例
2013/12/30 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
实践中学习AngularJS表单
2016/03/21 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
Vue 打包体积优化方案小结
2020/05/20 Javascript
python实现发送和获取手机短信验证码
2016/01/15 Python
让python在hadoop上跑起来
2016/01/27 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
python的socket编程入门
2018/01/29 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Django中URL的参数传递的实现
2019/08/04 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
行政副总岗位职责
2014/02/23 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
模范教师材料大全
2014/12/16 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
详解Python牛顿插值法
2021/05/11 Python