欢迎加入python学习交流群 667279387

爬虫学习

爬虫学习(一)—爬取电影天堂下载链接

爬虫学习(二)–爬取360应用市场app信息

代码环境:windows10, python 3.5

主要用的软件包:SQLAlchemy,re

初学爬虫,没有使用scrapy框架,而是自己简单打了一个框架。代码里面也没有考虑记录日志以及错误处理等方面的内容,只是能简单工作。如果需要可以在此源码的基础上面进行修改。源码下载地址在文章末尾。

1、分析网页源码

本次抓取主要抓取了app名字,下载次数,评分,开发公司,最新版本号,更新时间。

先打开一个具体的软件页面进行查看网页源码

  1. http://zhushou.360.cn/detail/index/soft_id/77208

下面是截取含有具体信息的两个网页源码的片段。

  1. <h2 id="app-name"><span title="360手机卫士-一键连免费wifi">360手机卫士-一键连免费wi...</span><cite class="verify_tag"></cite><cite class="white_tag"></cite></h2>
  2. <div class="pf"> <span class="s-1 js-votepanel">8.8<em></em></span>
  3. <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>
  4. <span class="s-3">下载:187373万次</span>
  5. <span class="s-3">15.82M</span>

  1. <td width="50%"><strong>作者:</strong>北京奇虎科技有限公司</td>
  2. <td width="50%"><strong>更新时间:</strong>2017-09-13</td>
  3. <td><strong>版本:</strong>7.7.4<!--versioncode:257--><!--updatetime:2017-09-13--></td>
  4. <td><strong>系统:</strong>Android 4.0.3以上</td> <td colspan="2"><strong>语言:</strong>中文</td>

本次解析也没有xpath解析,而是直接用正则来匹配。下面是正则匹配时用到的代码。

  1. r_name = re.compile(u"<title>(.*?)_360手机助手</title>", re.DOTALL)
  2. r_download_num = re.compile(u'<span class="s-3">下载:(.*?)次</span>', re.DOTALL)
  3. r_score = re.compile(u'<span class="s-1 js-votepanel">(.*?)<em>分</em>', re.DOTALL)
  4. r_author = re.compile(u"<strong>作者:</strong>(.*?)</td>", re.DOTALL)
  5. r_version = re.compile(u"<strong>版本:</strong>(.*?)<!--", re.DOTALL)
  6. r_update_time = re.compile(u"<strong>更新时间:</strong>(.*?)</td>", re.DOTALL)

下面是解析页面的用法

  1. m = r_name.search(html)
  2. app_name = m.group(m.lastindex).strip()

其他字段的解析基本类似。

2、设计数据库字段

这里是利用了SQLAlchemy来实现ORM。

  1. class App360(BaseModel):
  2. __tablename__ = 'app360'
  3. id = Column(Integer, primary_key=True, autoincrement=True)
  4. soft_id = Column(Integer, nullable=False)
  5. name = Column(String(100), nullable=False)
  6. author = Column(String(50), nullable=False)
  7. download_num = Column(String(50), nullable=False)
  8. score = Column(Float, nullable=False)
  9. # comments_num = Column(Integer, nullable=False)
  10. update_time = Column(DateTime, nullable=False)
  11. version = Column(String(50))

数据库管理的代码,主要实现了数据库的初始化,以及数据的插入和查询。

  1. class DbManager(object):
  2. def __init__(self, Dbstring):
  3. self.engine = create_engine(Dbstring, echo=True)
  4. self._dbSession = scoped_session(
  5. sessionmaker(
  6. autocommit=False,
  7. autoflush=False,
  8. bind=self.engine
  9. )
  10. )
  11. def init_db(self):
  12. BaseModel.metadata.create_all(self.engine)
  13. def closeDB(self):
  14. self._dbSession().close()
  15. def getAppWithSoftId(self, soft_id):
  16. db_item = self._dbSession().query(App360).filter(App360.soft_id == soft_id).first()
  17. if db_item:
  18. return db_item
  19. else:
  20. return None
  21. def saveAppItem(self, app_object):
  22. db_item = self._dbSession().query(App360).filter(App360.soft_id == app_object.soft_id).first()
  23. if not db_item:
  24. self._dbSession().add(app_object)
  25. self._dbSession().commit()

3、抓取页面

获取到一个页面里出来的所有app的soft_id

  1. r_url = re.compile(u'<a sid="(.*?)" href=', re.DOTALL)
  2. def get_onePage_SoftId(url):
  3. res_html = do_request(url)
  4. soft_ids = r_url.findall(res_html)
  5. return soft_ids

获取单个app的详细信息

  1. def get_app_detail(soft_id):
  2. db_item = db.getAppWithSoftId(soft_id)
  3. if not db_item:
  4. url = "http://zhushou.360.cn/detail/index/soft_id/" + str(soft_id)
  5. app_html = do_request(url)
  6. app_item = extract_details(app_html, soft_id)
  7. db.saveAppItem(app_object=app_item)

这里简单粗暴的用了多个循环来获取,实际考虑性能的话,此处应该优化 。后续有时间了再学习研究下怎么优化。

  1. for url in start_urls:
  2. for i in range(50):
  3. url = "http://zhushou.360.cn"+url+"?page=%s"%i
  4. ids = get_onePage_SoftId(url)
  5. for id in ids:
  6. get_app_detail(id)

获取到的数据截图如下:

源码下载地址:

链接:https://pan.baidu.com/s/1sl6xPEl 密码:k48g

————————————————————————————

后续经过改进,用了并行处理,快了很多,7000多条记录,大概10来分钟全部下载好了。

  1. from utils import *
  2. from concurrent import futures
  3. from models import DbManager, App360
  4. def get_app_detail(soft_id):
  5. db_item = db.getAppWithSoftId(soft_id)
  6. if not db_item:
  7. url = "http://zhushou.360.cn/detail/index/soft_id/" + str(soft_id)
  8. app_html = do_request(url)
  9. app_item = extract_details(app_html, soft_id)
  10. db.saveAppItem(app_object=app_item)
  11. def get_onePage_SoftId(url):
  12. res_html = do_request(url)
  13. soft_ids = r_url.findall(res_html)
  14. if soft_ids:
  15. return soft_ids
  16. else:
  17. return []
  18. if __name__=="__main__":
  19. # 初始化数据库
  20. DB_CONNECT_STRING = 'mysql+pymysql://root:hillstone@localhost:3306/app?charset=utf8'
  21. db = DbManager(Dbstring=DB_CONNECT_STRING)
  22. db.init_db()
  23. for url in start_urls:
  24. for i in range(50):
  25. one_url = "http://zhushou.360.cn"+url+"?page=%s"%str(i)
  26. #ids = get_onePage_SoftId(url)
  27. executor = futures.ThreadPoolExecutor(max_workers=20)
  28. results = executor.map(get_app_detail, get_onePage_SoftId(one_url))



更新后的代码地址:

https://github.com/Zhanben/python/tree/master/360Spider

如果源码对你有用,请评论下博客说声谢谢吧~

欢迎加入python学习交流群 667279387

爬虫学习(二)--爬取360应用市场app信息的更多相关文章

  1. Python爬虫学习(二) ——————爬取前程无忧招聘信息并写入excel

    作为一名Pythoner,相信大家对Python的就业前景或多或少会有一些关注.索性我们就写一个爬虫去获取一些我们需要的信息,今天我们要爬取的是前程无忧!说干就干!进入到前程无忧的官网,输入关键字&q ...

  2. Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...

  3. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

  4. python爬虫学习(7) —— 爬取你的AC代码

    上一篇文章中,我们介绍了python爬虫利器--requests,并且拿HDU做了小测试. 这篇文章,我们来爬取一下自己AC的代码. 1 确定ac代码对应的页面 如下图所示,我们一般情况可以通过该顺序 ...

  5. 爬虫学习--MOOC爬取豆瓣top250

    scrapy框架 scrapy是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松实现一个爬虫,用来抓取网页内容或者各种图片. scrapy E ...

  6. python爬虫学习之爬取全国各省市县级城市邮政编码

    实例需求:运用python语言在http://www.ip138.com/post/网站爬取全国各个省市县级城市的邮政编码,并且保存在excel文件中 实例环境:python3.7 requests库 ...

  7. python - 爬虫入门练习 爬取链家网二手房信息

    import requests from bs4 import BeautifulSoup import sqlite3 conn = sqlite3.connect("test.db&qu ...

  8. [python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  9. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...

随机推荐

  1. linux下安装opencv3.0

    查版本gcc --version 需>4.8python 2.7+cmake --version numpy 以上是必须的 linux下安装opencv3.0<pre>https:/ ...

  2. day7-集合

    一.定义变量是为了吹处理状态的变化,定义变量名是为了获取变量值.字符串.数字.列表.元组.字典都是为了更好的描述变量的状态1.可变不可变:变量名不变时,里面内容是否可以变化# 可变:列表.字典.修改变 ...

  3. day-5元组专区

    *元组,元素不可被修改,不能被增加或者删除tupletu = (11,22,33,44)tu.count(22),获取指定元素在元组中出现的次数tu.index(22),索引22在元组中位置(左到右第 ...

  4. vue之注册自定义的全局js方法

    前端开发的时候,总会需要写一些js方法,在vue框架中为了方便使用,可以考虑注册一个全局的js方法,下面是注册步骤: 1.0 可以在assets文件中的js文件下面新建一个js文件,如:yun.js- ...

  5. LoadRunner具体流程

    创建负载测试场景场景目标:模拟10个用户同时登陆.搜索航班.购买机票.查看航班路线并退出打开Controller并创建一个新场景1.打开HP LoadRunner2.打开Controller在Load ...

  6. 直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题

    直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题.近日工作中,要实现一个功能,那就是业务层方法里面实现自动缓存.编写业务的C#开发人员只关注如何将业务代码编写正确就可以了 ...

  7. java编程思想第四版第七章习题

    (略) (略) (略) (略) 创建两个带有默认构造器(空参数列表)的类A和类B.从A中继承产生一个名为C的新,并在C内创建一个B类的成员.不要给C编写构造器.创建一个C类的对象并观察其结果. pac ...

  8. 0MQ是会阻塞的,不要字面上看到队列就等同非阻塞。

    如果你是希望通过0MQ来做缓冲队列,非阻塞的效果,那你就必须清楚 0MQ Socket是会阻塞,你要搞清楚0MQ Socket与队列的关系. 官方协议文档规定了,一部分类型的 0MQ Socket为不 ...

  9. TypeError: Cannot read property '_t' of undefined (VUE + ElementUI + i18n)

    在使用vue的ElementUI库,在多语言时报错: TypeError: Cannot read property '_t' of undefined 错误是在点菜单栏时随机抛出的,F12抓不到,只 ...

  10. 5. 彤哥说netty系列之Java NIO核心组件之Channel

    你好,我是彤哥,本篇是netty系列的第五篇. 简介 上一章我们一起学习了如何使用Java原生NIO实现群聊系统,这章我们一起来看看Java NIO的核心组件之一--Channel. 思维转变 首先, ...