scrapy爬虫之爬取百度手机助手app信息并保存至mongodb数据库(附源码)
声明:
本文内容仅供学习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
:布尔值,即True
或False
,它指定根据该规则从response
提取的链接是否需要跟进。如果callback
参数为None
,follow
默认设置为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数据库(附源码)相关推荐
- python爬取360手机助手APP信息
这是一个爬虫软件,用来爬取360应用市场,App软件信息,现阶段代码只能爬取下载量,如需爬取别的信息,请自行添加代码. 使用方法: 1.在D盘根目录新建.tet文件,命名为App_name,并把App ...
- 使用scrapy爬虫框架爬取慕课网全部课程信息
爬取的链接: http://www.imooc.com/course/list 爬取的内容: 课程链接, 课程的图片url, 课程的名称, 学习人数, 课程描述 1.安装scrapy模块 pip in ...
- python爬取链家_python+scrapy爬虫(爬取链家的二手房信息)
之前用过selenium和request爬取数据,但是感觉速度慢,然后看了下scrapy教程,准备用这个框架爬取试一下. 1.目的:通过爬取成都链家的二手房信息,主要包含小区名,小区周边环境,小区楼层 ...
- java爬虫爬取互联网上的各大影视网站---360影视(附源码下载)
关于爬虫: 万维网上有着无数的网页,包含着海量的信息,无孔不入.森罗万象.但很多时候,无论出于数据分析或产品需求,我们需要从某些网站,提取出我们感兴趣.有价值的内容,但是纵然是进化到21世纪的人类,依 ...
- python爬取小游戏_如何用Python爬取小游戏网站,把喜欢的游戏收藏起来(附源码)...
简介: Python 是一门简单易学且功能强大的编程语言,无需繁琐的配置,掌握基本语法,了解基本库函数,就可以通过调用海量的现有工具包编写自己的程序,轻松实现批量自动化操作,可以极大提高办公和学习效率 ...
- 一键爬取基金历年季度报数据,轻松搞定!附源码
大家好,我是小一 今天的文章来自于朋友圈,发现大家对于基金报告的爬取也挺感兴趣,于是就抽时间复现了一下 爬虫的整体思路比较简单,代码量甚至都没有基金分析那篇的多,很适合入门的朋友参考学习 另外,这篇文 ...
- 如何用Python爬取小游戏网站,把喜欢的游戏收藏起来(附源码)
简介: Python 是一门简单易学且功能强大的编程语言,无需繁琐的配置,掌握基本语法,了解基本库函数,就可以通过调用海量的现有工具包编写自己的程序,轻松实现批量自动化操作,可以极大提高办公和学习效率 ...
- python实战系列之爬取CSDN博客之星2020年度排名情况(附源码)
前言 CSDN2020年度博客之星马上就要收尾了,你知道自己关注的博主排名实时变化吗?谁是你心目中的博客之星,让我们爬取各位博主的排名及各位博主的一些个人信息. 代码 直接上代码 # -*- codi ...
- python爬虫实例手机_Python爬虫实现爬取京东手机页面的图片(实例代码)
实例如下所示: __author__ = 'Fred Zhao' import requests from bs4 import BeautifulSoup import os from urllib ...
最新文章
- MIT喊你来上课,深度学习课程,免费的那种 | 资源
- linux小窍门──设置时钟和时间
- linux 调优篇 :硬件调优(BIOS配置)* 壹
- amap vueamap 与_vue 使用高德地图vue-amap组件过程解析
- Python简易验证码生成程序
- NPOI Excel 单元格背景颜色对照表
- CUDA算法:MS-queue算法相关
- oracle如何查找谁删除了数据_一文看懂Oracle是如何闪回数据库的?
- 基于JAVA实现的WEB端UI自动化 -自动化测试简单介绍
- Python——jieba优秀的中文分词库(基础知识+实例)
- 计算机组成原理实验数据通路,《计算机组成原理》实验报告——数据通路
- BJFU_数据结构习题_274六度空间理论
- panabit安装和默认密码
- linux 分区 intel raid,linux on intel sata raid
- 古往今来中国最经典的50句名言
- 最通俗易懂的讲解HTTPS的加密原理【多图、易懂】
- Python性能分析入门——cProfile、可视化、逐行分析、内存分析
- ExtJS初级教程之ExtJS Tree(三)
- windows10 家庭版 “当前账户已锁定“的解决方式
- ctrl跳转失败 studio uap_uap进不去,重装studio和uap都不能行,请大神给看看