python教程app 小米应用商店_一篇文章教会你用Python多线程获取小米应用商店App...

【一、项目背景】

小米应用商店给用户发现最好的安卓应用和游戏,安全可靠,可是要下载东西要一个一个的搜索太麻烦了。而已速度不是很快。

今天用多线程爬取小米应用商店的游戏模块。快速获取。

【二、项目目标】

目标 :应用分类 - 聊天社交 应用名称, 应用链接,显示在控制台供用户下载。

【三、涉及的库和网站】

1、网址:百度搜 - 小米应用商店,进入官网。

2、涉及的库:reques****ts、threading 、queue 、json、time

3、软件:PyCharm

【四、项目分析】

1、确认是否为动态加载。

通过页面局部刷新, 右键查看网页源代码,搜索关键字未搜到 。断定此网站为动态加载网站,需要抓取网络数据包分析。

2、使用chrome浏览器,F12抓取网络数据包。

1)抓取返回json数据的URL地址(Headers中的Request URL)。

http://app.mi.com/categotyAllListApi?page={}&categoryId=2&pageSize=30

2)查看并分析查询参数(headers中的Query String Parameters)。

page: 1

categoryId: 2

pageSize: 30

发现只有page再变,0 1 2 3 … … ,这样我们就可以通过控制page的直拼接多个返回json数据的URL地址。

【五、项目实施】

1、我们定义一个class类继承object,然后定义init方法继承self,再定义一个主函数main继承self。准备导入库,url地址和请求头headers。

import requests

from threading import Thread

from queue import Queue

import json

import time

class XiaomiSpider(object):

def __init__(self):

self.headers = {'User-Agent':'Mozilla/5.0'}

self.url = 'http://app.mi.com/categotyAllListApi?page={}&categoryId=15&pageSize=30'

def main(self):

pass

if __name__ == '__main__':

imageSpider = XiaomiSpider()

imageSpider.main()

2、定义队列,用来存放URL地址

self.url_queue = Queue()

3、URL入队列

def url_in(self):

# 拼接多个URL地址,然后put()到队列中

for i in range(67):

self.url.format((str(i)))

self.url_queue.put(self.url)

4、定义线程事件函数get_page(请求数据)

def get_page(self):

# 先get()URL地址,发请求

while True:

# 当队列不为空时,获取url地址

if not self.url_queue.empty():

url = self.url_queue.get()

html = requests.get(url,headers=self.headers).text

self.parse_page(html)

else:

break

5、定义函数parse_page 解析json模块,提取应用名称,应用链接内容。

# 解析函数

def parse_page(self,html):

app_json = json.loads(html)

for app in app_json['data']:

# 应用名称

name = app['displayName']

# 应用链接

link = 'http://app.mi.com/details?id={}'.format(app['packageName'])

d = { '名称' : name,'链接' : link }

print(d)

6、main方法, 定义t_list = [] 存放所有线程的列表。调用get_page多线程爬取。

def main(self):

self.url_in()

# 存放所有线程的列表

t_list = []

for i in range(10):

t = Thread(target=self.get_page)

t.start()

t_list.append(t)

7、for循环遍历列表,统一回收线程。

# 统一回收线程

for p in t_list:

p.join()

8、统计一下执行时间。

start = time.time()

spider = XiaomiSpider()

spider.main()

end = time.time()

print('执行时间:%.2f' % (end-start))

【六、效果展示】

1、运行程序。点击运行,将游戏名称,下载链接,执行时间,显示在控制台。

2、点击蓝色的网址可以直接去到下载页面下载应用,如下图所示。

【七、总结】

1、不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。

2、Python多线程优点。使用线程可以把占据长时间的程序中的任务放到后台去处,程序的运行速度可能加快。

3、单线程可以被抢占(中断),而已多线程就有了更多的选择。而已在其他线程正在运行时,线程可以暂时搁置(也称为睡眠)。可以释放一些珍贵的资源如内存占用。

4、大家也可以尝试在爬取其他分类,按照操作步骤,自己尝试去做。自己实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传感器发展历史,你知道吗?(图文并茂)

来源:北京物联网智能技术应用协会传感器与通信、计算机被称为现代信息技术的三大支柱和物联网基础,其应用涉及国民经济及国防科研的各个领域,是国民经济基础性、战略性产业之一。当前倍受国际关注的物联网、大数据、云计算技术,乃…

mysql 优化not null_mysql 优化之11:尽可能的使用 NOT NULL

除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。这看起来好像有点争议,请往下看。首先,问问你自己“Empty”和“NULL”有多大的区别(如果是INT,那就是0和NULL)?如果你觉得它们之间没有什…

python第六章函数课后答案_浙大PTA-Python题库 函数题(6-1~6-6)题解

其他各章题解链接如下浙大PTA-Python题库 编程题第一章(1-1~1-3)题解https://blog.csdn.net/zimuzi2019/article/details/107020657浙大PTA-Python题库编程题 第二章(2.1~2.14)题解https://blog.csdn.net/zimuzi2019/article/details/106984549浙大PTA-Python题库 编程题第三章…

我们为什么不能只相信建立在深度学习基础上的人工智能系统

来源:简书本文摘自:https://www.jianshu.com/p/55e1abcd896dGary Marcus介绍了如何实现通用智能以及为什么通用智能可能会让机器更安全。加里•马库斯(Gary Marcus)对深度学习的大肆宣传并不感冒。尽管这位纽约大学教授认为,这项技术在推进人…

matlab向量归一化_已知近似的特征值,求特征向量

对于矩阵A, 已知它的一个近似的特征值, .一般特征值问题在已知特征值后,可确定齐次线性方程 , 是一个齐次线性方程组,且有非零解,即可用null解得其解空间。然而, 在数值上行列式不严格为零,则无…

MVC防止xss攻击 ——Html.AntiForgeryToken的AJAX提交

1、在Html表单里面使用了Html.AntiForgeryToken()就可以阻止CSRF攻击。 2、相应的我们要在Controller中也要加入[ValidateAntiForgeryToken]过滤特性。该特性表示检测服务器请求是否被篡改。注意:该特性只能用于post请求,get请求无效。 3、至于JS&#x…

关于《重启人工智能》11条建议的思考

来源:人机与认知实验室马库斯和欧内斯特戴维斯在他们的新书《重启人工智能》(Rebooting AI)中主张开辟一条新的前进道路。他们相信,我们离获得这样的通用智能还差得很远,但他们也相信,我们最终能够做到这一点。We will also sugge…

cmd中加载java源文件_如何在cmd中编译和运行java源文件

如何在cmd中编译和运行java源文件首先写一个名为HelloWorld.java的java源文件,存储在如C:/java/src的地址,我们再假设待会要存储的位置是C:/java/bin,则我们做一下工作首先,进入cmd环境,输入”C:”回车进入…

python getattr和getattribute_详解Python中 __get__和__getattr__和__getattribute__的区别

引子假设我们有个类A,其中a是A的实例a.x时发生了什么?属性的lookup顺序如下:如果重载了__getattribute__,则调用.a.__dict__, 实例中是不允许有descriptor的,所以不会遇到descriptorA.__dict__, 也即a.__class__.__dict__ .如果遇到了descriptor,优先调用descriptor.沿着继承链…

Hbase随笔

大数据时代的数据量是超大规模的,传统的关系数据库已经很难存储和管理这些数据了,为了存储海量数据,我们有了HDFS,它可以把成千上万台服务器上的硬盘聚集成一块超级大的硬盘,为了让这些数据产生价值,我们有…

《2019中国硬科技发展白皮书》发布,中美硬科技创新指数PK

来源:创新研究10月30日,在2019全球硬科技创新大会上,《2019中国硬科技发展白皮书》正式发布。白皮书从综述篇、科技篇、产业篇和城市篇四个部分,系统论述了发展硬科技的时代背景、硬科技的各领域突破和进展情况、国内各城市硬科技…

JAVA编写提示用户输入投资额_java(计算银行存款总额(要求输入错误时,提示重新输入))...

【任务一】:编写一个简单 Java 程序,计算银行年存款的本息。 要求:程序运行后要求用户输入存款本金、年利率和存款年限,最后程序计算并输出相应年限后存款的金额。相应 的计算公式为:存款总额本金 * (1 利率)存款年限…

这一次,脑机接口可以实时读取人类脑中画面了?

来源:机器之心由俄罗斯脑机接口公司 Neurobotics、莫斯科物理技术学院(MIPT)研发的一种全新脑机接口算法最近被公之于众,它可以利用人工神经网络和脑电图将人类大脑中的图像实时显示在计算机屏幕上。而且,与马斯克脑机…

python访问网页变量_Python 如何访问外围作用域中的变量

在表达式中引用变量时,Python 会按照如下的顺序遍历各个作用域,寻找该变量:当前函数作用域任何外围作用域(比如包含当前函数的其他函数)global 作用域,即代码所在的模块的作用域如果上述作用域内都找不到变量,就会报 N…

什么时候使用CountDownLatch

正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解…

java父包引用_父类引用指向子类对象(java)

从对象的内存角度来理解试试.假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.现在通过代码来看看内存的分配情况:Father f new Father();//系统将分配1M内存.Son s new Son();//系统将分配1.5M内存!因为子类中有一个隐…

科技角逐:中美的人工智能布局

来源:人机与认知实验室2017年以来,与人工智能相关的国家级战略密集出台,社会关于人工智能的大讨论激烈展开,各国政府关于人工智能发展的思路也逐渐清晰。中美作为两大科技强国,都在人工智能领域投入巨大,有…

python中scale_Python中的Log-scale mathplotlib?

我试图拟合对数正态曲线,但我不知道如何将y(和x轴)更改为对数刻度?我尝试使用logspace而不是linspace,但是遇到了一个错误OverflowError: cannot convert float infinity to integer我试过了:^{pr2}$但这似乎也不管用。我附上了我…

akka kafka java_当使用websocket连接时,使用akka-stream-kafka从kafka主题获取最后一条消息...

使用David van Geest非常巧妙地描述的方法,我能够避免在客户端连接时获取任何上游数据here归结为在Consumer上有一个BroadcastHub:val liveSource Consumer.plainSource(consumerSettings, Subscriptions.topics(topic1, topic2)).map(kafkaObject >…

android px,dp,sp大小转换工具

package com.voole.playerlib.util;import android.content.Context;/*** Android大小单位转换工具类<br/>* * float scale context.getResources().getDisplayMetrics().density;*/ public class DisplayUtil {/*** 将px值转换为dip或dp值&#xff0c;保证尺寸大小不变…