爬虫入门到精通_框架篇16(Scrapy框架基本使用)_名人名言的抓取

1 目标站点分析

抓取网站:http://quotes.toscrape.com/
主要显示了一些名人名言,以及作者、标签等等信息:
在这里插入图片描述
点击next,page变为2:
在这里插入图片描述

2 流程框架

  1. 抓取第一页:请求第一页的URL并得到源代码,进行下一步分析。
  2. 获取内容和下一页链接:分析源代码,提取首页内容,获取下一页链接等待进一步爬取。
  3. 翻页爬取:请求下一页信息,分析内容并请求再下一页链接。
  4. 保存爬取内容:将爬取结果保存为特定格式如文本,数据库。

3 代码实战

新建一个项目

scrapy startproject quotetutorial

在这里插入图片描述
创建一个spider(名为quotes):
在这里插入图片描述
使用pycharm来打开已经在本地生成的项目:
在这里插入图片描述
scrapy.cfg:配置文件
items.py:保存数据的数据结构
middlewares.py:爬取过程中定义的一些中间件,可以用来处理Request,Response以及Exceptions等操作,也可以用来修改Request, Response等相关的配置
pipelines.py:项目管道,可以用来输出一些items
settings.py:定义了许多配置信息
quotes.py:主要的运行代码

执行这个爬虫程序:
在这里插入图片描述
可以看到控制台中打印出了许多调试信息,可以看出,它和普通的爬虫不太一样,Scrapy提供了很多额外的输出。

抓取第一页

在这里插入图片描述
1.更改QuotesSpider这个类,通过css选中quote这个区块,
在这里插入图片描述

    def parse(self, response):quotes = response.css('.quote')for quote in quotes:text = quote.css('.text::text').extract_first()author = quote.css('.author::text').extract_first()tags = quote.css('.tags . tag::text').extract()

这样的解析方法和pyquery非常相似:
.text :指的是标签的class.
::text :是Scrapy特有的语法结构,表示输出标签里面的文本内容.
extract_first() :方法表示获取第一个内容.
extract :会把所有结果都找出来(类似于find和findall).

说明:Scrapy还为我们提供了一个非常强大的工具–shell,在命令行中输入“scrapy shell quotes.toscrape.com”,可以进入命令行交互模式:
例如,直接输入response,回车后会直接执行这条语句。:
在这里插入图片描述
试试刚才写的方法的效果:先查看“response.css(’.quote’)”的输出:
在这里插入图片描述
这是一个list类型的数据,里面的内容是Selector选择器,查看第一个结果:此时若直接输入quotes会报错。
先执行quotes = response.css(‘.quote’),然后quotes[0]。
在这里插入图片描述
.text和.text::text的区别:data数据的输出和不输出
在这里插入图片描述
2.借助Scrapy提供的“items.py”定义统一的数据结构,指定一些字段之类的,将爬取到的结果作为一个个整体存下来。根据提示更改文件如下:
在这里插入图片描述
3. 要在parse方法中调用我们刚才定义的items,将提取出的网页信息存储到item,然后调用yield方法将item生成出来。
在这里插入图片描述

获取内容和下一页链接

在这里插入图片描述

import scrapy
from quotetutorial.items import QuotetutorialItemclass QuotesSpider(scrapy.Spider):name = "quotes"allowed_domains = ["quotes.toscrape.com"]start_urls = ["https://quotes.toscrape.com"]def parse(self, response):quotes = response.css('.quote')for quote in quotes:item = QuotetutorialItem()text = quote.css('.text::text').extract_first()author = quote.css('.author::text').extract_first()tags = quote.css('.tags .tag::text').extract()item['text'] = textitem['author'] = authoritem['tags'] = tagsyield itemnext = response.css('.pager .next a::attr(href)').extract_first()url = response.urljoin(next)yield scrapy.Request(url=url, callback=self.parse)

最后调用Request,第一个参数就是要请求的url,第二个参数“callback”是回调函数的意思,也就是请求之后得到的response由谁来处理,这里我们还是调用parse,因为parse方法就是用来处理索引页的,这就相当于完成了一个递归的调用,可以一直不断地调用parse方法获取下一页的链接并对访问得到的信息进行处理。

再次重新运行程序,可以看到输出了10页的内容,这是因为该网站只有10页内容:
在这里插入图片描述

保存爬取到的信息

在原来的命令后面增加“-o 文件名称.json”,爬取完成后就会生成一个“quotes.json”文件,把获取到的信息保存成了标准的json格式。

scrapy crawl quotes -o quotes.json

在这里插入图片描述
Scrapy还提供了其它存储格式,比如“jl”格式,在命令行输入如下命令就可以得到jl格式文件。相比于json格式,它没有了最前面和最后面的的大括号,每条数据独占一行:

scrapy crawl quotes -o quotes.jl

或者保存成csv格式:

scrapy crawl quotes -o quotes.csv

它还支持xml、pickle和marshal等格式。
Scrapy还提供了一种远程ftp的保存方式,可以将爬取结果通过ftp的形式进行保存,例如:

scrapy crawl quotes -o ftp://user:pass@ftp.example.com/path/quotes.csv

数据处理

在将爬取到的内容进行保存之前,还需要对item进行相应的处理,因为在解析完之后,有一些item可能不是我们想要的,或者我们想把item保存到数据库里面,就需要借助Scrapy的Pipeline工具。
更改pipelines.py文件:

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
from scrapy.exceptions import DropItem
import pymongoclass TextPipeline:def __init__(self):self.limit = 50def process_item(self, item, spider):if item['text']:if len(item['text']) > self.limit:item['text'] = item['text'][0:self.limit].rstrip() + '...'return itemelse:return DropItem('Missing Text')class MongoPipeline(object):def __init__(self, mongo_uri, mongo_db):self.mongo_uri = mongo_uriself.mongo_db = mongo_db@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['quotes'].insert(dict(item))return itemdef close_spider(self, spider):self.client.close()

更改setting:

MONGO_URI = 'localhost'
MONGO_DB = 'quotestutorial'

在这里插入图片描述

pipeline似乎没生效,要想让pipeline生效,需要在settings里面指定pipeline。
后面的序号300和400这样,代表pipeline运行的优先级顺序,序号越小表示优先级越高,会优先进行调用。

MONGO_URI = 'localhost'
MONGO_DB = 'quotestutorial'ITEM_PIPELINES = {'quotetutorial.pipelines.TextPipeline': 300,'quotetutorial.pipelines.MongoPipeline': 400,
}

将程序写好后我们可以再次运行,(命令行输入“scrapy crawl quotes”),可以看到输出的text过长的话,后面就被省略号代替了,同时数据也被存入了MongoDB数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/540141.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用第三方接入淘宝商品详情(主图,详情图)

1、找到可用的API接口:首先,需要找到支持查询商品信息的API接口。这些信息通常可以在电商平台的官方文档或开发者门户网站上找到。 2、注册并获取API密钥:在使用API接口之前,需要注册并获取API密钥。API密钥是识别身份的唯一标识符…

HDFS的架构优势与基本操作

目录 写在前面一、 HDFS概述1.1 HDFS简介1.2 HDFS优缺点1.2.1 优点1.2.2 缺点 1.3 HDFS组成架构1.4 HDFS文件块大小 二、HDFS的Shell操作(开发重点)2.1 基本语法2.2 命令大全2.3 常用命令实操2.3.1 上传2.3.2 下载2.3.3 HDFS直接操作 三、HDFS的API操作3…

【Java基础】IO流(二)字符集知识

目录 字符集知识 1、GBK字符集 2、Unicode字符集(万国码) 3、乱码 4、Java中编码和解码的方法 字符集知识 字符(Character):在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信…

揭秘动态住宅代理:如何合法获取全球数据洞察

文章目录 写在前面代理网络的崛起什么是代理网络?动态住宅代理的革命为什么选择亮数据动态代理 如何利用采集工具获取全球亮数据写在最后 写在前面 随着互联网技术的发展,数据已经成为企业生存和发展的不可或缺的资源。尤其在商业世界里,如何…

IAB视频广告标准《数字视频和有线电视广告格式指南》之 简介、目录及视频配套广告 - 我为什么要翻译介绍美国人工智能科技公司IAB系列(2)

写在前面 谈及到中国企业走入国际市场,拓展海外营销渠道的时候,如果单纯依靠一个小公司去国外做广告,拉渠道,找代理公司,从售前到售后,都是非常不现实的。我们可以回想一下40年前,30年前&#x…

什么是VPS?如何使用VPS?

什么是VPS?VPS有什么用? VPS是Virtual Private Server的缩写,中文则为虚拟专用服务器,VPS是利用虚拟服务器软件在一台物理服务器上创建多个相互隔离的小服务器,是托管在机房物理服务器上的虚拟机。每个VPS服务器都可分…

海格里斯HEGERLS智能托盘四向车系统为物流仓储自动化升级提供新答案

随着实体企业面临需求多样化、订单履行实时化、商业模式加速迭代等挑战,客户对物流仓储解决方案的需求也逐渐趋向于柔性化、智能化。作为近十年来发展起来的新型智能仓储设备,四向车系统正是弥补了先前托盘搬运领域柔性解决方案的空白。随着小车本体设计…

【C语言_C语言语句_复习篇】

目录 一、C语言的语句有哪些 1.1 空语句 1.2 表达式语句 1.3 函数调用语句 1.4 复合语句 1.5 控制语句 二、分支语句(两种) 1.1 if语句 1.1.1 普通分支语句(if、if_else) 1.1.2 嵌套if语句 1.1.3 else嵌套if两种写法的比较 1.1.4 else悬空问题 1.1.…

嵌入式毕业设计-基于智能家居灯光控制系统的设计与实现

项目介绍 技术:C语言、单片机等 在科技进步与社会发展的今天,智能家居这一概念慢慢走进人们的生活。照明控制作为智能家居的重要组成部分,它与人们日常生活的联系最为紧密,本文研究了利用ZigBee网络进行室内通信,克服…

美团大规模KV存储挑战与架构实践

KV 存储作为美团一项重要的在线存储服务,承载了在线服务每天万亿级的请求量,并且保持着 99.995% 的服务可用性。在 DataFunSummit 2023 数据基础架构峰会上,我们分享了《美团大规模 KV 存储挑战与架构实践》,本文为演讲内容的整理…

做外贸如何打动老是邮件不回复的客户

有人说:进入公司半年,都没有碰到什么大客户,小客户接了没利润,不想接,很难找到自己的定位,不知道如何去开发客户。 这是一个范围很大的问题,每个行业不一样,做外贸很多时候都是相通…

(Linux学习 十)磁盘管理(上)基本分区介绍

一、磁盘管理 添加磁盘:傻瓜式操作下一步下一步,只需设置磁盘内存大小 管理磁盘流程 新硬盘–>分区(MBR或者GPT)–>格式化/文件系统Filesystem–>挂载mount 1.查看磁盘信息 ll /dev/sd* //方法一 lsblk //方…