scrapy框架

scrapy框架
Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。

scrapy架构图

scrapy各部分简介:

Scrapy Engine(引擎): 负责信号和数据的传递,起协调作用.(框架帮我们实现了)

Scheduler(调度器): 会将Request请求任务,存储在任务队列中,引擎会从任务队列中提取任务交给下载器 (框架帮我们实现了)

只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy也会重新下载。)

Downloader(下载器):接收引擎传递过来的请求,发起请求,获取响应,最终将响应结果交给spider爬虫文件(框架帮我们实现了)

Spider(爬虫):根据起始url发起请求,解析响应结果,第一获取目标数据,第二提取新的url   (手动实现)

Item Pipeline(管道):将spider爬虫文件yeild的item数据,做过滤和持久化  (手动实现的)

Downloader Middlewares(下载中间件):自定义下载组件(请求任务和响应结果都会经过下载中间件)代理中间件,cookies中间件,Uaer-Agent中间件,selenium中间件.. (特殊需求要手动实现)

Spider Middlewares(Spider中间件):可以自定义request请求和过滤Response响应  (特殊需求要手动实现)

安装

sudo pip3 install scrapy

新建项目

scrapy startproject 爬虫项目名称

然后cd到spider文件夹下

新建爬虫文件

crapy genspider 爬虫文件名称 域名:制作爬虫开始爬取网页

在这个时候我们项目的目录结构应该会是这样的

一个项目有5个文件我们一般情况下会进行修改

1.pipeline.py

做数据的过滤和持久化

可以在这里做数据持久化, 如果有多个管道文件,并且有优先级顺序一定要记住return item,否则下一个管道无法接受item

它还要两个可选方法

def open_spider(self,spider):

        可选方法,在爬虫开始执行的时候调用一次

        print(spider.name,'爬虫开启')

    def close_spider(self,spider):

        可选方法,在爬虫结束的时候调用一次

        self.file.close()

        print(spider.name,'爬虫结束')

2.item.py

根据目标网站,定义要提取的目标字段

3.spiders.py

spiders文件夹下存放的是爬虫文件

name

    定义spider名字的字符串。

allowed_domains

    包含了spider允许爬取的域名(domain)的列表,可选。

start_urls

    初始URL元组/列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。

start_requests(self)

    该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取(默认实现是使用 start_urls 的url)的第一个Request。

    当spider启动爬取并且未指定start_urls时,该方法被调用。

parse(self, response)

    当请求url返回网页没有指定回调函数时,默认的Request对象回调函数。

yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator

4.settings.py

设置文件,可以在里面做User-Agent,Headers,激活管道文件等等

BOT_NAME

(也是项目名称)。使用 startproject 命令创建项目时会被自动赋值。

SPIDER_MODULES = ['ziruproject.spiders'] NEWSPIDER_MODULE = 'ziruproject.spiders'

爬虫的文件路径

USER_AGENT

用户代理,一般设置这个参数用来伪装浏览器请求

ROBOTSTXT_OBEY

是否遵守ROBOT协议,为False时,表示不遵守,

为True时表示遵守(默认为True)

COOKIES_ENABLED

是否要携带cookies,一般情况下,不是必须要携带

cookies的请求,我们将这个参数设置为False,(默认为True)

DEFAULT_REQUEST_HEADERS

默认: 如下

{

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Language': 'en',

}

用于Scrapy HTTP请求的默认标头

ITEM_PIPELINES

设置并激活管道文件,为了存储数据使用,

后面的数字表示优先级,数字越小,优先级越高

关于日志信息的设置

LOG_ENABLED

默认: True

是否启用logging。

LOG_FILE

默认: None

logging输出的文件名。如果为None,则使用标准错误输出(standard error)。

Logging使用

Scrapy提供了log功能,可以通过 logging 模块使用。

可以修改配置文件settings.py,任意位置添加下面两行,效果会清爽很多。

LOG_FILE = "TencentSpider.log"

LOG_LEVEL = "INFO"

5.middleware.py

下载中间件和爬虫中间件

middleware的使用主要是为了自定义一些第三方组件,是爬虫和反爬的重要过程

主要有四种:

1.随机User-Agent

2.自定义随机cookies

3.enium结合使用

4.自定义随机ip池

除了一般的scrapy框架之外还有通用爬虫

通用爬虫和一般爬虫的区别主要是多了一个Rule的规则

他的主要参数是:

LinkExtractor中有:

allow:一般设置一个正则表达式,符合该正则表达式的连接,提取该url(常用)

deny:同样是跟一个正则表达式,符合该正则表达式的连接,不提取该url

(优先级比allow要高)

 allowed_domains:提取的连接,必须在allowed_domains设置的域下

  deny_domains: 提取链接时,一定不能提取deny_domains设置的域下

restrict_xpaths:当提取链接的时候,我们可以使用xpath语法定位到某些标签,提取标签下,

 符合规则的链接 (常用)

tags:可以指定要提取哪些标签

 attrs:可以指定要提取标签的哪些属性

 restrict_css:当提取链接的时候,我们可以使用css语法定位到某些标签,提取标签下,

 符合规则的链接 (常用)

还有:

callback='回调函数名称',

 follow=True | False,  # 表示是否要跟进

爬虫的步骤

step1:

分析目标网站,根据要提取的目标数据,在items.py中自定义字段

step2:

    在爬虫文件中:(1)首先设置目标url

                                (2) 解析请求成功的响应结果,提取目标数据,赋值给item,提取新的url,继续发起请求

step3:

    (1) 在设置文件中激活管道

    (2) 在管道文件中做数据的过滤和持久化

注意:

1.进入项目一定要先设置虚拟环境

2.首先更改settings的几个配置

    (1).ROBOTSTXT_OBEY

是否遵守ROBOT协议,为False时,表示不遵守,

为True时表示遵守(默认为True)

(2).COOKIES_ENABLED

是否要携带cookies,一般情况下,不是必须要携带

cookies的请求,我们将这个参数设置为False,(默认为True)

(3).DEFAULT_REQUEST_HEADERS

此设置是设置一个全局的请求头

默认: 如下

{

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'Accept-Language': 'en',

}

(4).DOWNLOAD_DELAY =1(防止访问过于频繁)

表示延时下载,一般情况下设为1或2

通用爬虫:为了全站爬取

通用爬虫创建项目

scrapy genspider -t crawl 爬虫名称 域

通用爬虫与普通爬虫的区别就在于多了一个rules规则

rules 规则属性的参数:是一个元组,可以放多个Rule对象

创建Rule:

LinkExtractor:设置提取规则

(allow,deny,allow_domea..,deny_domea..,restrict_xpath,restrict_css)

callback:设置回调函数

follwer:是否跟进

process_links:设置一个函数,根据正则规则获取的url,可以在回调函数中获取到

processs_request:设置一个函数,可以在这个回调方法中拦截所有根据正则规则提取到的url构建的Request对象

注意:

1.设置回调的时候一定不能重写parse方法

2.要获取起始url的响应结果 ,必须重写parse_start_url

3.在设置Rule对象的时候,如果没有callback回调函数,默认表示跟进

什么情况下会用到通用爬虫???

当我们提取数据的目标网站的网址很有规律,并且模块很清晰,我么就可以使用通用爬虫class

数据持久化之图片下载

在 ImagesPipeline 类中实现,提供了一个方便并具有额外特性的方法,来下载并本地存储图片

首先在setttings里设置一个图片下载路径

然后在自定义的图片下载管道里获取到这个图片路径

第一种:正常的发起请求 ,获取图片的二进制文件,保存

第二种:自定义图片管道,继承自ImagePipline

    重写两个方法:

        def get_media_request(self,item,spider):

            获取图片地址,发起请求

        def item_completed(self,results,spider,item,....):

            在results结果中根据图片下载状态,获取图片本地存储的路径,

            将获取的路径赋值给item,然后将item返回给其他管道

# 数据持久化:(切记激活管道)

    1.可以自定义数据管道

        def __init__(self,xxx,xxxxx,xxxxx):

            # 可以设置一些参数,(比如,创健数据库链接,打开文件等等

        @classmethod

        def from_crawler(cls,crawler):

            crawler:包含了爬虫的一些核心组件,可以获取settings中的一些参数

            return cls(xxx,xxxx,xxxx)

        def open_spider(self,spider):

            # 可选方法,在爬虫个开启的时候会调用

        def process_item(self,item,spider):

            # 所有的item都会经过这个方法

            # 在这里做数据持久化(pymongo,pymysql)

            # 方法一:

            if isinstance(item,类名)

                做数据插入操作

            elif isinstance(item,类名)

                做数据插入操作

            方法二:

                1.在item对应的类中,我们定义一个方法,返回sql语句和要插入的数据

                2.使用item调用这个方法,得到sql语句和要插入的数据

                3.执行插入操作

            return item(如果要将item,传递给下一个管道,必须要return)

数据持久化之mongodb

首先在settings设置数据库配置文件

MONGDDBHOST = '127.0.0.1'

MONGODBPORT = 27017

MONGODB_DB = 'dbname'

import pymongo

class QunaPipeline(object):

    def __init__(self,MONGODBHOST,MONGODBPORT,MONGODB_DB):


        self.client = pymongo.MongoClient(MONGODBHOST,MONGODBPORT)

        self.db = self.client[MONGODB_DB]

    @classmethod

    def from_settings(cls,settings):

        MONGODBHOST = settings['MONGODBHOST']

        MONGODBPORT = settings['MONGODBPORT']

        MONGODB_DB = settings['MONGODB_DB']

        return cls(MONGODBHOST,MONGODBPORT,MONGODB_DB)

    def process_item(self, item, spider):

        self.db[item.get_db_col()].insert(dict(item))

        return item

数据持久化之mysql

同样的,我们也把数据库的配置信息,写在settings里

MYSQL_HOST = 'localhost'

MYSQL_USER = 'root'

MYSQL_PWD = 'pwd'

MYSQL_DB = 'dhname'

import pymysql

from jobboleproject.items import JobboleprojectItem

class JobboleprojectPipeline(object):

    def __init__(self,host,user,pwd,db):

        #创建mysql连接

        self.client = pymysql.Connect(host,user,pwd,db,charset='utf8')

        #创建游标

        self.cursor = self.client.cursor()

    @classmethod

    def from_crawler(cls, crawler):

        host = crawler.settings['MYSQL_HOST']

        user = crawler.settings['MYSQL_USER']

        pwd = crawler.settings['MYSQL_PWD']

        db = crawler.settings['MYSQL_DB']

        return cls(host,user,pwd,db)

    def process_item(self,item,spider):

        data = dict(item)

        sql,parmars = item.insert_db_by_data(data)

        try:

            self.cursor.execute(sql,parmars)

            self.client.commit()

        except Exception as err:

            self.client.rollback()

            print(err)

        return item

    def close_spider(self,spider):

        self.cursor.close()

        self.client.close()

Scrapy Shell

scrapy还有一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据。

启动

scrapy shell  爬取目标网页

electors选择器 Scrapy Selectors 内置 XPath 和 CSS Selector 表达式机制 Selector有四个基本的方法,最常用的还是xpath:

xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表

extract(): 序列化该节点为字符串并返回list

css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表,语法同 BeautifulSoup4

re(): 根据传入的正则表达式对数据进行提取,返回字符串list列表

scrapy -h 查看所有可用的命令:

scrapy view -h 查看view命令的详细内容:

scrapy list列出当前项目中所有可用的spider

scrapy runspider xxxx.py在未创建项目的情况下,运行一个编写在Python文件中的spider。

scrapy version输出Scrapy版本

Scrapy 的暂停和恢复

爬取大的站点,我们希望能暂停爬取,之后再恢复运行。

scrapy crawl 爬虫名称 -s JOBDIR=crawls/爬虫名称

如要暂停,直接Ctrl+C即可,若要恢复,再一次运行此代码即可

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

推荐阅读更多精彩内容