爬虫 scrapy

1.创建项目

创建项目 scrapy startproject + 项目名称

2.创建应用

进入到spiders 文件夹下 创建爬虫文件 scrapy genspider + 爬虫文件名称 + 网站的域
.创建完成之后打开pycharm 创建好的项目,选择虚拟环境

爬虫文件的名称不可以和项目的名称重名

scrapt 项目的架构
chinaz 项目文件夹
spiders 存放所有的爬虫文件
zzw.py 爬虫文件(解析response 响应,提取目标数据和url)
items.py 编写要爬取的字段
middiewares.py 中间件(爬虫中间件,下载中间件)
piplines.py 数据管道(做数据持久化)
settings.py 设置文件(设置请求头,下载延迟,是否遵循robot协议,等 ....)
scrapy.cfg 配置文件(部署项目的时候会用到)

3.运行

运行 : 进入chainz/ 在进入 spiders 在执行scrapy crawl zzw

使用框架可以更高的提升我们的执行效率

1.引擎:负责各个模块的数据传递
创建通用爬虫: scrapy crawl -t genspider + 爬虫名称 + 网站的域

流程

setting.py 设置文件
ROBOTSTXT_OBEY = False 是否要遵守robot 协议,为True 表示遵守,要改为False 不遵守
DOWNLOAD_DELAY = 0 设置下载延迟,默认为0 ,将注掉的代码打开
DEFAULT_REQUEST_HEADERS = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
} 默认的请求头,是全局的,将注掉的代码打开

zzw.py 爬虫文件
name = 'zzw':爬虫文件的名称,每一个爬虫文件都有一个爬虫的名称,是唯一的
allowed_domains = ['chinaz.com']: allowed_domains = ['chinaz.com']
start_urls = '[http://top.chinaz.com/']: 设置要爬取的起始的url 链接,任务,可以指定多个

response :接收相应结果,解析数据,提取新的url
  response.status:获取响应的状态码
  response.text:获取响应的html文本
  response.body:获取响应的二进制数据(当response.text出现乱码的时候,可以拿到二进制数据进行解码)
  response.headers:获取响应头
  response.request.headers :获取请求的请求头

  解析数据
  导入items.py 文件中要爬取的字段定义的类  例如: from chainz.items import ChainzItem
  cate_items =  ChainzItem() :实例化一个item对象
  利用 response.xpath 做数据的提取 例如:
  例如:方式 1. title = category_a.xpath('./text()').extract()[0]
              方式 2 .title = response.xpath('./text()').extract_first(' ')
   获取出来的都是Selector对象,并且都存放在列表里面
   extract():作用是将提取到的Selector对象中的data数据提取出来,这里提取出来的是unicode编码类型
   extract_first(' '):取列表中的第一个元素,如果列表为空,可以在括号中添加一个默认值,如果不设置默认值返回的是None
   将不完整的url拼接完整
    例如:方式 1. cate_items['fristpage'] = urljoin(response.url,href)
                方式 2. cate_items['fristpage'] = response.urljoin(href)
  yield 方法:将items数据交给管道(这里使用yield)管道就使用yield
  yield:将获取到的数据都交给管道处理就使用yield     例如:yield.cate_items
  发起一个请求:例如:yield scrapy Request(url=category_item['fristPage'],callback=self.parse_web_list_data
  Request 方法需要的参数: 
  """
        url, 发起请求的url地址
        callback=None, 请求成功后的回调
        method='GET', 请求的方式
        headers=None, 请求头
        cookies=None, cookies
        meta=None, 要传递的参数
        encoding='utf-8', 编码类型
        priority=0, 优先级
        dont_filter=False, 是否要过滤请求(False去重,不会重复请求)
        errback=None 请求错误的回调
  """

将数据存到本地
注意:在使用管道之前,要先激活管道,需要在setings 文件中激活
setting.py 设置文件
将注释掉的代码打开,在这里进行管道的激活,前面表示路径,后面跟的数字,数字越小表示优先级越高,越先经过哪个类
ITEM_PIPELINES = { 'chinaz.pipelines.ChinazPipeline': 300,}
回到 pipelines.py 管道文件中
定义 open_spider 方法,是一个可选的方法,有需要的时候就去调用,当spider 方法开启的时候,会执行,并且只调用一次,表示 爬虫开始
定义 close_spider方法, 和open_spider 方法一样,只调用一次,表示,爬虫结束



mongodb 数据持久化 将数据存入到 mongodb 数据库中
return item 的作用:
在初始化中创建数据库连接 例如:self.client = pymongo.MongoClient(host,port)
获取数据库 例如: self.db = self.client[db]
@classmethod 是一个类方法,crawler:可以从crawler里面获取到爬虫的核心组件(从[settings.py](http://settings.py)设置文件中获取相关参数)
def from_crawler(cls, crawler):
例如:host = crawler.settings['MONGO_HOST']
port = crawler.settings['MONGO_PORT']
return cls(host,port)
在 setting.py 设置文件中 写入mongodb数据库相关配置如下代码
MONGO_HOST = '127.0.0.1'
MONGO_PORT = 27017
MONGO_DB = 'chinaz-99'
在 item.py 定义方法 例如: def get_collection_name(self): return 'categroy'
回到 pipelines.py 管道文件中
col_name = self.db[item.get_collection_name()]
col_name.insert(dict(item))
定义 close_spider()方法 爬虫结束的时候会调用 self.client.close()


mysql 数据库持久化,将数据存放在mysql 数据库中
在   piplines.py  管道文件中做mysql 的数据持久化
创建一个数据库连接   self.client = pymysql.Connect(host,user,pwd,db,charset=charset)
创建游标     self.cursor = self.client.cursor()
在setting.py 设置文件中 写入mysql 数据库相关配置
MYSQL_HOST = '127.0.0.1'
MYSQL_USER = 'root'
MYSQL_PWD = '123'
MYSQL_DB = 'china_999'
MYSQL_CHARSET = 'utf8'

scrapy 五大模块

中间的是引擎: 引擎负责各个模块之间的通信与调度
引擎的下面是 spiders 爬虫文件
引擎的上面是调度器
引擎的左面是数据管道
引擎的右面是下载器
引擎和下载器中间是 下载中间件
引擎和爬虫中间是 爬虫中间件

具体运行流程

1. spiders 爬虫文件里面有一个start_url的参数,里面放的就是我们要爬取的目标url ,

2.把要爬取的url 构建一个request 请求,经过爬虫中间件给引擎,经过引擎给调度器,把任务存放在任务队列里面,

3.如果要获取数据的时候,从调度器里面拿数据给引擎,

4.引擎拿到请求之后,经过下载中间件给下载器 (request 请求),把request 给我们的下载器,

5.下载器根据引擎发过来的任务,向对方服务器发起请求拿到一个response 响应,

6.最终把响应通过下载中间件,经过引擎,经过爬虫中间件,最终给spiders 爬虫文件(最终把response响应给爬虫文件),

7.爬虫文件拿到响应之后在爬虫文件里面做两件事 (1.解析响应,提取目标数据,2.提取新的url),

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

推荐阅读更多精彩内容