声明:

本文内容仅供学习python爬虫的同学用作学习参考!!!

如有错误,请评论指出,非常感谢!!!

1.使用环境

python 3.8

scrapy 2.5

mongodb

pycharm

2.通用爬虫CrawlSpider介绍

​ CrawlSpider是Scrapy提供的一个通用Spider。在Spider里,我们可以指定一些爬取规则来实现页面的提取,这些爬取规则由一个专门的数据结构Rule表示。Rule里包含提取和跟进页面的配置,Spider会根据Rule来确定当前页面中的哪些链接需要继续爬取、哪些页面的爬取结果需要用哪个方法解析等。

CrawlSpider继承自Spider类。除了Spider类的所有方法和属性,它还提供了一个非常重要的属性和方法。

  • rules,它是爬取规则属性,是包含一个或多个Rule对象的列表。每个Rule对爬取网站的动作都做了定义,CrawlSpider会读取rules的每一个Rule并进行解析。

  • parse_start_url(),它是一个可重写的方法。当start_urls里对应的Request得到Response时,该方法被调用,它会分析Response并必须返回Item对象或者Request对象。

    ​ 这里最重要的内容莫过于Rule的定义了,它的定义和参数如下所示:

class scrapy.contrib.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)

下面将依次说明Rule的参数。

  • link_extractor:是Link Extractor对象。通过它,Spider可以知道从爬取的页面中提取哪些链接。提取出的链接会自动生成Request。它又是一个数据结构,一般常用LxmlLinkExtractor对象作为参数,其定义和参数如下所示:

    class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractorallow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), restrict_css=(), tags=('a', 'area'), attrs=('href', ), canonicalize=False, unique=True, process_value=None, strip=True)
    

    allow是一个正则表达式或正则表达式列表,它定义了从当前页面提取出的链接哪些是符合要求的,只有符合要求的链接才会被跟进。deny则相反。allow_domains定义了符合要求的域名,只有此域名的链接才会被跟进生成新的Request,它相当于域名白名单。deny_domains则相反,相当于域名黑名单。restrict_xpaths定义了从当前页面中XPath匹配的区域提取链接,其值是XPath表达式或XPath表达式列表。restrict_css定义了从当前页面中CSS选择器匹配的区域提取链接,其值是CSS选择器或CSS选择器列表。还有一些其他参数代表了提取链接的标签、是否去重、链接的处理等内容,使用的频率不高。可以参考文档的参数说明:http://scrapy.readthedocs.io/en/latest/topics/link-extractors.html#module-scrapy.linkextractors.lxmlhtml。

  • callback:即回调函数,和之前定义Request的callback有相同的意义。每次从link_extractor中获取到链接时,该函数将会调用。该回调函数接收一个response作为其第一个参数,并返回一个包含Item或Request对象的列表。注意,避免使用parse()作为回调函数。由于CrawlSpider使用parse()方法来实现其逻辑,如果parse()方法覆盖了,CrawlSpider将会运行失败。

  • cb_kwargs:字典,它包含传递给回调函数的参数。

  • follow:布尔值,即TrueFalse,它指定根据该规则从response提取的链接是否需要跟进。如果callback参数为Nonefollow默认设置为True,否则默认为False

  • process_links:指定处理函数,从link_extractor中获取到链接列表时,该函数将会调用,它主要用于过滤。

  • process_request:同样是指定处理函数,根据该Rule提取到每个Request时,该函数都会调用,对Request进行处理。该函数必须返回Request或者None

以上内容便是CrawlSpider中的核心Rule的基本用法。下面我们利用CrawlSpider实现百度手机助手的爬取实例,来更好地理解Rule的用法。

3.具体实现

3.1 创建scrapy项目

​ 首先请确认上述使用环境已经正确安装

# 1.创建项目
scrapy startproject app_spider# 2.创建爬虫
cd app_spider
scrapy genspider baidu -t crawl www.xxx.com

3.2 爬取链接

https://shouji.baidu.com/software/

​ 打开上述链接,首页如下图所示,可以观察到app被分为十个大类,分别是:社交通讯、系统工具、理财购物…

3.3 Rule规则提取分类链接


​ 查看网页源码,可以发现有十个li标签,其中每一个标签代表一个类,每一个li标签中包含了这个类的详情链接,这里定义一个rule提取这十个链接。

Rule(LinkExtractor(allow=r'/software/\d+/', restrict_xpaths=('//*[@id="doc"]/ul')), callback='parse_item', follow=True),

​ 我相信根据第二节的介绍,你应该可以看懂这个rule的定义方法

3.4 Rule规则提取页码链接

​ 我们随便点进去一个链接,这里以社交通讯为例,点进去,下面有一个页码链接,如下图红色方框所示,可以发现社交通讯类一共有8页,这里载设计一个rule提取每一个类的页码链接如下:

Rule(LinkExtractor(allow=r'list_\d+.html', restrict_xpaths=('//*[@id="doc"]/div[3]/div[2]/ul')), callback='parse_item', follow=True),

3.5 Rule提取每一页的app链接

​ 打开每一页的源码可以发现,每一页有36个app,对应36个li标签,且app的详情链接也都在li标签中,所以再定义一个Rule提取36个li标签中app的详情链接。

Rule(LinkExtractor(allow=r'/software/\d+.html', restrict_xpaths=('//*[@id="doc"]/div[3]/div[1]/div/ul')), callback='parse_detail', follow=True),

3.6 提取app详情页面的信息


​ 每一个app的详情页面如上图所示,可以提取的信息有:app名称、安装包大小、版本号、下载次数、应用介绍、小图标的链接、安装包下载链接等;

​ 在items.py定义一个容器,如下所示:

class BaiDuItem(scrapy.Item):app_name = Field()version = Field()size = Field()download_num = Field()introduction = Field()file_urls = Field()image_urls = Field()

​ 然后在爬虫里面定义一个parse_detail函数提取信息,这里使用xpath提取数据,如下所示:

3.7 将数据存储到mongodb数据库

​ 在pipelines.py中定义一个管道,用来处理提交给管道的item信息,即把数据存储到mongodb数据库。

这里定义一个MongoPipeline类,如下所示:

class MongoPipeline(object):def __init__(self, mongo_uri, mongo_db):# MongoDB的ip和数据库名self.mongo_uri = mongo_uriself.mongo_db = mongo_dbself.conn = Redis(host='127.0.0.1', port=6379, db=0, password=123)# 借助from_crawler实现在初始化之前对settings参数调用@classmethoddef from_crawler(cls, crawler):return cls(mongo_uri=crawler.settings.get('MONGO_URI'),mongo_db=crawler.settings.get('MONGO_DB'))def open_spider(self, spider):self.client = pymongo.MongoClient(self.mongo_uri)self.db = self.client[self.mongo_db]def process_item(self, item, spider):name = item.__class__.__name__self.db[name].insert(dict(item))return itemdef close_spider(self, spider):self.client.close()

​ 同时在settings.py中定义mongo数据库配置信息和开启下载管道MongoPipeline:

MONGO_URI = 'localhost'
MONGO_DB = 'app_spider'ROBOTSTXT_OBEY = FalseITEM_PIPELINES = {'app_spider.pipelines.MongoPipeline': 300,
}

4.结果展示

​ 打开terminal终端,输入scrapy crawl baidu

​ 运行效果如下:

​ 查看mongo数据库信息,大概爬取了两千多条信息,部分信息如下所示:

5.附源码

码云地址https://gitee.com/als-sunshine-y/baidu1.git

可直接下载源码,解压后pycharm打开,终端输入:

scrapy crawl baidu

即可成功运行代码!如果运行成功的话,别忘了给博主点赞关注哈

scrapy爬虫之爬取百度手机助手app信息并保存至mongodb数据库(附源码)相关推荐

  1. python爬取360手机助手APP信息

    这是一个爬虫软件,用来爬取360应用市场,App软件信息,现阶段代码只能爬取下载量,如需爬取别的信息,请自行添加代码. 使用方法: 1.在D盘根目录新建.tet文件,命名为App_name,并把App ...

  2. 使用scrapy爬虫框架爬取慕课网全部课程信息

    爬取的链接: http://www.imooc.com/course/list 爬取的内容: 课程链接, 课程的图片url, 课程的名称, 学习人数, 课程描述 1.安装scrapy模块 pip in ...

  3. python爬取链家_python+scrapy爬虫(爬取链家的二手房信息)

    之前用过selenium和request爬取数据,但是感觉速度慢,然后看了下scrapy教程,准备用这个框架爬取试一下. 1.目的:通过爬取成都链家的二手房信息,主要包含小区名,小区周边环境,小区楼层 ...

  4. java爬虫爬取互联网上的各大影视网站---360影视(附源码下载)

    关于爬虫: 万维网上有着无数的网页,包含着海量的信息,无孔不入.森罗万象.但很多时候,无论出于数据分析或产品需求,我们需要从某些网站,提取出我们感兴趣.有价值的内容,但是纵然是进化到21世纪的人类,依 ...

  5. python爬取小游戏_如何用Python爬取小游戏网站,把喜欢的游戏收藏起来(附源码)...

    简介: Python 是一门简单易学且功能强大的编程语言,无需繁琐的配置,掌握基本语法,了解基本库函数,就可以通过调用海量的现有工具包编写自己的程序,轻松实现批量自动化操作,可以极大提高办公和学习效率 ...

  6. 一键爬取基金历年季度报数据,轻松搞定!附源码

    大家好,我是小一 今天的文章来自于朋友圈,发现大家对于基金报告的爬取也挺感兴趣,于是就抽时间复现了一下 爬虫的整体思路比较简单,代码量甚至都没有基金分析那篇的多,很适合入门的朋友参考学习 另外,这篇文 ...

  7. 如何用Python爬取小游戏网站,把喜欢的游戏收藏起来(附源码)

    简介: Python 是一门简单易学且功能强大的编程语言,无需繁琐的配置,掌握基本语法,了解基本库函数,就可以通过调用海量的现有工具包编写自己的程序,轻松实现批量自动化操作,可以极大提高办公和学习效率 ...

  8. python实战系列之爬取CSDN博客之星2020年度排名情况(附源码)

    前言 CSDN2020年度博客之星马上就要收尾了,你知道自己关注的博主排名实时变化吗?谁是你心目中的博客之星,让我们爬取各位博主的排名及各位博主的一些个人信息. 代码 直接上代码 # -*- codi ...

  9. python爬虫实例手机_Python爬虫实现爬取京东手机页面的图片(实例代码)

    实例如下所示: __author__ = 'Fred Zhao' import requests from bs4 import BeautifulSoup import os from urllib ...

最新文章

  1. MIT喊你来上课,深度学习课程,免费的那种 | 资源
  2. linux小窍门──设置时钟和时间
  3. linux 调优篇 :硬件调优(BIOS配置)* 壹
  4. amap vueamap 与_vue 使用高德地图vue-amap组件过程解析
  5. Python简易验证码生成程序
  6. NPOI Excel 单元格背景颜色对照表
  7. CUDA算法:MS-queue算法相关
  8. oracle如何查找谁删除了数据_一文看懂Oracle是如何闪回数据库的?
  9. 基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍
  10. Python——jieba优秀的中文分词库(基础知识+实例)
  11. 计算机组成原理实验数据通路,《计算机组成原理》实验报告——数据通路
  12. BJFU_数据结构习题_274六度空间理论
  13. panabit安装和默认密码
  14. linux 分区 intel raid,linux on intel sata raid
  15. 古往今来中国最经典的50句名言
  16. 最通俗易懂的讲解HTTPS的加密原理【多图、易懂】
  17. Python性能分析入门——cProfile、可视化、逐行分析、内存分析
  18. ExtJS初级教程之ExtJS Tree(三)
  19. windows10 家庭版 “当前账户已锁定“的解决方式
  20. ctrl跳转失败 studio uap_uap进不去,重装studio和uap都不能行,请大神给看看

热门文章

  1. 集运转运系统源码,快递物流一件代付系统源码
  2. rsyslog收集华为路由器日志通过ELK处理展示
  3. 什么是DAPP?DAPP和APP相比有什么区别?
  4. 明日方舟登录时服务器显示泰拉,明日方舟泰拉档案馆使用说明
  5. 哈登独得40分保罗复出 火箭主场103:98复仇魔术
  6. Oracle数据库练习2
  7. 【linux】查看环境变量|getenv setenv设置获取环境变量
  8. 简单的猜数字小游戏(1 ~ 100)
  9. OCR手写数字识别什么软件好用?介绍一种
  10. 彩色蟒蛇绘制。对 Python 蟒蛇的每个部分采用不同颜色,绘制一条彩色蟒蛇。