对于给定的大量APP,如何爬取与之对应的(应用市场)分类、描述的信息?且看下面分解。

1. 页面分析

当我们在豌豆荚首页搜索框输入微信后,会跳转到搜索结果的页面,其url为http://www.wandoujia.com/search?key=%微信。搜索结果一般是按相关性排序的;所以,我们认为第一条搜索结果为所需要爬取的。紧接着,点进去后会跳转到页面http://www.wandoujia.com/apps/com.tencent.mm,我们会发现豌豆荚的APP的详情页,是http://www.wandoujia.com/apps/ + APP package组成。

让我们退回到搜索结果页面,分析页面元素,如图:

所有搜索结果在

  • 无序列表标签中,每一个搜索结果在
  • 标签中。对应地,CSS选择器应为

    '#j-search-list>li::attr(data-pn)'

    接下来,我们来分析APP的详情页,APP的名称所对应的HTML元素如图:

    APP类别的如图:

    APP描述的如图:

    不难得到这三类元素所对应的CSS选择器

    .app-name>span::text

    .crumb>.second>a>span::text

    .desc-info>.con::text

    通过上面的分析,确定爬取策略如下:逐行读取APP文件,拼接搜索页面URL;

    分析搜索结果页面,跳转到第一条结果对应的详情页;

    爬取详情页相关结果,写到输出文件

    2. 爬虫实现

    分析完页面,可以coding写爬虫了。但是,若裸写Python实现,则要处理下载间隔、请求、页面解析、爬取结果序列化。Scrapy提供一个轻量级、快速的web爬虫框架,并很好地解决了这些问题;中文doc有比较详尽的介绍。

    数据清洗

    APP文件中,可能有一些名称不规整,需要做清洗:

    # -*- coding: utf-8 -*-

    import re

    def clean_app_name(app_name):

    space = u'\u00a0'

    app_name = app_name.replace(space, '')

    brackets = r'\(.*\)|\[.*\]|【.*】|(.*)'

    return re.sub(brackets, '', app_name)

    URL处理

    拿清洗后APP名称,拼接搜索结果页面URL。因为URL不识别中文等字符,需要用urllib.quote做URL编码:

    # -*- coding: utf-8 -*-

    from appMarket import clean

    import urllib

    def get_kw_url(kw):

    """concatenate the url for searching"""

    base_url = u"http://www.wandoujia.com/search?key=%s"

    kw = clean.clean_app_name(kw)

    return base_url % (urllib.quote(kw.encode("utf8")))

    def get_pkg_url(pkg):

    """get the detail url according to pkg"""

    return 'http://www.wandoujia.com/apps/%s' % pkg

    爬取

    Scrapy的爬虫均继承与scrapy.Spider类,主要的属性及方法:name,爬虫的名称,scrapy crawl命令后可直接跟爬虫的名称,即可启动该爬虫

    allowed_domains,允许爬取域名的列表

    start_requests(),开始爬取的方法,返回一个可迭代对象(iterable),一般为scrapy.Request对象

    parse(response),既可负责处理response并返回处理的数据,也可以跟进的URL(以做下一步处理)

    items为保存爬取后数据的容器,类似于Python的dict,

    import scrapy

    class AppMarketItem(scrapy.Item):

    # define the fields for your item here like:

    kw = scrapy.Field() # key word

    name = scrapy.Field() # app name

    tag = scrapy.Field() # app tag

    desc = scrapy.Field() # app description

    豌豆荚Spider代码:

    # -*- coding: utf-8 -*-

    # @Time : 2016/6/23

    # @Author : rain

    import scrapy

    import codecs

    from appMarket import util

    from appMarket.util import wandoujia

    from appMarket.items import AppMarketItem

    class WandoujiaSpider(scrapy.Spider):

    name = "WandoujiaSpider"

    allowed_domains = ["www.wandoujia.com"]

    def __init__(self):

    self.apps_path = './input/apps.txt'

    def start_requests(self):

    with codecs.open(self.apps_path, 'r', 'utf-8') as f:

    for app_name in f:

    yield scrapy.Request(url=wandoujia.get_kw_url(app_name),

    callback=self.parse_search_result,

    meta={'kw': app_name.rstrip()})

    def parse(self, response):

    item = AppMarketItem()

    item['kw'] = response.meta['kw']

    item['name'] = response.css('.app-name>span::text').extract_first()

    item['tag'] = response.css('.crumb>.second>a>span::text').extract_first()

    desc = response.css('.desc-info>.con::text').extract()

    item['desc'] = util.parse_desc(desc)

    item['desc'] = u"" if not item["desc"] else item["desc"].strip()

    self.log(u'crawling the app %s' % item["name"])

    yield item

    def parse_search_result(self, response):

    pkg = response.css("#j-search-list>li::attr(data-pn)").extract_first()

    yield scrapy.Request(url=wandoujia.get_pkg_url(pkg), meta=response.meta)

    APP文件里的应用名作为搜索词,也应被写在输出文件里。但是,在爬取时URL有跳转,如何在不同层级间的Request传递变量呢?Request中的meta (dict) 参数实现了这种传递。

    APP描述.desc-info>.con::text,extract返回的是一个list,拼接成string如下:

    def parse_desc(desc):

    return reduce(lambda a, b: a.strip()+b.strip(), desc, '')

    结果处理

    Scrapy推荐的序列化方式为Json。Json的好处显而易见:跨语言;

    Schema明晰,较于'\t'分割的纯文本,读取不易出错

    爬取结果有可能会有重复的、为空的(无搜索结果的);此外,Python2序列化Json时,对于中文字符,其编码为unicode。对于这些问题,可自定义Pipeline对结果进行处理:

    class CheckPipeline(object):

    """check item, and drop the duplicate one"""

    def __init__(self):

    self.names_seen = set()

    def process_item(self, item, spider):

    if item['name']:

    if item['name'] in self.names_seen:

    raise DropItem("Duplicate item found: %s" % item)

    else:

    self.names_seen.add(item['name'])

    return item

    else:

    raise DropItem("Missing price in %s" % item)

    class JsonWriterPipeline(object):

    def __init__(self):

    self.file = codecs.open('./output/output.json', 'wb', 'utf-8')

    def process_item(self, item, spider):

    line = json.dumps(dict(item), ensure_ascii=False) + "\n"

    self.file.write(line)

    return item

    还需在settings.py中设置

    ITEM_PIPELINES = {

    'appMarket.pipelines.CheckPipeline': 300,

    'appMarket.pipelines.JsonWriterPipeline': 800,

    }分配给每个类的整型值,确定了他们运行的顺序,按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内。---------------

    大家也可以加小编微信:tszhihu (备注:Python),拉大家到 Python爱好者社区 微信群,可以跟各位老师互相交流。谢谢。

    也可以关注微信公众号:Python爱好者社区 (ID:python_shequ)

python应用市场app爬虫_【Python实战】Scrapy豌豆荚应用市场爬虫相关推荐

  1. Python爬虫框架Scrapy豌豆荚应用市场爬虫

    1. 页面分析 当我们在豌豆荚首页搜索框输入微信后,会跳转到搜索结果的页面,其url为http://www.wandoujia.com/search?key=%微信.搜索结果一般是按相关性排序的:所以 ...

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

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

  3. python爬取app聊天信息_手把手教你爬取手机app中的信息

    使用工具:Fiddler+基础爬虫 Fiddler是一个抓包神器,用来检查电脑和互联网之间所有的通讯内容,而且比较简单容易上手,显示的格式也比较友好. 网页基本都会爬了,现在开始要想想如何去爬手机ap ...

  4. 11小时 python自动化测试从入门到_自动化测试实战宝典(Robot Framework+Python从小工到专家)...

    目录 第1部分 入门篇 第1章 大话测试行业 1.1 测试行业现状分析 1.2 未来发展趋势 1.3 测试工程师的核心竞争力 1.4 测试知识体系 1.5 测试发展能力图谱及推荐书单 1.6 本章总结 ...

  5. python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)

    原标题:[实战练习]Python3网络爬虫快速入门实战解析(上) 摘要 使用python3学习网络爬虫,快速入门静态网站爬取和动态网站爬取 [ 前言 ] 强烈建议:请在电脑的陪同下,阅读本文.本文以实 ...

  6. python嵩天课堂笔记_[Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周)

    [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) [Python机器学习]强化学习笔记(嵩天礼欣老师mooc第三周) 目录 强化学习 定义 马尔科夫决策过程 基本元素 值函数 最优值 ...

  7. 四全集学python选哪种电脑_“Python教程哪个版本最适合学习?“python教程全集

    python教程,求一套比较好的python教程 好不好主要先看你自己,理解能力样,有没有接触过编程,有没础,这很重要: 看教程,能不能先给你建立起知识体系框架,许多教程一上来就直接给你灌输知识很让人 ...

  8. python如何设置字体大小_[Python Basic]如何设置 Python 的运行环境

    一如既往地, 咱们不仅仅是学习 Python 的基础知识, 同时, 也按照2/8 规律学习关键知识的关键部分 - python 核心词汇 如何安装 Python 下载 Python 打开网址:http ...

  9. python小软件制作教程_[Python]手把手教程:Python制作番茄钟

    这篇文章是根据Udacity的免费课程 编程基础:Python所做的笔记,适合零基础学习Python 我们先了解这个番茄钟的概念,就是每隔一段固定的时间就提醒你休息一下,可能是播放一段音乐, 弹出一个 ...

最新文章

  1. 科研经验1:云笔记积累个人知识体系
  2. Apache的Rewrite规则详细介绍
  3. MySQL性能优化(八)
  4. Git 设置 SOCKS 代理
  5. Delphi中methodaddress的代码解析
  6. stata软件不出图_请问stata软件怎样做出像revman软件一样的森林图
  7. ubuntu16.04 远程控制win10
  8. bootstrapV4.6.0之flex布局与float布局:对比
  9. WPE(Winsock Packet Editor)
  10. 计算机应用基础公开课,计算机应用基础-公开课教案.doc
  11. Ubuntu下安装配置Phabricator
  12. 【TWVRP】基于matlab禁忌搜索和节约算法求解带时间窗的车辆路径规划问题【含Matlab源码 1229期】
  13. vue项目实战中的笔记
  14. 计算机组成原理--白中英版 全部知识点
  15. 字体编码—Unicode16进制编码转字符
  16. TCP 和 UDP 的区别
  17. vue 3 开发环境搭建
  18. C#: 数字经纬度和度分秒经纬度间的转换
  19. 【转】C++后台开发应该读的书
  20. css的语义---Cascading Style Sheet

热门文章

  1. win10 pip安装mmcv-full
  2. 清华大学计算机系录取分数浙江,清华在浙江录取专业志愿满足率100% 录取人数突破160...
  3. linux shell编程 ppt,Linux常用命令与Shell基本编程.ppt
  4. Scrapy-Redis 爬取快代理免费
  5. QDAS转换器中间XML格式说明文档
  6. C# GZip 压缩 / 解压
  7. CentOS 中安装使用 xmms 音乐播放器
  8. Quartz 在misfire模式[错失、补偿执行] 策略
  9. 牛顿-莱布尼茨公式的运用
  10. php内容管理系统 admini,BageCMS 开源网站内容管理系统 php版下载_BageCMS 开源网站内容管理系统 php版官方下载-太平洋下载中心...