爬虫学习(二)--爬取360应用市场app信息
欢迎加入python学习交流群 667279387
爬虫学习
爬虫学习(一)—爬取电影天堂下载链接
爬虫学习(二)–爬取360应用市场app信息
代码环境:windows10, python 3.5
主要用的软件包:SQLAlchemy,re
初学爬虫,没有使用scrapy框架,而是自己简单打了一个框架。代码里面也没有考虑记录日志以及错误处理等方面的内容,只是能简单工作。如果需要可以在此源码的基础上面进行修改。源码下载地址在文章末尾。
1、分析网页源码
本次抓取主要抓取了app名字,下载次数,评分,开发公司,最新版本号,更新时间。
先打开一个具体的软件页面进行查看网页源码
http://zhushou.360.cn/detail/index/soft_id/77208
下面是截取含有具体信息的两个网页源码的片段。
<h2 id="app-name"><span title="360手机卫士-一键连免费wifi">360手机卫士-一键连免费wi...</span><cite class="verify_tag"></cite><cite class="white_tag"></cite></h2>
<div class="pf"> <span class="s-1 js-votepanel">8.8<em>分</em></span>
<span class="s-2"><a href="#comment-list" id="comment-num"><span class="js-comments review-count-all" style="margin:0;">0</span>条评价</a></span>
<span class="s-3">下载:187373万次</span>
<span class="s-3">15.82M</span>
<td width="50%"><strong>作者:</strong>北京奇虎科技有限公司</td>
<td width="50%"><strong>更新时间:</strong>2017-09-13</td><td><strong>版本:</strong>7.7.4<!--versioncode:257--><!--updatetime:2017-09-13--></td><td><strong>系统:</strong>Android 4.0.3以上</td> <td colspan="2"><strong>语言:</strong>中文</td>
本次解析也没有xpath解析,而是直接用正则来匹配。下面是正则匹配时用到的代码。
r_name = re.compile(u"<title>(.*?)_360手机助手</title>", re.DOTALL)
r_download_num = re.compile(u'<span class="s-3">下载:(.*?)次</span>', re.DOTALL)
r_score = re.compile(u'<span class="s-1 js-votepanel">(.*?)<em>分</em>', re.DOTALL)
r_author = re.compile(u"<strong>作者:</strong>(.*?)</td>", re.DOTALL)
r_version = re.compile(u"<strong>版本:</strong>(.*?)<!--", re.DOTALL)
r_update_time = re.compile(u"<strong>更新时间:</strong>(.*?)</td>", re.DOTALL)
下面是解析页面的用法
m = r_name.search(html)
app_name = m.group(m.lastindex).strip()
其他字段的解析基本类似。
2、设计数据库字段
这里是利用了SQLAlchemy来实现ORM。
class App360(BaseModel):__tablename__ = 'app360'id = Column(Integer, primary_key=True, autoincrement=True)soft_id = Column(Integer, nullable=False)name = Column(String(100), nullable=False)author = Column(String(50), nullable=False)download_num = Column(String(50), nullable=False)score = Column(Float, nullable=False)# comments_num = Column(Integer, nullable=False)update_time = Column(DateTime, nullable=False)version = Column(String(50))
数据库管理的代码,主要实现了数据库的初始化,以及数据的插入和查询。
class DbManager(object):def __init__(self, Dbstring):self.engine = create_engine(Dbstring, echo=True)self._dbSession = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=self.engine))def init_db(self):BaseModel.metadata.create_all(self.engine)def closeDB(self):self._dbSession().close()def getAppWithSoftId(self, soft_id):db_item = self._dbSession().query(App360).filter(App360.soft_id == soft_id).first()if db_item:return db_itemelse:return Nonedef saveAppItem(self, app_object):db_item = self._dbSession().query(App360).filter(App360.soft_id == app_object.soft_id).first()if not db_item:self._dbSession().add(app_object)self._dbSession().commit()
3、抓取页面
获取到一个页面里出来的所有app的soft_id
r_url = re.compile(u'<a sid="(.*?)" href=', re.DOTALL)def get_onePage_SoftId(url):res_html = do_request(url)soft_ids = r_url.findall(res_html)return soft_ids
获取单个app的详细信息
def get_app_detail(soft_id):db_item = db.getAppWithSoftId(soft_id)if not db_item:url = "http://zhushou.360.cn/detail/index/soft_id/" + str(soft_id)app_html = do_request(url)app_item = extract_details(app_html, soft_id)db.saveAppItem(app_object=app_item)
这里简单粗暴的用了多个循环来获取,实际考虑性能的话,此处应该优化 。后续有时间了再学习研究下怎么优化。
for url in start_urls:for i in range(50):url = "http://zhushou.360.cn"+url+"?page=%s"%iids = get_onePage_SoftId(url)for id in ids:get_app_detail(id)
获取到的数据截图如下:
源码下载地址:
链接:https://pan.baidu.com/s/1sl6xPEl 密码:k48g
————————————————————————————
后续经过改进,用了并行处理,快了很多,7000多条记录,大概10来分钟全部下载好了。
from utils import *
from concurrent import futures
from models import DbManager, App360def get_app_detail(soft_id):db_item = db.getAppWithSoftId(soft_id)if not db_item:url = "http://zhushou.360.cn/detail/index/soft_id/" + str(soft_id)app_html = do_request(url)app_item = extract_details(app_html, soft_id)db.saveAppItem(app_object=app_item)def get_onePage_SoftId(url):res_html = do_request(url)soft_ids = r_url.findall(res_html)if soft_ids:return soft_idselse:return []if __name__=="__main__":# 初始化数据库DB_CONNECT_STRING = 'mysql+pymysql://root:hillstone@localhost:3306/app?charset=utf8'db = DbManager(Dbstring=DB_CONNECT_STRING)db.init_db()for url in start_urls:for i in range(50):one_url = "http://zhushou.360.cn"+url+"?page=%s"%str(i)#ids = get_onePage_SoftId(url)executor = futures.ThreadPoolExecutor(max_workers=20)results = executor.map(get_app_detail, get_onePage_SoftId(one_url))
更新后的代码地址:
https://github.com/Zhanben/python/tree/master/360Spider
如果源码对你有用,请评论下博客说声谢谢吧~
欢迎加入python学习交流群 667279387
爬虫学习(二)--爬取360应用市场app信息相关推荐
- Python抓取360手机市场APP信息并做简单分析
初步学习了python的基本语法,然后结合项目写了一个爬虫程序,主要功能是爬取360应用市场的APP相关信息,这次简单介绍一下. 程序主题包括一个程序启动类,一个写数据库类,一个360市场app的信息 ...
- python爬取360手机助手APP信息
这是一个爬虫软件,用来爬取360应用市场,App软件信息,现阶段代码只能爬取下载量,如需爬取别的信息,请自行添加代码. 使用方法: 1.在D盘根目录新建.tet文件,命名为App_name,并把App ...
- python3 爬虫数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云——小猿搜题
python3 爬虫&数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云--小猿搜题 # 导入扩展库 import re # 正则表达式库 import collections ...
- python3 爬虫数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云——学霸君
python3 爬虫&数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云--学霸君 # 导入扩展库 import re # 正则表达式库 import collections # ...
- python3 爬虫数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云——作业帮
python3 爬虫&数据处理 爬取华为应用市场 APP应用评论(二)根据评论生成词云--作业帮 # 导入扩展库 import re # 正则表达式库 import collections # ...
- Python爬虫:爬取华为应用市场app数据
爬取华为应用商店的所有APP名称和介绍,因为页面数据是ajax异步加载的,所以要找到对应的接口去解析数据. 爬取华为应用市场app数据 一.分析网页 1. 分析主页 2. 分析appid 3. 分析u ...
- Python爬虫学习笔记 -- 爬取糗事百科
Python爬虫学习笔记 -- 爬取糗事百科 代码存放地址: https://github.com/xyls2011/python/tree/master/qiushibaike 爬取网址:https ...
- python3 爬虫 爬取华为应用市场 APP应用评论(一)爬取全部评论——学霸君
python3 爬虫 爬取华为应用市场 APP应用评论(一)爬取全部评论--学霸君 import requests import re import requests from bs4 import ...
- python3 爬虫 爬取华为应用市场 APP应用评论(一)爬取全部评论——作业帮
python3 爬虫 爬取华为应用市场 APP应用评论(一)爬取全部评论--作业帮 import requests import re import requests from bs4 import ...
最新文章
- k8s中几种port介绍
- c++ 多线程:线程句柄可以提前关闭,但是线程并没有关闭
- android bitmap裁剪中间,Android裁剪中心位图
- 修复40G的老IDE硬盘
- 6. lcd驱动1-硬件原理
- 数据、数据库、数据库管理系统、数据库系统的概念。
- matlab积分器,MATLAB_SIMULINK__积分器相关操作
- JavaScript之时间线(代码解释)
- PVC地板IMO船舶防火测试认证注意事项
- Js-函数作用域和块作用域
- 测试工程师职位要求汇总
- Cornerstone清除缓存
- IOS AutoFill Extension 使用
- 我的世界服务器自定义ui,自定义主菜单CustomMainMenu mod教程
- 项目绩效考核体系指标建设
- java树结构_Java数据结构:树(Tree)
- B端产品设计:价值主张与需求对应的价值
- 七月算法课程《python爬虫》第五课: scrapy spider的几种爬取方式
- 常见的HTTP方法有哪些?
- 不良资产评估 难点与问题分析