# google_play **Repository Path**: Emilya/google_play ## Basic Information - **Project Name**: google_play - **Description**: 谷歌商店爬虫,抓取apps、games分类下所有的详情写入mysql - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-05-08 - **Last Updated**: 2024-06-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: MySQL ## README # google_play #### 介绍 google_store.py顾名思义就是对谷歌商店数据抓取的一个程序,我们只需要抓取商店中的apps和games分类每个应用下的详情信息, 详情信息主要包含:包名(app_id)、标题(title)、评论数(reviews)、下载数(download)、开发者邮箱(email)、开发者地址(address)、 购买方式(free_tag)、所属分类(classify),程序可支持ip代理、随机UA等方式应对反爬机制,入库操作加了线程锁, redis加了乐观锁+事务实现原子性操作和数据隔离,日志文件也做了切割和归档的。 google play上没有查看某个分类下全部数据的入口,目前该程序的抓数据思路主要是有2个方面,大体思路都是差不多的,只是做了些细分。 1.通过对应分类链接获取分类下所有数据,并循环模拟点击详情抓取每个包名下的详情信息写入数据库,并在当前循环中嵌套一层for循环获取详情右侧的其它数据(一般有:其它推荐(More by Google LLC)、相似应用(Similar apps))将包名也就是app_id先存入redis的set集合中,等外循环执行结束后调用处理缓存数据的函数对应用数据进行处理(不直接处理再调用自己的原因是为了避免for循环多层嵌套发生递归过深报错的一个方案),处理的方式与前面的逻辑差不多的,不同的地方就在于是直接循环缓存中的包名,然后模拟点击详情获取详情信息写入数据库,将当前遍历的包名从缓存中移除,然后再嵌套for循环获取其他数据存入redis的set集合,外循环结束后,判断redis的set集合数据是否为0,不为0则调用自身,为0则调用获取某分类函数重新处理,制造死循环不断抓取数据(google play数据会不定期更新)。 2.通过数据库维护的关键词模拟模糊搜索抓取数据。程序在启动的时候会先将数据库表中的数据写入到redis缓存列表上,然后循环遍历缓存列表数据,模拟关键词搜索遍历搜索结果所有数据,模拟点击详情获取详情信息写入数据库,并在当前循环中嵌套一层for循环获取详情右侧的其它数据(一般有:其它推荐(More by Google LLC)、相似应用(Similar apps))将包名也就是app_id先存入redis的set集合中,等外循环执行结束后,清除缓存中的关键词列表(避免读取不到新加的关键词),再调用自己制造死循环不断抓取数据(google play数据会不定期更新)。 #### 软件架构 python3+mysql+redis+dbutils+BeautifulSoup+多线程 #### 环境准备 1.需要安装nodejs(version-14.21.3)python3、mysql(8.0+)、redis(5.0.14),版本信息只是参考。 2.安装程序需要的python库,有以下: ①pip3 install beautifulsoup4 ②sudo pip3 install pymysql ③pip install certifi、pip install cryptography、pip install pyOpenSSL ④上面可能会安装报错,报错的话就升级pip,python3 -m pip install --upgrade pip ⑤yum install python-requests ⑥pip3 install cryptography -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com ⑦pip3 install urllib3 #### 运行方式 后台运行命令:nohup python -u google_store.py > google_store.log 2>&1 & 因为现在加入了supervisorctl进行管理,所以启动不需要使用上面的方式,通过supervisorctl命令启动:supervisorctl start google_store,google_store为需要启动的进程名称,在xx.ini配置文件中program的值。 附带supervisorctl说明: 一般在linux中运行某个进程的时候,通过start、stop、restart以及reload进行运行,将其配置的服务放置在/etc/supervisord.d/的目录下。 1.supervisorctl status :查看所有被管理的进程状态,运行状态(RUNNING、FATAL、STOPPED、STARTING),如果某个被管理的程序出现stopped的话,该程序挂掉后是不会被监听到以及实现重启的,这点需要注意下。 如需查看某个子进程则:supervisorctl status google_store 2.关闭单个子进程 : supervisorctl stop 子进程 3.关闭所有子进程: supervisorctl stop all 4.启动单个子进程: supervisorctl start 子进程 5.启动所有子进程: supervisorctl start all 6.重启单个子进程: supervisorctl restart 子进程 7.重新加载配置文件 supervisorctl reload 8.停止supervisord supervisorctl shutdown 9.启动supervisord supervisord -c /etc/supervisord.conf 或 supervisord supervisord.conf文件信息详见/etc/supervisord.conf 进程配置文件,命名都是xxx.ini,与supervisord.conf中files配置信息保持一致即可: [program:google_store] command=nohup python3 -u /data/google_shell/google_store.py > /data/google_shell/google_store.log 2>&1 & numprocs=1 priority=900 directory=/data/google_shell user=root autostart=true autorestart=true redirect_stderr=true stdout_logfile=none loglevel=info 上面的program、command、directory、user属性值请根据实际进行修改