爬虫框架Scrapy的安装与基本使用

概括:上一节学习了pyspider框架,这一节我们来看一下Scrapy的强大之处。他应该是目前python使用的最广泛的爬虫框架。

一、简单实例,了解基本。

1、安装Scrapy框架

这里如果直接pip3 install scrapy可能会出错。

所以你可以先安装lxml:pip3 install lxml(已安装请忽略)。

安装pyOpenSSL:在官网下载wheel文件。

安装Twisted:在官网下载wheel文件。

安装PyWin32:在官网下载wheel文件。

下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

配置环境变量:将scrapy所在目录添加到系统环境变量即可。

ctrl+f搜索即可。

最后安装scrapy,pip3 install scrapy

2、创建一个scrapy项目

新创建一个目录,按住shift-右键-在此处打开命令窗口

输入:scrapy startproject tutorial即可创建一个tutorial文件夹

文件夹目录如下:

|-tutorial

|-scrapy.cfg

  |-__init__.py

  |-items.py

  |-middlewares.py

  |-pipelines.py

  |-settings.py

  |-spiders

    |-__init__.py

文件的功能:

scrapy.cfg:配置文件

spiders:存放你Spider文件,也就是你爬取的py文件

items.py:相当于一个容器,和字典较像

middlewares.py:定义Downloader Middlewares(下载器中间件)和Spider Middlewares(蜘蛛中间件)的实现

pipelines.py:定义Item Pipeline的实现,实现数据的清洗,储存,验证。

settings.py:全局配置

3、创建一个spider(自己定义的爬虫文件)

例如以爬取猫眼热映口碑榜为例子来了解一下:

在spiders文件夹下创建一个maoyan.py文件,你也可以按住shift-右键-在此处打开命令窗口,输入:scrapy genspider 文件名 要爬取的网址。

自己创建的需要自己写,使用命令创建的包含最基本的东西。

我们来看一下使用命令创建的有什么。

介绍一下这些是干嘛的:

name:是项目的名字

allowed_domains:是允许爬取的域名,比如一些网站有相关链接,域名就和本网站不同,这些就会忽略。

atart_urls:是Spider爬取的网站,定义初始的请求url,可以多个。

parse方法:是Spider的一个方法,在请求start_url后,之后的方法,这个方法是对网页的解析,与提取自己想要的东西。

response参数:是请求网页后返回的内容,也就是你需要解析的网页。

还有其他参数有兴趣可以去查查。

4、定义Item

item是保存爬取数据的容器,使用的方法和字典差不多。

我们打开items.py,之后我们想要提取的信息有:

index(排名)、title(电影名)、star(主演)、releasetime(上映时间)、score(评分)

于是我们将items.py文件修改成这样。

即可。

5、再次打开spider来提取我们想要的信息

修改成这样:

好了,一个简单的爬虫就写完了。

6、运行

在该文件夹下,按住shift-右键-在此处打开命令窗口,输入:scrapy crawl maoyan(项目的名字)

即可看到:

7、保存

我们只运行了代码,看看有没有报错,并没有保存。

如果我们想保存为csv、xml、json格式,可以直接使用命令:

在该文件夹下,按住shift-右键-在此处打开命令窗口,输入:

scrapy crawl maoyan -o maoyan.csv

scrapy crawl maoyan -o maoyan.xml

scrapy crawl maoyan -o maoyan.json

选择其中一个即可。当然如果想要保存为其他格式也是可以的,这里只说常见的。这里选择json格式,运行后会发现,在文件夹下多出来一个maoyan.json的文件。打开之后发现,中文都是一串乱码,这里需要修改编码方式,当然也可以在配置里修改

(在settings.py文件中添加FEED_EXPORT_ENCODING='UTF8'即可),

如果想直接在命令行中修改:

scrapy crawl maoyan -o maoyan.json -s FEED_EXPORT_ENCODING=UTF8

即可。

这里自己试试效果吧。

当然我们保存也可以在运行的时候自动保存,不需要自己写命令。后面介绍(我们还有还多文件没有用到呦)。

二、scrapy如何解析?

之前写过一篇文章:三大解析库的使用

但是scrapy也提供了自己的解析方式(Selector),和上面的也很相似,我们来看一下:

1、css

首先需要导入模块:from scrapy import Selector

例如有这样一段html代码:

html='<html><head><title>Demo</title></head><body><div class='cla'>This is Demo</div></body></html>

1.1、首先需要构建一个Selector对象

sel = Selector(html)

text = sel.css('.cla::text').extract_first()

.cla表示选中上面的div节点,::text表示获取文本,这里和以前的有所不同。

extract_first()表示返回第一个元素,因为上述 sel.css('.cla::text')返回的是一个列表,你也可以写成sel.css('.cla::text')[0]来获取第一个元素,但是如果为空,就会报出超出最大索引的错误,不建议这样写,而使用extract_first()就不会报错,同时如果写成extract_first('123')这样,如果为空就返回123

1.2、有了选取第一个,就有选取所有:extract()表示选取所有,如果返回的是多个值,就可以是这样写。

1.3、获取属性就是sel.css('.cla::sttr('class')').extract_first()表示获取class

1.4、获取指定属性的文本:sel.css('div[class="cla"]::text')

1.5、其他写法和css的写法如出一辙。

1.6、在scrapy中为我们提供了一个简便的写法,在上述的简单实例中,我们知道了response为请求网页的返回值。

我们可以直接写成:response.css()来解析,提取我们想要的信息。同样,下面要说的XPath也可以直接写成:

response.xpath()来解析。

2、Xpath

Xpath的使用可以看上面的文章:三大解析库的使用

注意:获取的还是列表,所以还是要加上extract_first()或者extract()

3、正则匹配(这里用response操作)

例如:response.css('a::text').re('写正则')

这里如果response.css('a::text')匹配的是多个对象,那么加上正则也是匹配符合要求的多个对象。

这里如果想要匹配第一个对象,可以把re()修改成re_first()即可。

注意:response不可以直接调用re(),response.xpath('.').re()可以相当于达到直接使用正则的效果

正则的使用:万能的正则表达式

三、Dowmloader Middleware的使用

本身scrapy就提供了很多Dowmloader Middleware,但是有时候我们要修改,

比如修改User-Agent,使用代理ip等。

以修改User-Agent为例(设置代理ip大同小异):

第一种方法,可以在settings.py中直接添加USER-AGENT='xxx'

但是我们想要添加多个User-Agent,每次随机获取一个可以利用Dowmloader Middleware来设置。

第一步将settings中的USER-AGENT='xxx'修改成USER-AGENT=["xxx","xxxxx","xxxxxxx"]

第二步在middlewares.py中添加:

from_crawler():通过参数crawler可以拿到配置的信息,我们的User-Agent在配置文件里,所以我们需要获取到。

方法名不可以修改。

第三步在settings.py中添加:

将scrapy自带的UserAgentmiddleware的键值设置为None,

自定义的设置为400,这个键值越小表示优先调用的意思。

四、Item Pipeline的使用。

1、进行数据的清洗

在一的实例中我们把评分小于等于8.5分的score修改为(不好看!),我们认为是不好看的电影,我们将pipeline.py修改成这样:

在setting.py中添加:

我们执行一下:

2、储存

2.1储存为json格式

我们将pipeline.py修改成这样:

在setting.py中添加:

表示先执行TextPipeline方法,再执行JsonPipeline方法,先清洗,再储存。

2.2储存在mysql数据库

首先在mysql数据库中创建一个数据库maoyanreying,创建一个表maoyan。

我们将pipeline.py修改成这样:

在setting.py中添加:

即可

完。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • scrapy学习笔记(有示例版) 我的博客 scrapy学习笔记1.使用scrapy1.1创建工程1.2创建爬虫模...
    陈思煜阅读 12,653评论 4 46
  • 本文建立在学习完大壮老师视频Python最火爬虫框架Scrapy入门与实践,自己一步一步操作后做一个记录(建议跟我...
    树懒啊树懒阅读 22,217评论 6 26
  • 也许,是时候给自己来场彻底的蜕变了。100天,给自己制定一些可行的计划,努力实现。 一、减肥 减肥并不只是为了美,...
    逄小胖阅读 479评论 0 0
  • 子曰:“为政以德,譬如北辰,居其所,而众星拱之。” 子曰:“诗三百,一言以蔽之,曰,思无邪。” 子曰:“道之以政,...
    阿飞的时光机阅读 1,021评论 0 1
  • 对,每天好像自己过的是那么回事,有朋友约有地方玩,可每当夜深人静之时,却又发现自己很孤独。有好消息想分享的...
    scandle阅读 139评论 0 0