scrapy快速入门

安装

  • 升级pip python -m pip install --upgrade pip
  • 安装wheel
  • 安装lxml
  • pip install scrapy

创建一个scrapy项目

# 环境**windows 10, py3.10 **
# 以下步骤我是在自己的电脑D:\scrapy-china\scrapycode目录下运行
# 在开始爬取之前,我们首先要创建一个scrapy项目,在命令行输入一下命令即可创建
scrapy startproject mingyan# scrapy  startproject  这里是固定的
# 注意scrapy和startproject和mingyan中间是有空格的!后面的:mingyan是我们创建的蜘蛛名字,名字根据自己的情况创建。# 输入命令之后出现,下面的提示表示创建成功:
# you can start your first spider with:
#   cd mingyan
#   scrapy genspider example example.com
# 目录结构如下:
# mingyan
#    │  scrapy.cfg
#    │  items.py
#    │  middlewares.py
#    │  pipelines.py
#    │  settings.py
#    │  __init__.py
#    │
#    ├─spiders
#    │  │  __init__.py
# 到这里已经创建成功,接下来编写第一个爬虫

编写第一个scrapy爬虫

# 上面我们已经成功创建了一个scrapy 项目,那我们该在哪里写我们的蜘蛛呢?here,在spiders目录下面,这一个scrapy 文档,我们就来创造一只scrapy蜘蛛
# 输入 `scrapy genspider miyan ”lab.scrapyd.cn/“`
# miyan = 爬虫名字  `”http://lab.scrapyd.cn/page/1“ 是爬取的范围`
# 打开 miyan/spiders目录里的miyan,默认添加了下列代码
import scrapy
class ItcastSpider(scrapy.Spider):name = "miyan"allowed_domains = ["lab.scrapyd.cn"]start_urls = ('http://www.lab.scrapyd.cn/',)def parse(self, response):pass

其实也可以由我们自行创建itcast.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦

要建立一个Spider, 你必须用scrapy.Spider类创建一个子类,并确定了三个强制的属性 和 一个方法。

  • name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。
  • allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
  • start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
  • parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
    1. 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
    2. 生成需要下一页的URL请求。

运行蜘蛛

好了,里面注释应该都很清楚了,这里就不多解释,这个栗子,会放到github,打家下载了运行一下就知道原理了!那肿么运行这个蜘蛛呢?

scrapy crawl  mingyan2

输入以上命令便可以运行蜘蛛了!
这里要重点提醒一下,我们一定要进入:mingyan2 这个目录,也就是我们创建的蜘蛛项目目录,以上命令才有效!还有 crawl 后面跟的是你类里面定义的蜘蛛名,也就是:name,并不是项目名、也不是类名,这些细节希注意!

scrapy start_url(初始链接)简写

def start_requests(self): urls = [ 'http://lab.scrapyd.cn/page/1/','http://lab.scrapyd.cn/page/2/',]for url in urls:yield scrapy.Request(url=url, callback=self.parse)

简化后,以上的链接可以写在:start_urls这个常量里面,是不是省了好多事,人生是不是又美满了一大截?

    start_urls = [  # 另外一种写法,无需定义start_requests方法'http://lab.scrapyd.cn/page/1/','http://lab.scrapyd.cn/page/2/',]

但是!上帝给你开一扇门,就会给你关另一扇门,用简化的方法,我们必须定义一个方法为:def parse(self, response),方法名一定是:parse,这样的话用简写的方式就能愉快的工作了

完整代码如下:

"""scrapy初始Url的两种写法,一种是常量start_urls,并且需要定义一个方法parse()另一种是直接定义一个方法:star_requests()
"""
import scrapy
class simpleUrl(scrapy.Spider):name = "simpleUrl"start_urls = [  #另外一种写法,无需定义start_requests方法'http://lab.scrapyd.cn/page/1/','http://lab.scrapyd.cn/page/2/',]# 另外一种初始链接写法# def start_requests(self):#     urls = [ #爬取的链接由此方法通过下面链接爬取页面#         'http://lab.scrapyd.cn/page/1/',#         'http://lab.scrapyd.cn/page/2/',#     ]#     for url in urls:#         yield scrapy.Request(url=url, callback=self.parse)# 如果是简写初始url,此方法名必须为:parsedef parse(self, response):page = response.url.split("/")[-2]filename = 'mingyan-%s.html' % pagewith open(filename, 'wb') as f:f.write(response.body)self.log('保存文件: %s' % filename)

scrapy调试工具:scrapy shell使用方法

上面的栗子,我们只是囫囵吞枣的把页面下载下来,并不能展示scrapy的强大
是时候显示scrapy的肌肉了!scrapy真正的强大是表现在它提取数据的能力上,本文档我们也是走马观花的介绍一下scrapy提取数据的几种方式:CSS、XPATH、RE(正则),为马是走马观花呢?因为后面还有很大的篇幅细说他们,这里只是为了让你概括的认识scrapy,但要认识它,又不能不提及它的数据提取能力,所以在这里概括一下,后面它还会再回来!基于这样的现实,也对读者木有太高的要求,略懂即可!好了,接下来我们开始了:那开始之前,我们还需要磨把刀,神马刀呢?也就是:验证scrapy到底有木有提取到数据的工具,其实说白了就是scrapy调试工具,如果木有它你根本不知道你写的规则到底有木有提取到数据,所以这个工具是个:刚需!其实也很简单,就是在命令行输入下面一行代码而已:

scrapy shell http://lab.scrapyd.cn

scrapy shell 是必须的,后面的网址是你需要爬取的网页
输入:scrapy shell http://lab.scrapyd.cn命令行会打印出一大串命令:
只需要注意最后一行是不是In [1]
比如我们想提取 http://lab.scrapyd.cn 的 title,我们可以在 In[1]: 后面输入:response.css(‘title’) ,然后回车, 立马就得到如下结果:

>>> response.css('title')
[<Selector xpath='descendant-or-self::title' data='<title>爬虫实验室 - S
CRAPY中文网提供</title>'>]

似不似很直观的验证了你提取的数据对不对?如果正确了,我们再把上面的代码放到我们蜘蛛里面,那这样就会正确的得到你想要的数据,而不会出现意外了,这就是scrapy调试工具的应用!

scrapy css选择器使用

上面我们已经祭出了 scrapy 强大的调试工具:scrapy shell,那接下来我们就简略的看看scrapy的第一种数据提取工具:css提取工具的用法。那我们要提取那个数据呢?就提取:http://lab.scrapyd.cn 这个页面的title里面的数据,我们来看一下他的html结构:

<!DOCTYPE HTML>
<html class="no-js">
<head>……<meta name="applicable-device" content="pc,mobile"><title>爬虫实验室 - SCRAPY中文网提供</title>……

我们要提取的就是上面:

<title>爬虫实验室 - SCRAPY中文网提供</title>

这个标签里面的数据,我们最终要得到的是:

“爬虫实验室 - SCRAPY中文网提供”

这么一段字符串,那我们就循序渐进的看看我们会怎么操作,会使用哪些函数。
首先我们需要在命令行输入:

scrapy shell http://lab.scrapyd.cn

然后我们继续在命令行输入如下命令:response.css(‘title’) ,这个格式是scrapy固定的格式照着写就行了;response.css(‘标签名’),标签名的话可以是html标签比如:title、body、div,也可以是你自定义的class标签,这里的话先看我们提取一下简单的,后面我们会讲解如何提取复杂的;
那当我们输入以上命令之后,你会发现已经很给力的提取了一些数据:

>>> response.css('title')[<Selector xpath='descendant-or-self::title' data='<title>爬虫实验室 - S
CRAPY中文网提供</title>'>]

那你会发现,我们使用这个命令提取的一个Selector的列表,并不是我们想要的数据;那我们再使用scrapy给我们准备的一些函数来进一步提取,那我们改变一下上面的写法,输入:

>>> response.css('title').extract()['<title>爬虫实验室 - SCRAPY中文网提供</title>']

我们只是在后面加入了:extract() 这么一个函数你就提取到了我们标签的一个列表,更近一步了,那如果我们不要列表,只要title这个标签,要怎么处理呢,看我们的输入:

>>>  response.css('title').extract()[0]'<title>爬虫实验室 - SCRAPY中文网提供</title>'

这里的话,我们只需要在后面添加:[0],那代表提取这个列表中的第一个元素,那就得到了我们的title字符串;这里的话scrapy也给我提供了另外一个函数,可以这样来写,一样的效果:

>>>  response.css('title').extract_first()'<title>爬虫实验室 - SCRAPY中文网提供</title>'

extract_first()就代表提取第一个元素,和我们的:[0],一样的效果,只是更简洁些,至此我们已经成功提取到了我们的title,但是你会发现,肿么多了一个title标签,这并不是你需要的,那要肿么办呢,我们可以继续改变一下以上的输入:

>>> response.css('title::text').extract_first()
'爬虫实验室 - SCRAPY中文网提供'

我们在title后面加上了
::text
,这代表提取标签里面的数据,至此,我们已经成功提取到了我们需要的数据:

'爬虫实验室 - SCRAPY中文网提供'

总结一下,其实就这么一段代码:

response.css('title::text').extract_first()

scrapy提取一组数据

上面我们已经学了几个
scrapy给我们提供的,提取网页数据的函数,上面的话我们只是在命令行使用,那经过我们的scrapyshell验证正确之后,我们怎么把它写进我们的蜘蛛文件?怎么让它提取数据?那接下来我们来看一下具体的操作。
我们继续蹂躏这个网站:http://lab.scrapyd.cn
我们先试着提取里面一条名言的信息,然后进一步提取多条;
那一条名言其实包含这么几个部分:名言、作者、标签,:
我们打开源代码,再来看一下对应的HTML标签:

<div class="quote post"><span class="text">各种时代,各国诗人,个抓个的痒。scrapy中文网(http://www.scrapyd.cn)整理</span><span>作者:<small class="author">木心</small><a href="http://lab.scrapyd.cn/archives/29.html">【详情】</a></span><p></p><div class="tags">标签 :<a href="http://lab.scrapyd.cn/tag/木心/">木心</a> , <a href="http://lab.scrapyd.cn/tag/艺术/">艺术</a>  </div>
</div>

那我们要爬取的标签就是:
名言,对应着 class=“text” 标签里面的内容;
作者,对应着 class=“authou” 里面的内容;
标签,对应着 class=“tags” 里面的内容;
因为我们提取的是第一段名言里面的数据,所以我们需要先找到第一段名言,然后保存在一个变量里面,再进一步提取里面的以上数据,那我们要怎么找到第一段名言呢,我们先来看一下HTML结构:

<div class="quote post">……
</div><div class="quote post">……
</div><div class="quote post">……
</div>
……

我们可以看到,每一段名言都被一个

……

包裹,那如果我们要找到第一段名言我们可以这样写:

 mingyan1 = response.css('div.quote')[0]

这样的话,我们就把第一段名言保存在:mingyan1 这么一个变量里面了。为什么会有一个:[0] 这表示提取第一段,如果没有这个限制,那我们提取的是本页所有名言。接下来我们就可以来提取里面的:名言内容、作者、标签了。首先提取名言内容,可以这样写:

>>> mingyan1.css('.text::text').extract_first()'各种时代,各国诗人,个抓个的痒。scrapy中文网(http://www.scrapyd.cn)
整理'

好了,这样我们已经得到了第一段里面的名言内容,上面的表达式里面,我们使用了:.text 这是class选择器,如果是id选择器的话:#text 这些都是HTML的只是,不多说。那接下来我们提取作者:

 >>> mingyan1.css('.author::text').extract_first()'木心'

用的还是class选择器!接下来我们提取标签:

 >>> mingyan1.css('.tags .tag::text').extract()['木心', '艺术']

这里的话,大家可以发现我们用的并非是.extract_first() 而是 extract(),why?应为里面有多个标签,我们并非只是提取一个,而是要把所有标签都提取出来,因此就用了:.extract()
好了,所有内容都已经在scrapy shell 里面验证通过了,那接下来我们把它合并到我们蜘蛛里面,代码如下:

import scrapy
class itemSpider(scrapy.Spider):name = 'itemSpider'start_urls = ['http://lab.scrapyd.cn']def parse(self, response):mingyan = response.css('div.quote')[0]text = mingyan.css('.text::text').extract_first()  # 提取名言author = mingyan.css('.author::text').extract_first()  # 提取作者tags = mingyan.css('.tags .tag::text').extract()  # 提取标签tags = ','.join(tags)  # 数组转换为字符串fileName = '%s-语录.txt' % autor  # 爬取的内容存入文件,文件名为:作者-语录.txtf = open(fileName, "a+")  # 追加写入文件f.write(text)  # 写入名言内容f.write('\n')  # 换行f.write('标签:'+tags)  # 写入标签f.close()  # 关闭文件操作

scrapy 爬取多条数据(scrapy 列表爬取)

我们来看一下关键变化,原先我们取出一条数据,用的是如下表达式:

mingyan = response.css('div.quote')[0]

我们在后面添加了游标 [0] 表示只取出第一条,那我们要取出全部,那我们就不用加了,直接:

mingyan = response.css('div.quote')

那现在的变量就是一个数据集,里面有多条数据了,那接下来我们要做的就是循环取出数据集里面的每一条数据,那我们看一下怎么做:

mingyan = response.css('div.quote')  # 提取首页所有名言,保存至变量mingyanfor v in mingyan:  # 循环获取每一条名言里面的:名言内容、作者、标签text = v.css('.text::text').extract_first()  # 提取名言autor = v.css('.author::text').extract_first()  # 提取作者tags = v.css('.tags .tag::text').extract()  # 提取标签tags = ','.join(tags)  # 数组转换为字符串# 接下来,进行保存

好了,可以看到,关键是:

 for v in mingyan:

表示把 mingyan 这个数据集里面的数据,循环赋值给:v ,第一次循环的话 v 就代表第一条数据,那 text = v.css(‘.text::text’).extract_first() 就代表第一条数据的名言内容,以此类推,把所有数据都取了出来,最终进行保存,我们看一下完整的代码:

import scrapy
class itemSpider(scrapy.Spider):name = 'listSpider'start_urls = ['http://lab.scrapyd.cn']def parse(self, response):mingyan = response.css('div.quote')  # 提取首页所有名言,保存至变量mingyanfor v in mingyan:  # 循环获取每一条名言里面的:名言内容、作者、标签text = v.css('.text::text').extract_first()  # 提取名言autor = v.css('.author::text').extract_first()  # 提取作者tags = v.css('.tags .tag::text').extract()  # 提取标签tags = ','.join(tags)  # 数组转换为字符串"""接下来进行写文件操作,每个名人的名言储存在一个txt文档里面"""fileName = '%s-语录.txt' % autor  # 定义文件名,如:木心-语录.txtwith open(fileName, "a+", encoding="utf-8") as f:  # 不同人的名言保存在不同的txt文档,“a+”以追加的形式f.write(text)f.write('\n')  # ‘\n’ 表示换行f.write('标签:' + tags)f.write('\n-------\n')f.close()# scrapy 爬取下一页,scrapy整站爬取,只需要加入下面的代码 next_page = response.css('li.next a::attr(href)').extract_first()  if next_page is not None: next_page = response.urljoin(next_page)yield scrapy.Request(next_page, callback=self.parse)

首先:我们使用:response.css(‘li.next a::attr(href)’).extract_first()查看有木有存在下一页链接,如果存在的话,我们使用:urljoin(next_page)把相对路径,如:page/1转换为绝对路径,其实也就是加上网站域名,如:http://lab.scrapyd.cn/page/1;接下来就是爬取下一页或是内容页的秘诀所在,scrapy给我们提供了这么一个方法:scrapy.Request() 这个方法还有许多参数,后面我们慢慢说,这里我们只使用了两个参数,一个是:我们继续爬取的链接(next_page),这里是下一页链接,当然也可以是内容页;另一个是:我们要把链接提交给哪一个函数爬取,这里是parse函数,也就是本函数;当然,我们也可以在下面另写一个函数,比如:内容页,专门处理内容页的数据。经过这么一个函数,下一页链接又提交给了parse,那就可以不断的爬取了,直到不存在下一页;

scrapy快速入门相关推荐

  1. 爬虫框架:Scrapy 快速入门

    文章目录 一.Scrapy简介 1.1 示例代码 1.2 示例代码的运行流程 二.安装Scrapy 2.1 Ubuntu下安装 2.2 Windows下安装 2.3 Mac OS下安装 三.Scrap ...

  2. python scrapy菜鸟教程_scrapy学习笔记(一)快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  3. python_爬虫 16 Scrapy框架之(二)快速入门

    目录 一.安装和文档: 二.快速入门: 1.创建项目: 2.目录结构介绍: 3.使用Scrapy框架爬取糗事百科段子: 使用命令创建一个爬虫: 爬虫代码解析: 修改settings.py代码: 简单运 ...

  4. Python Scrapy中文教程,Scrapy框架快速入门!

    谈起爬虫必然要提起 Scrapy 框架,因为它能够帮助提升爬虫的效率,从而更好地实现爬虫. Scrapy 是一个为了抓取网页数据.提取结构性数据而编写的应用框架,该框架是封装的,包含 request ...

  5. Scrapy八小时快速入门第一小时:安装,创建与执行我们的Scrapy爬虫

    安装 安装Scrapy非常简单,只需要在终端输入pip install scrapy,然后执行命令即可,如果不行,那么一般是底层库的问题,可以使用codna install --upgrade scr ...

  6. python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门

    原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...

  7. python快速编程入门黑马-新手如何快速入门Python编程?/开发python入门教程

    Python从入门到实践的教程是什么? 第一阶段Python与Linux数据这是Python的入段,也是帮助零基础学员打好基础的重要阶段,让零基础学员可以具备基础的编程能力,并掌握MySQL进阶内容. ...

  8. 【Python】Python爬虫快速入门,BeautifulSoup基本使用及实践

    来源:Python数据之道 作者:Peter 整理:阳哥 爬虫,是学习Python的一个有用的分支,互联网时代,信息浩瀚如海,如果能够便捷的获取有用的信息,我们便有可能领先一步,而爬虫正是这样的一个工 ...

  9. 快速入门 Python 数据分析实用指南

    Python 现如今已成为数据分析和数据科学使用上的标准语言和标准平台之一.那么作为一个新手小白,该如何快速入门 Python 数据分析呢? 下面根据数据分析的一般工作流程,梳理了相关知识技能以及学习 ...

最新文章

  1. Influxdb1.2.2安装
  2. libuv 中文编程指南(零)前言
  3. case when完成不同条件的显示
  4. Too many links;mkdir
  5. 海量数据中,寻找最小的k个数。
  6. shell 的here document 用法、输入/输出重定向
  7. [Codeforces673A]Bear and Game(水题,思路)
  8. mysql .myi权限_mysql之引擎、Explain、权限详解
  9. 职教高中计算机专业知识,新课改背景下计算机专业教学(职教)三维目标设计初探...
  10. pytorch新手需要注意的隐晦操作Tensor,max,gather
  11. 【渝粤教育】电大中专药剂学基础知识 (2)_1作业 题库
  12. 4.3 调度核心组件
  13. matlab画一个点电荷电场线,matlab画点电荷电场线
  14. 25. 谷粒商城订单系统
  15. 软件测试用例编写方法
  16. 四、云计算-国产-华为-运维、灾备和迁移+HCIE Cloud相关知识点+笔试题库
  17. 高德地图----经纬度转地理位置,地理位置获取经纬度
  18. 云计算和大数据的关系以及区别详细讲解
  19. Unity全局音量控制以及音量信息存储在本地
  20. 我的世界游侠联机教程

热门文章

  1. java类图标变成空心的解决办法
  2. Reflex WMS入门系列四十:对某个托盘执行上架,系统不能自动建议货架?
  3. 苹果手机安装sim卡显示无服务器,iPhone出现无SIM卡或者未安装SIM的情况怎么办
  4. 解决Oracle表中数据中文显示乱码问题
  5. 傅里叶与图像特征简介
  6. 航天器空间任务及在轨分析工具 — SYSTEMA
  7. 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
  8. 安装 ESXi 出现错误 ERROR 1962: No operating system found
  9. join为啥会阻塞主线程?
  10. 计算机程序设计员技能试题,计算机程序设计员(基础知识程序设计员高级程序设计员程序设计师国家职业技能鉴定指导)...