23、 Python快速开发分布式搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制
转:
http://www.bdyss.cn
http://www.swpan.cn
用命令创建自动爬虫文件
创建爬虫文件是根据scrapy的母版来创建爬虫文件的
scrapy genspider -l 查看scrapy创建爬虫文件可用的母版
Available templates:母版说明
basic 创建基础爬虫文件
crawl 创建自动爬虫文件
csvfeed 创建爬取csv数据爬虫文件
xmlfeed 创建爬取xml数据爬虫文件
创建一个基础母版爬虫,其他同理
scrapy genspider -t 母版名称 爬虫文件名称 要爬取的域名 创建一个基础母版爬虫,其他同理
如:scrapy genspider -t crawl lagou www.lagou.com
第一步,配置items.py接收数据字段
default_output_processor = TakeFirst()默认利用ItemLoader类,加载items容器类填充数据,是列表类型,可以通过TakeFirst()方法,获取到列表里的内容
input_processor = MapCompose(预处理函数)设置数据字段的预处理函数,可以是多个函数
# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # http://doc.scrapy.org/en/latest/topics/items.html #items.py,文件是专门用于,接收爬虫获取到的数据信息的,就相当于是容器文件 import scrapy from scrapy.loader.processors import MapCompose,TakeFirst from scrapy.loader import ItemLoader #导入ItemLoader类也就加载items容器类填充数据 class LagouItemLoader(ItemLoader): #自定义Loader继承ItemLoader类,在爬虫页面调用这个类填充数据到Item类 default_output_processor = TakeFirst() #默认利用ItemLoader类,加载items容器类填充数据,是列表类型,可以通过TakeFirst()方法,获取到列表里的内容 def tianjia(value): #自定义数据预处理函数 return '叫卖录音网'+value #将处理后的数据返给Item class LagouItem(scrapy.Item): #设置爬虫获取到的信息容器类 title = scrapy.Field( #接收爬虫获取到的title信息 input_processor = MapCompose(tianjia), #将数据预处理函数名称传入MapCompose方法里处理,数据预处理函数的形式参数value会自动接收字段title )
第二步,编写自动爬虫与利用ItemLoader类加载items容器类填充数据
自动爬虫
Rule()设置爬虫规则
参数:
LinkExtractor()设置url规则
callback='回调函数名称'
follow=True 表示在抓取页面继续深入
LinkExtractor()对爬虫获取到的url做规则判断处理
参数:
allow= r'jobs/' 是一个正则表达式,表示符合这个url格式的,才提取
deny= r'jobs/' 是一个正则表达式,表示符合这个url格式的,不提取抛弃掉,与allow相反
allow_domains= www.lagou.com/ 表示这个域名下的连接才提取
deny_domains= www.lagou.com/ 表示这个域名下的连接不提取抛弃
restrict_xpaths= xpath表达式 表示可以用xpath表达式限定爬虫只提取一个页面指定区域的URL
restrict_css= css选择器,表示可以用css选择器限定爬虫只提取一个页面指定区域的URL
tags= 'a' 表示爬虫通过a标签去寻找url,默认已经设置,默认即可
attrs= 'href' 表示获取到a标签的href属性,默认已经设置,默认即可
-
- *
利用自定义Loader类继承ItemLoader类,加载items容器类填充数据
*ItemLoader()实例化一个ItemLoader对象来加载items容器类,填充数据,如果是自定义Loader继承的ItemLoader同样的用法
参数:
第一个参数:要填充数据的items容器类注意加上括号,
第二个参数:response*
ItemLoader对象下的方法:
add_xpath('字段名称','xpath表达式')方法,用xpath表达式获取数据填充到指定字段
add_css('字段名称','css选择器')方法,用css选择器获取数据填充到指定字段
add_value('字段名称',字符串内容)方法,将指定字符串数据填充到指定字段
load_item()方法无参,将所有数据生成,load_item()方法被yield后数据被填充items容器指定类的各个字段
爬虫文件
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from adc.items import LagouItem,LagouItemLoader #导入items容器类,和ItemLoader类 class LagouSpider(CrawlSpider): #创建爬虫类 name = 'lagou' #爬虫名称 allowed_domains = ['www.luyin.org'] #起始域名 start_urls = ['http://www.luyin.org/'] #起始url rules = ( #配置抓取列表页规则 Rule(LinkExtractor(allow=('ggwa/.*')), follow=True), #配置抓取内容页规则 Rule(LinkExtractor(allow=('post/\d+.html.*')), callback='parse_job', follow=True), ) def parse_job(self, response): #回调函数,注意:因为CrawlS模板的源码创建了parse回调函数,所以切记我们不能创建parse名称的函数 #利用ItemLoader类,加载items容器类填充数据 item_loader = LagouItemLoader(LagouItem(), response=response) item_loader.add_xpath('title','/html/head/title/text()') article_item = item_loader.load_item() yield article_item
items.py文件与爬虫文件的原理图
【转载自:http://www.lqkweb.com】
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云PHP Composer全量镜像上线,Laravel China功成身退
阿里又给社区做贡献了。 今天,阿里云在其官微上正式宣布:上线PHP Composer全量镜像,所有PHP开发者都可以下载。 官微原文如下: 今天,阿里云正式上线PHP Composer全量镜像,所有PHP开发者都可以通过我们的开发者社区developer.aliyun.com/composer加速Composer安装器。 这款镜像工具的最大优势是快,几乎实现与PHP Packagist官方实时同步,每隔30秒刷新全国CDN缓存。它基于阿里云的对象存储OSS和CDN研发同步系统,通过任务分发,实现同步的快速和稳定。 为什么要开发这款镜像工具? 这其实来自客户和阿里巴巴集团业务的共同诉求。 阿里云上有数万PHP SDK用户,提高安装成功率必然要求有最快的镜像同步工具。 此外,有近6万企业的开发者活跃在我们的一站式企业协同研发云——云效平台上,通过云效平台构建PHP工程,这同样离不开镜像同步工具。 为什么要开放这款工具的下载? 因为我们也是PHP社区的受益者,希望以此回馈。也希望在广泛PHPer的监督下,打磨更好的工具。 过去一周,我们进行了小范围的开发者公测。 非常高兴的是,在没有任何官方...
- 下一篇
LeetCode 283:移动零 Move Zeroes
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 Note: You must do this in-place without making a copy of the array. Minimize the total number of operations. 解题思路: 千万不要被题目局限了思维!题目让把所有0移到末尾,如果你的思路是遇零与末尾数字交换位置,然后还需要把非零数字排序,那么就被带偏了。 换个思路,把非 0 数字前移,不去管数字 0。 定义两个指针:指针 i 直接遍历数组遇到非 0 数字把该数字赋值给指针 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS关闭SELinux安全模块