scrapy第一发——基础巩固
目标:爬取
http://books.toscrape.com"
将该网站上50页,每页20本的书的价格、等级、书名、书的ISBN号等爬取下来并保存在mongoDB数据库里面。
该网站如图:
首先建立一个爬虫项目,新建一个spider文件,name取值为"book"
class BookSpider(scrapy.Spider): name = 'book'
整个项目的文件结构如下
重写start_requests函数
def start_requests(self): url = "http://books.toscrape.com" yield Request(url, self.parse_urls)
再写一个callback函数——parse_urls,用于接受处理start_requests里面发出的Request请求所得到的response。该函数主要有两个功能,第一个功能是解析出“下一页”的url,第二个功能是解析出“每一页上20本书”的url;并对这些url发出请求。
来看一看这个函数怎么写
self.parse_urls:
def parse_urls(self , response): le = LinkExtractor(restrict_css="ul.pager li.next")leBook = LinkExtractor(restrict_css="ol.row div.image_container")next = le.extract_links(response)bookLinks = leBook.extract_links(response)# 解析每一页上20本书的links if bookLinks: for link in bookLinks: yield Request(link.url, self.parse_book)# 解析下一页的links if next: link = next[0].urlyield Request(link, self.parse_urls)
这里用到了LIinkExtractor,使用LinkExtractor提取出url还是很方便的。具体怎么用就不讲了。
可以看到,解析出下一页的url后,又将callback设置为self.parse_urls,继续使用该函数用来处理“下一页”;用self.parse_book函数处理每一个书本的内容页。
self.parse_book:
# 挖掘每一本书的信息 def parse_book(self , response): sel = response.css('div.product_main')title = sel.xpath('./h1/text()').extract_first()# 得到书名 price = sel.css('p.price_color::text').extract_first() # 得到书的价格 rank = sel.css('p.star-rating::attr(class)').re_first('star-rating ([A-Za-z]+)') # 得到书的排名等级 sel = response.css('table.table.table-striped')ISBN = sel.xpath('(.//tr)[1]/td/text()').extract_first() # 得到书的ISBN号 surplus = sel.xpath('(.//tr)[last()-1]/td/text()').re_first('\((\d+) available\)') # 得到书的库存量 reviewers = sel.xpath('(.//tr)[last()]/td/text()').extract_first() # 得到书的reviewers数量 single = BooksItem()single['title'] = titlesingle['price'] = pricesingle['rank'] = ranksingle['ISBN'] = ISBNsingle['surplus'] = surplussingle['reviewers'] = reviewersreturn single
self.parse_book里面使用到了BooksItem对象,BooksItem定义在items.py文件里面。
items.py
import scrapy from scrapy import Item , Fieldclass BooksItem(Item): # define the fields for your item here like: # name = scrapy.Field() title = Field()price = Field()rank = Field()ISBN = Field()surplus = Field()reviewers = Field()
分别定义了书名、价格、等级、ISBN、剩余量、观看者这六个字段。
在scrapy可以使用Item来传递数据。
写到这里可以直接使用命令“scrapy crawl book -o fileName.csv”来运行该爬虫程序了,最后数据会保存在fileName.csv文件里面。
不过前面说好了要保存在mongoDB里面呢,咱们还得修改一下piplines.py文件。在保存在数据库之前,先进行一个处理——书本去重,这里使用书名作为去重标准。
在piplines.py文件里面实现去重类:DuplicatesPipeline
# 实现书本的去重 class DuplicatesPipeline(object): def __init__(self): self.book_set = set()def process_item(self, item, spider): title = item['title']if title in self.book_set: raise DropItem("Duplicate book found: %s " % item)self.book_set.add(title)return item
这样就实现了书本去重,(注意这里的return item,它会将item数据返回给另外下一级的item pipeline继续处理,如果有的话)
去重了我还不满足,我还想将英镑转换成人民币,那么就再实现一个item pipeline——PriceConvertPipeline
# 实现书本的价格转换 class PriceConvertPipeline(object): exchange_rate = 8.5309 def process_item(self, item, spider): # 实现货币的汇率转换 price = float(item['price'][1:]) * self.exchange_rateitem['price'] = '¥ %.2f' % pricereturn item
然后我们再讲最后得到的item存入数据库里面
class MongoDBPipeline(object): @classmethod def from_crawler(cls, crawler): cls.DB_URI = crawler.settings.get('MONGO_DB_URI' , 'mongodb://localhost:27017/')cls.DB_NAME = crawler.settings.get('scrapy_data' , 'MONGO_DB_NAME')return cls()def open_spider(self, spider): self.client = pymongo.MongoClient(self.DB_URI)self.db = self.client[self.DB_NAME]def close_spider(self, spider): self.client.close()def process_item(self, item, spider): collection = self.db[spider.name]post = dict(item) if isinstance(item, Item) else item collection.insert_one(post)return item
(每实现一个item pipeline需要在settings.py里面加入该pipeline)如图:
ITEM_PIPELINES = {'books.pipelines.DuplicatesPipeline' : 100, 'books.pipelines.PriceConvertPipeline' : 200, 'books.pipelines.BooksPipeline': 300, 'books.pipelines.MongoDBPipeline' : 400, }
后面的键值取值为0~1000,越小表示执行的优先权越大。
这样整份工作就完成了。
scrapy第一发——基础巩固相关推荐
- 第五章 Scrapy爬虫框架(5.1 Scrapy框架基础)
Scrapy是一个高级Web爬虫框架,用于爬取网站并从页面中提取结构化数据.它可以用于数据挖掘.数据监控和自动化测试等多个方面.与之前讲过的Requests库和Selenium库不同,Scrapy更适 ...
- scrapy框架基础学习之囧事百科
基础: 一.安装scrapy框架 pip install scrapy pip --default-timeout=2000 install -U scrapy 来下载scrapy让它的延迟检测时间变 ...
- Scrapy框架基础使用
1.流程框架 2.在命令行中输入scrapy,会有scrapy常见命令参数 在命令中输入scrapy startproject quote创建一个叫quote的项目 cd到创建好的项目目录中,然后执行 ...
- java启动scrapy爬虫,爬虫入门之Scrapy 框架基础功能(九)详解
Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...
- 小白记录:1、scrapy的基础操作
1.命令行切换至你想要创建文件的目录: 运行中输入cmd--进入命令行 2.利用scrapy 创建爬虫文件 scrapy startproject cloud_music#输入命令,我的爬虫文件夹是c ...
- Scrapy的基础知识
一.Scrapy的作用 Scrapy应该算是Python宇宙中最常用的爬虫框架了,他是一个较完善的爬虫框架,同时也是一个比较难学的框架.Scrapy多应用于中型网站内容爬取. Scrapy的优点: 提 ...
- 11.Scrapy框架基础-使用Scrapy抓取数据并保存到mongodb
目录 一.Scrapy安装 1.mac系统 2.windows系统 二.使用scrapy爬取数据 1.新建一个scrapy工程 2.在spiders下新建一个爬虫文件 3.提取网页数据 三.保存数据到 ...
- python爬虫scrapy框架基础
我使用的软件是pychram 最近几周也一直在学习scrapy,发现知识点比较混乱,今天来总结一下.我是按照<精通python网络爬虫核心技术框架与项目实战>这本书来写的.讲的比较简洁,想 ...
- Python3网络爬虫——(5)Scrapy爬虫基础
目录 1.Scrapy常用命令行 2.Scrapy爬取内容 3.Scrapy数据提取 4.Scrapy爬取中国大陆明星 5.12306火车站站名爬取 1.Scrapy常用命令行 scrapy star ...
最新文章
- oracle ocr组成员替换,Oracle RAC 迁移替换 OCR 盘
- WPF——微软的UI革命
- 【代码笔记】iOS-二维码
- golang配置export GOPRIVATE拉取私有库代码
- Meteor环境安装配置
- vue监听对象某一个属性
- 计算机信息的编码教案,信息的编码教案信息的编码教案.doc
- 关于unique()的详解
- ADO.NET访问数据集的表、行和列
- 信息安全系统设计基础实验二:固件设计
- 机器学习——CART决策树——泰坦尼克还生还预测
- 华为模拟器eNSP下载与安装教程
- 白话大数据 | 从买菜这件小事来聊聊数据仓库
- 全国省市区mysql数据
- linux rm、rm -f、rm -r的区别
- ssm框架实现登陆页面邮箱验证
- 五、DML(数据操纵语句)
- 阿里云企业邮箱代理商:foxmal邮件发送RCPT错误怎么办?
- k3显示远程服务器未打开,k3客户端远程服务器链接
- “千元机皇” realme真我Q3系列发布 越级体验999元起
热门文章
- 【学习笔记】出货认证(QM模块)
- 34、Power Query-中国式排名
- SAP导出Excel错点拒绝处理
- 性能超强悍 戴尔 R920服务器
- 释疑のCONTEXTS
- Web Dynpro for ABAP 之 Web Dynpro Window Web Dynpro Application
- “五心”知“五感”,平安打造有温度的智慧城市
- html5里可移动线性进度条的类型怎么表示,HTML5触摸事件实现移动端简易进度条的实现方法...
- 威纶通触摸屏维修_威纶通WEINVIEW触摸屏维修故障检测
- python中的几种copy用法_Python3中copy模块常用功能及其他几种copy方式比较