一个爬虫工程师的技术博客

thunder


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 公益404

scrapy教程

发表于 2016-07-04   |   分类于 scrapy   |     |   阅读次数

目录

[TOC]

前言

scrapy现在已经在我们的”雅典娜”系统中使用, 它是一个开源的由python编写的成熟的爬虫框架, git地址scrapy

需要掌握的技术和工具

  1. 爬虫相关知识(爬虫反爬虫)
  2. xpath语法, css选择器语法
  3. scrapy
  4. Bloom Filter
  5. python-rq
  6. redis或mongodb

安装scrapy

这里在ubuntu上安装

  1. 首先安装python, 版本2.7.3
  2. sudo apt-get install python-dev
  3. sudo apt-get install libevent-dev
  4. pip install Scrapy
    下面是在windows 64上安装scrapy的教程[python]Win7 X64安装python Scrapy

入门案例: 从w3school.com.cn开始

  1. 建立项目: scrapy startproject w3school
  2. 编写Item: 编辑items.py, 对抓取的数据进行结构化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import scrapy
    from scrapy.item import Item,Field


    class W3SchoolItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = Field()
    link = Field()
    desc = Field()
  3. 编写pipelines.py: 主要完成数据的查重、丢弃,验证item中数据,将得到的item数据保存等工作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import json  
    import codecs


    class W3SchoolPipeline(object):
    def __init__(self):
    self.file = codecs.open('w3school_data_utf8.json', 'wb', encoding='utf-8')

    def process_item(self, item, spider):
    line = json.dumps(dict(item)) + '\n'
    # print line
    self.file.write(line.decode("unicode_escape"))
    return item
  4. settings.py 开启piplines

    1
    2
    3
    ITEM_PIPELINES = {  
    'w3school.pipelines.W3SchoolPipeline':300
    }
  5. 编写爬虫: 在spiders文件夹下新建: w3cshool_spider.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #!/usr/bin/python  
    # -*- coding:utf-8 -*-

    from scrapy.spider import Spider
    from scrapy.selector import Selector
    from scrapy import log

    from w3school.items import W3schoolItem


    class W3schoolSpider(Spider):
    """爬取w3school标签"""
    #log.start("log",loglevel='INFO')
    name = "w3school"
    allowed_domains = ["w3school.com.cn"]
    start_urls = [
    "http://www.w3school.com.cn/xml/xml_syntax.asp"
    ]

    def parse(self, response):

    sel = Selector(response)
    sites = sel.xpath('//div[@id="navsecond"]/div[@id="course"]/ul[1]/li')
    items = []

    for site in sites:
    item = W3schoolItem()

    title = site.xpath('a/text()').extract()
    link = site.xpath('a/@href').extract()
    desc = site.xpath('a/@title').extract()

    item['title'] = [t.encode('utf-8') for t in title]
    item['link'] = [l.encode('utf-8') for l in link]
    item['desc'] = [d.encode('utf-8') for d in desc]
    items.append(item)

    #记录
    log.msg("Appending item...",level='INFO')


    log.msg("Append done.",level='INFO')
    return items
  6. 执行爬虫
    scrapy crawl w3school --set LOG_FILE=log

Scrapy核心架构与代码运行分析


这个是官网的scrapy框架图, 介绍的很详细

1
2
3
4
5
6
7
8
1. 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。
2. 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。
3. 下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。
4. 蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
5. 项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
6. 下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
7. 蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。
8. 调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

自动爬取网页之:crawlspider

如何防止被ban之策略大集合

参考

学习Scrapy入门

gRPC

发表于 2016-07-04   |   分类于 gRPC   |     |   阅读次数

目录

[TOC]

前言

gRPC是由Google主导开发的RPC框架, 使用HTTP/2协议并用ProtoBuf作为序列化工具.
在gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得用户能够更容易地创建分布式应用和服务. grpc官网

阅读全文 »

加菲猫帮助教程

发表于 2016-06-15   |   分类于 加菲猫   |     |   阅读次数

加菲猫帮助文档

目录

[TOC]

说明

这是一个加菲猫(系统的别名)的简单的帮助文档, 目的是帮助快速了解和使用加菲猫系统

系统介绍

名词解释

  1. IRC: 加菲猫系统的管理控制中心, 管理所有的配置信息
  2. SHELL: 加菲猫系统的客户端(服务), 一台机器上只有一个SHELL
  3. SDK: 每种语言封装一个SDK, 要在程序中使用加菲猫系统, 使用SDK中的方法, 比如通过服务的别名调用这个服务的某个接口, SDK会帮助我们自动选择路径
  4. 服务: 搜索服务在这里是一个服务, 一个mysql是一个服务, 一个redis也是一个服务, 每个服务要使用唯一的服务名进行区分
  5. 机器: 机器在这里类似于一台计算机(用IP来区分), 特殊的如果是云主机(比如mysql云数据库,我们没法给那个机器安装我们的SHELL服务), 它也是一台机器, 用类型字段进行标记
  6. 节点: 节点就是关联服务和机器, 一台服务可能会部署到多台机器, 而一个机器上会存在多个服务, 所以节点是中间表的概念
  7. 关系: 一个服务A要使用另一个服务B, 就需要对这两个服务进行关联,slave服务就是服务A, 服务B就是master服务

流程


1
2
3
4
5
6
7
8
9
10
如果服务A要使用服务B, 流程如下:
1. 首先给服务A和服务B所在的机器安装SHELL服务(go语言编写)并启动
2. 在加菲猫前端依次添加:
a. 机器: 服务A所在机器, 服务B所在机器
b. 服务: 服务A, 服务B
c. 节点: 服务A和所在机器的关联(节点), 服务B和躲在机器的关联(节点)
d. 关系: 服务A关联服务B
3. 在前端所做的操作(配置信息)都会下发到服务A和服务B所在的机器中去(以xml的形式存储在本地文件中)
4. 在服务A的程序中使用对应语言的SDK(后期完善各种语言的SDK, 当前只有python版本)
5. 查看日志报表(在加菲猫前端)

案例演示

现在以一个虚拟的项目模拟整个加菲猫的流程
开发机:

1
2
3
4
172.16.17.118
172.16.17.119
172.16.17.99
172.16.10.123

安装shell

首先分别在四台开发机上运行shell服务, shell服务由go语言编写, 下载已经编译的安装包shell.zip, 解压后进入shell文件夹运行./service-proxy, 我们可以在加菲猫机器列表中看到已经添加的机器(shell启动自动上报自己的机器信息给IRC)

安装测试服务

在上面的四台开发机上安装一个测试服务器test-server, 这个服务提供四个get请求方式的接口:

1
2
3
4
http://localhost:1203/left?delay=100
http://localhost:1203/right?delay=100
http://localhost:1203/up?delay=100
http://localhost:1203/down?delay=100

delay参数表示延迟多少返回, 单位是ms, 该服务同样由go语言编写, 下载解压后进入test-server目录后, 运行./api-for-shell-test即可

注册服务

注册master服务

在四台开发上安装了测试服务之后, 需要再加菲猫系统中对这四个服务进行注册, 需要给每个服务起一个别名(必须是唯一的)

1
2
3
4
sdk-test-server-1
sdk-test-server-2
sdk-test-server-3
sdk-test-server-4

注册slave服务

这里只添加一个slave服务作为简单的测试

1
sdk-test-client-1

添加节点(给服务关联机器)

这里每个服务只关联一个节点, 你也可以关联多个

1
2
3
4
5
sdk-test-server-1 => 172.16.17.99
sdk-test-server-2 => 172.16.17.118
sdk-test-server-3 => 172.16.17.119
sdk-test-server-4 => 172.16.10.123
sdk-test-client-1 => 172.16.17.99

添加关系

这里一个slave服务关联是个master服务

1
2
3
4
sdk-test-client-1 => sdk-test-server-1
sdk-test-client-1 => sdk-test-server-2
sdk-test-client-1 => sdk-test-server-3
sdk-test-client-1 => sdk-test-server-4

查看结构图

根据我们前面的配置, 可以在 结构图管理界面中查看服务的关联关系, 模糊输入要查看的服务, 选中后会在页面显示这个服务关联的所有服务(slave服务和master服务)

使用SDK

首先我们看一下SDK的路径选择图

获取python版本的sdk.zip, 解压放到自己的工程目录下

  1. 导入

    1
    from jfm_sdk_py.sdk import JFM
  2. 生成对象

    1
    jfm = JFM()
  3. 使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if __name__ == '__main__':
    slave = 'sdk-test-client-1' # slave服务的名称
    master = 'sdk-test-server-1' # master服务的名称
    path = 'left' # 请求接口的path
    param = { # 请求参数
    "delay": 4000
    }
    print jfm.route_auto(slave, master1, path1, param) # 使用sdk自动选择路径(一般使用这个)
    print jfm.route_proxy(slave, master1, path1, param) # 指定使用shell的代理的方式(路径1)
    print jfm.route_info(slave, master1, path1, param) # 指定使用shell的info方式(路径2)
    print jfm.route_direct(slave, master1, path1, param) # 指定直接使用真实的接口(路径3)

查看报表

加菲猫系统所有的日志都会存储到ELK系统, 我们使用kibana对日志进行了报表展示, 主要分成两块: IRC日志和SHELL日志

查看IRC报表

点击主页的报表(Kibana报表-加菲猫IRC)

查看SHELL报表

点击主页的报表(Kibana报表-加菲猫SHELL)

下载

最后提供本文档中涉及到的安装包:

  1. shell.zip
  2. test-server.zip
  3. sdk.zip(python版)
  4. sdk-test.zip(python版本)

HTTP/2

发表于 2016-06-01   |   分类于 http   |     |   阅读次数

前言

现在的互联网几乎全部使用的是HTTP/1.1作为传输协议,但是随着互联网的日益膨胀,HTTP/1.1协议的问题也被逐渐放大,HTTP/2作为下一代协议正在逐渐发展

阅读全文 »

待完成

发表于 2016-05-14   |   分类于 待完成   |     |   阅读次数

需要以后完成的部分:
1.MYSQL优化(4)-profiling.md
2.MYSQL优化(5)-配置.md
5.mysql全文检索.md
6.mysql索引.md
7.完成一个航空公司的爬虫系统(B2B, 或者B2C)
多个节点的爬虫
有一个中间节点分发
队列都使用redis
最后日志打到elk
抓取结果最后merge到redis
最后从redis到mysql1

  1. restful API的格式
123…12
忍者神龟

忍者神龟

爱打篮球的程序狗

58 日志
30 分类
93 标签
github zhihu weibo douban
© 2016 忍者神龟