9.2 scrapy安装及基本使用

image

https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下载即可。

安装完方法2 后需要回到方法1继续安装,不是说方法2完成后,scrapy就安装好了。

报错情况下安装下面的twisted而不是上面lxml

image

Scrapy爬虫的使用

一个基本的爬虫只需要两部分组成:Spider(爬虫)、Pipeline(管道)。

管道是什么?

每个项目管道组件是一个实现简单方法的Python类。他们接收一个项目并对其执行操作,还决定该项目是否应该继续通过流水线或被丢弃并且不再被处理。

image
image
image

管道左边是爬虫,右侧是数据库,中间是管道

管道里面有很多重要的方法。

项目管道的典型用途是:

  • 清理HTML数据
  • 验证抓取的数据(检查项目是否包含特定字段)
  • 检查重复(并删除)
  • 将刮取的项目存储在数据库中
image

切盘:输入盘符

image

或者cd D:\scrapywork

然后在里面创建一个city_58项目

第一个Scrapy项目

  1. 在命令行输入scrapy startproject city_58,建立Scrapy项目,提示如图即成功。

[图片上传失败...(image-82c015-1517579234036)]

里面的文件目录都如下:

image

[图片上传失败...(image-53a11-1517579234036)]

Alt text

  1. 得到如图的文件目录结构

[图片上传失败...(image-601747-1517579234036)]

  1. scrapy框架文件解析:
  • city_58/:该项目的python模块。之后您将在此加入代码
  • city_58/spiders/:放置spider代码的目录,在命令行使用“scrapy genspider + 爬虫名”生成的 - - spider文件将会被存放在此目录下
  • city_58/items.py:项目中的item文件,存放各种字段
  • city_58/pipelines.py:项目中的pipelines文件
  • city_58/settings.py:项目的设置文件
  • scrapy.cfg:项目的配置文件,一般不需要修改,也不能删除
  1. 在cmd中切换到city_58文件中,直接在cmd中输入“scrapy genspider spider_city_58 58.com”,其中spider_city_58 表示爬虫文件名(不能和工程名相同);58.com代表所要爬取的网站的主域名。主域名介绍:map.baidu。或者www.baidu.com。或者58.com 这一步很重要。这个域名可以限制爬取的范围。北京啊上海啊等等。

在spider下面生成spider_city_58文件,或者python中输入如下代码

-- coding: utf-8 --

import scrapy

class SpiderCity58Spider(scrapy.Spider):

name = 'spider_city_58' #必不可少的属性,需要利用它去决定启动哪个爬虫

allowed_domains = ['58.com']

start_urls = ['http://58.com/'] #从start_urls中启动链接

def parse(self, response):

pass

结果如下:

image

自动生成如下代码

image

-- coding: utf-8 --

import scrapy

class SpiderCity58Spider(scrapy.Spider):

name = 'spider_city_58' #必不可少的属性,需要利用它去决定启动哪个爬虫

allowed_domains = ['58.com'] #允许的站点

start_urls = ['http://58.com/'] #从start_urls中启动链接 ,list可以是一条也可以是一系列,也可以从文件中读,自动调用start_urls 发送出去返回源代码,默认的,所以原生代码没有。

def parse(self, response): #parse默认解析器

pass

image

不要重写,request不重写,按照默认

image

Scrapy的基本方法和属性:

  • 爬虫名称:name属性
  • 启动方法:start_requests(),或者直接使用start_urls启动
  • 默认解析器方法:parse()
  • 启动链接列表:start_urls属性

我们使用Scrapy的启动命令的时候,需要知道它的name属性,利用name属性去决定启动那个爬虫。如本例中爬虫名字是“spider_city_58”,则可以在命令行中使用:scrapy crawl spider_city_58 启动这个爬虫

爬虫默认首先从start_urls里面读取链接,然后自动调用start_request函数(或者你也可以自己定义start_request函数),此函数请求的结果自动调用默认解析器parse,也就是调用parse处理返回来的response

  1. 启动Scrapy框架

为了方便知道请求到达了默认解析器parse,可以在解析器中输出一句话“我进入了解析器”

-- coding: utf-8 --

import scrapy

class SpiderCity58Spider(scrapy.Spider):

name = 'spider_city_58'

allowed_domains = ['58.com']

start_urls = ['http://58.com/']

def parse(self, response):

print('我进入了解析器')

启动方法:

第一种方法:打开命令行,切换到项目目录下,执行scrapy crawl spider_city_58。

第二种方法:在项目中建立一个main.py文件,然后运行该文件即可。

from scrapy import cmdline

cmdline.execute("scrapy crawl spider_city_58".split())

课后作业:

  • 利用Scrapy框架自行设计一个爬虫

补充资料

Scrapy常用命令行命令

Scrapy提供了两种类型的命令,分别为全局命令和项目命令

项目命令必须在Scrapy项目中运行,全局命令则不需要。因此,运行相关的项目命令时,必须把当前命令行的路径切换到对应的项目下

|

全局命令:

|

全局命令:

|
|

项目命令

|

项目命令

|
|

startproject

|

shell

|
|

crawl

|

bench

|
|

genspider

|

fetch

|
|

check

|

list

|
|

settings

|

view

|
|

parse

|

edit

|
|

runspider

|

version

|
|
|
|

查看所有命令

scrapy -h

查看帮助信息

scapy –help

查看版本信息

scrapy version

Scrapy 1.1.2

scrapy version -v

Scrapy : 1.4.0

lxml : 3.8.0.0

libxml2 : 2.9.4

cssselect : 1.0.1

parsel : 1.2.0

w3lib : 1.18.0

Twisted : 17.9.0

Python : 3.6.2 |Anaconda custom (64-bit)| (default, Sep 19 2017, 08:03:39) [MSC v.1900 64 bit (AMD64)]

pyOpenSSL : 17.2.0 (OpenSSL 1.0.2l 25 May 2017)

Platform : Windows-8.1-6.3.9600-SP0

startproject命令:新建一个项目,后面跟的是项目名字

scrapy startproject spider_name

genspider命令:

生成一个spider文件,一个工程中可以存在多个spider, 但是名字必须唯一;

爬虫名字后面加上限制的主域名,也就是限制爬虫只爬取该域名页面下的数据;

针对某个爬虫项目生成spider文件时,需要将命令行当前工作目录切换到对应的爬虫项目路径下

scrapy genspider name domain

例如:

scrapy genspider taobao taobao.com

指定了新生成的爬虫名字是“taobao”,限制爬取的主域名是“taobao.com”

查看当前项目内有多少爬虫

scrapy list

使用浏览器打开网页

scrapy view http://www.baidu.com

shell命令:进入scrapy交互环境,方便实时验证结果

进入该url的交互环境

scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/

之后便进入交互环境

我们主要对这里面的response(也就是爬虫的响应文件)进行操作, 例如:

response.xpath() #括号里直接加xpath路径

runspider命令:用于直接运行创建的爬虫, 并不会运行整个项目

scrapy runspider 爬虫名称

fetch命令:使用Scrapy下载器下载给定的URL,并将内容写入标准输出。

scrapy fetch

settings:获取Scrapy设置的值。 如果在项目中使用,它将显示项目设置值,否则将显示该设置的默认Scrapy值。

scrapy settings [options]

parse命令:获取给定的URL并使用处理它的爬虫解析它,使用通过–callback选项传递的方法,或者parse如果没有给出。

scrapy parse [options]

scrapy项目文件的结构及用途

可以看到,在city_58项目文件夹下有city_58文件夹和scrapy.cfg文件,其中scrapy.cfg文件中主要包含的是项目的相关设置。而在scrapy文件夹下我们可以看到:

Spiders文件夹:我们可以在Spiders文件夹下编写我们的爬虫文件,里面主要是用于分析response并提取返回的item或者是下一个URL信息,每个Spider负责处理特定的网站或一些网站。

init.py:项目的初始化文件。

items.py:定义我们所要爬取的信息的相关属性。Item对象是种容器,用来保存获取到的数据。

middlewares.py:Spider中间件,在这个文件里我们可以定义相关的方法,用以处理蜘蛛的响应输入和请求输出。

pipelines.py:在item被Spider收集之后,就会将数据放入到item pipelines中,在这个组件是一个独立的类,他们接收到item并通过它执行一些行为,同时也会决定item是否能留在pipeline,或者被丢弃。

settings.py:提供了scrapy组件的方法,通过在此文件中的设置可以控制包括核心、插件、pipeline以及Spider组件。

我们来具体介绍一下我们在今后用的到的文件的基本用途:

items.py

双击打开这个文件,看一下都初始化了什么东西

-- coding: urf-8 --

Define here the models for your scrapyed items

See documentation in

http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class TaoBaoItem(scrapy.Item):

define the fields for your item here like:

name = scrapy.Filed()

pass

通过里面的注释可见,这个文件的作用是定义我们要爬取信息的标准格式,打个比方说,如果我们要爬取一批人的个人信息,包括姓名,性别,生日,那么我们可以这样来书写这个文件

import scrapy

class TaoBaoItem(scrapy.Item):

name = scrapy.Filed()

sex = scrapy.Filed()

birthday = scrapy.Filed()

易见本文件只是定义了一个类,至于什么时候实例化它,怎么保存它,请继续了解下面的内容。

settings.py

如其名,这是本项目的配置文件,里面注释着很多常用的配置项,我们通过在其它文件中引入本文件的方式来使用这些配置项。

当然,我们可以把这些注释都删掉,等需要开启哪个功能的时候再另行编辑

我们此处先看看默认打开的配置项吧

BOT_NAME = 'taobao'

SPIDER_MODULES = ['taobao.spiders']

NEWSPIDER_MODULE = 'taobao.spider'

Obey robots.txt rules

ROBORSTXT_OBEY = True

因为我们写的是定向爬虫,前面三个按默认即可,我们不去管他。看第四项,注释里说这个配置项的意思是遵守robots.txt,如果不遵守的话可以设置为False

pipelines.py

双击打开这个文件,看看都初始化了什么东西

-- coding: utf-8 --

Define your item pipelines here

Don't forget to add your pipeline to the ITEM_PIPELINES setting

See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

class TaobaoPipeline(object):

def process_item(self, item, spider):

return item

注释提醒我们要启用Pipeline的话必须要在settings.py里配置一下ITEM_PIPELINES,配置好后,我们的setting.py如下:

-- coding: utf-8 --

BOT_NAME = 'taobao'

SPIDER_MODULES = ['taobao.spiders']

NEWSPIDER_MODULE = 'taobao.spider'

ROBORSTXT_OBEY = True

ITEM_PIPELINES = {

'taobao.pipelines.TaobaoPipeline': 300,

}

此处的300表示优先级,数字越小优先级越高,代表这个Pipeline会越优先被执行。因为本项目只用到这一个pipeline,所以随意取0-1000中的一个数值即可。

再回到pipelines.py这个文件,这个文件到底有什么用呢?

  • 对爬取到的数据(Item)进行处理,比如存入数据库
  • 爬虫结束时产生事件,比如发送一封邮件

此处只是介绍一下,具体的操作要看后续教程。

爬虫

以上为默认生成的项目结构,而爬虫文件我们需要自己写。

在默认生成的spiders目录下新建Taobao_spider.py,我们的爬虫就写在这里面。下面为一个简单的下载网页源代码的爬虫。

import scrapy

class TaobaoSpider(scrapy.Spider):

name = "taobao" # 爬虫的名字,执行时使用

start_urls = [

'https://s.taobao.com/search?q=%E8%BF%9E%E8%A1%A3%E8%A3%99&imgfile=&js=1&stats_click=search_radio_all%3A1'

'&initiative_id=staobaoz_20171101&ie=utf8'

]

def parse(self, response): # 真正的爬虫方法

html = response.body # response是获取到的来自网站的返回

以下四行将html存入文件

filename = "index.html"

file = open(filename, "w")

file.write(html)

file.close()

需要说明的是:这个类不是随心所欲来写的,name,allowed_domains,start_urls,都是类似于“重载”的值。也就是说,scrapy内部会检测这些变量的值,变量名不可以起成其它的名字,类似的变量之后还会有介绍。至于parse方法,就是重载的父类的方法,我们爬虫的主体一般就写在这里面

敲黑板

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

推荐阅读更多精彩内容