入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

分布式爬虫搜索

创建时间:2017-11-18 投稿人: 浏览次数:3328

最近在网上学习一门关于scrapy爬虫的课程,觉得还不错,以下是目录还在更新中,我觉得有必要好好的做下笔记,研究研究。

第1章 课程介绍

  •  1-1 python分布式爬虫打造搜索引擎简介 07:23 

第2章 windows下搭建开发环境

  •  2-1 pycharm的安装和简单使用 10:27 
  •  2-2 mysql和navicat的安装和使用 16:20 
  •  2-3 windows和linux下安装python2和python3 06:49 
  •  2-4 虚拟环境的安装和配置 30:53 

第3章 爬虫基础知识回顾

  •  3-1 技术选型 爬虫能做什么 09:50 
  •  3-2 正则表达式-1 18:31 
  •  3-3 正则表达式-2 19:04 
  •  3-4 正则表达式-3 20:16 
  •  3-5 深度优先和广度优先原理 25:15 
  •  3-6 url去重方法 07:44 
  •  3-7 彻底搞清楚unicode和utf8编码 18:31 

第4章 scrapy爬取知名技术文章网站(伯乐在线实战)

  •  4-1 scrapy安装以及目录结构介绍 22:33 
  •  4-2 pycharm 调试scrapy 执行流程 12:35 
  •  4-3 xpath的用法 - 1 22:17 
  •  4-4 xpath的用法 - 2 19:00 
  •  4-5 xpath的用法 - 3 21:22 
  •  4-6 css选择器实现字段解析 - 1 17:21 
  •  4-7 css选择器实现字段解析 - 2 16:31 
  •  4-8 编写spider爬取jobbole的所有文章 - 1 15:40 
  •  4-9 编写spider爬取jobbole的所有文章 - 2 09:45 
  •  4-10 items设计 - 1 14:49 
  •  4-11 items设计 - 2 15:45 
  •  4-12 items设计 - 3 17:05 
  •  4-13 数据表设计和保存item到json文件 18:17 
  •  4-14 通过pipeline保存数据到mysql - 1 18:41 
  •  4-15 通过pipeline保存数据到mysql - 2 17:58 
  •  4-16 scrapy item loader机制 - 1 17:26 
  •  4-17 scrapy item loader机制- 2 20:31 

第5章 scrapy爬取知名问答网站(知乎实战)

  •  5-1 session和cookie自动登录机制 20:10 
  •  5-2 requests模拟登陆知乎 - 1 13:32 
  •  5-3 requests模拟登陆知乎 - 2 13:16 
  •  5-4 requests模拟登陆知乎 - 3 12:21 
  •  5-5 scrapy模拟知乎登录 20:46 
  •  5-6 知乎分析以及数据表设计1 15:17 
  •  5-7 知乎分析以及数据表设计 - 2 13:35 
  •  5-8 item loder方式提取question - 1 14:57 
  •  5-9 item loder方式提取question - 2 15:20 
  •  5-10 item loder方式提取question - 3 06:45 
  •  5-11 知乎spider爬虫逻辑的实现以及answer的提取 - 1 15:54 
  •  5-12 知乎spider爬虫逻辑的实现以及answer的提取 - 2 17:04 
  •  5-13 保存数据到mysql中 -1 17:27 
  •  5-14 保存数据到mysql中 -2 17:22 
  •  5-15 保存数据到mysql中 -3 16:09 
  •  5-16 (补充小节)知乎验证码登录 - 1_1 16:41 
  •  5-17 (补充小节)知乎验证码登录 - 2_1 10:32 

第6章 通过CrawlSpider对招聘网站进行整站爬取(拉勾网实战)

  •  6-1 数据表结构设计 15:33 
  •  6-2 CrawlSpider源码分析-新建CrawlSpider与settings配置 12:50 
  •  6-3 CrawlSpider源码分析 25:29 
  •  6-4 Rule和LinkExtractor使用 14:28 
  •  6-5 item loader方式解析职位 24:46 
  •  6-6 职位数据入库-1 19:01 
  •  6-7 职位信息入库-2 11:19 

第7章 Scrapy突破反爬虫的限制(拉勾网实战)

  •  7-1 爬虫和反爬的对抗过程以及策略 20:17 
  •  7-2 scrapy架构源码分析 10:45 
  •  7-3 Requests和Response介绍 10:18 
  •  7-4 通过downloadmiddleware随机更换user-agent-1 17:00 
  •  7-5 通过downloadmiddleware随机更换user-agent - 2 17:13 
  •  7-6 scrapy实现ip代理池 - 1 16:51 
  •  7-7 scrapy实现ip代理池 - 2 17:39 
  •  7-8 scrapy实现ip代理池 - 3 18:46 
  •  7-9 云打码实现验证码识别 22:37 
  •  7-10 cookie禁用、自动限速、自定义spider的settings 07:22 

第8章 scrapy进阶开发

  •  8-1 selenium动态网页请求与模拟登录知乎 21:24 
  •  8-2 selenium模拟登录微博, 模拟鼠标下拉 11:06 
  •  8-3 chromedriver不加载图片、phantomjs获取动态网页 09:59 
  •  8-4 selenium集成到scrapy中 19:43 
  •  8-5 其余动态网页获取技术介绍-chrome无界面运行、scrapy-splash、selenium-grid, splinter 07:50 
  •  8-6 scrapy的暂停与重启 12:58 
  •  8-7 scrapy url去重原理 05:45 
  •  8-8 scrapy telnet服务 07:37 
  •  8-9 spider middleware 详解 15:25 
  •  8-10 scrapy的数据收集 13:44 
  •  8-11 scrapy信号详解 13:05 
  •  8-12 scrapy扩展开发 13:16 

第9章 scrapy-redis分布式爬虫(实战项目)

  •  9-1 分布式爬虫要点 08:39 
  •  9-2 redis基础知识 - 1 20:31 
  •  9-3 redis基础知识 - 2 15:58 
  •  9-4 scrapy-redis编写分布式爬虫代码 21:06 
  •  9-5 scrapy源码解析-connection.py、defaults.py- 11:05 
  •  9-6 scrapy-redis源码剖析-dupefilter.py- 05:29 
  •  9-7 scrapy-redis源码剖析- pipelines.py、 queue.py- 10:41 
  •  9-8 scrapy-redis源码分析- scheduler.py、spider.py- 11:52 
  •  9-9 集成bloomfilter到scrapy-redis中 19:30 

第10章 elasticsearch搜索引擎的使用

从本章开始基本是搜索引擎的知识,与我学习scrapy没多大关系,所以就不记录笔记了,以后有兴趣了再继续记笔记学习。

  •  10-1 elasticsearch介绍 18:21 
  •  10-2 elasticsearch安装 13:24 
  •  10-3 elasticsearch-head插件以及kibana的安装 24:09 
  •  10-4 elasticsearch的基本概念 12:15 
  •  10-5 倒排索引 11:24 
  •  10-6 elasticsearch 基本的索引和文档CRUD操作 18:44 
  •  10-7 elasticsearch的mget和bulk批量操作 12:36 
  •  10-8 elasticsearch的mapping映射管理 21:03 
  •  10-9 elasticsearch的简单查询 - 1 14:56 
  •  10-10 elasticsearch的简单查询 - 2 11:12 
  •  10-11 elasticsearch的bool组合查询 22:58 
  •  10-12 scrapy写入数据到elasticsearch中 - 1 14:16 
  •  10-13 scrapy写入数据到elasticsearch中 - 2 11:15 

第11章 django搭建搜索网站

  •  11-1 es完成搜索建议-搜索建议字段保存 - 1 13:45 
  •  11-2 es完成搜索建议-搜索建议字段保存 - 2 13:34 
  •  11-3 django实现elasticsearch的搜索建议 - 1 19:57 
  •  11-4 django实现elasticsearch的搜索建议 - 2 18:15 
  •  11-5 django实现elasticsearch的搜索功能 -1 14:06 
  •  11-6 django实现elasticsearch的搜索功能 -2 13:14 
  •  11-7 django实现搜索结果分页 09:12 
  •  11-8 搜索记录、热门搜索功能实现 - 1 14:34 
  •  11-9 搜索记录、热门搜索功能实现 - 2 14:04 

第12章 scrapyd部署scrapy爬虫

  •  12-1 scrapyd部署scrapy项目 24:39 

第13章 课程总结

  •  13-1 课程总结 05:55
  觉得好就点个推荐吧! 欢迎博友指出错误,我将改进,共同提高技术。 分类: 学习scrapy框架





基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

未来是什么时代?是数据时代!数据分析服务、互联网金融,数据建模、自然语言处理、医疗病例分析……越来越多的工作会基于数据来做,而爬虫正是快速获取数据最重要的方式,相比其它语言,Python爬虫更简单、高效

一、基础知识学习:

1. 爬取策略的深度优先和广度优先

目录:

  1. 网站的树结构
  2. 深度优先算法和实现
  3. 广度优先算法和实现

网站url树结构分层设计:

  • bogbole.com 
    • blog.bogbole.com
    • python.bogbole.com 
      • python.bogbole.com/123

环路链接问题:

从首页到下面节点。 
但是下面的链接节点又会有链接指向首页

所以:我们需要对于链接进行去重

1. 深度优先 
2. 广度优先

跳过已爬取的链接 
对于二叉树的遍历问题

深度优先(递归实现): 
顺着一条路,走到最深处。然后回头

广度优先(队列实现): 
分层遍历:遍历完儿子辈。然后遍历孙子辈

Python实现深度优先过程code:

def depth_tree(tree_node):
    if tree_node is not None:
        print (tree_node._data)
        if tree_node._left is not None:
            return depth_tree(tree_node.left)
        if tree_node._right is not None:
            return depth_tree(tree_node,_right)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Python实现广度优先过程code:

def level_queue(root):
    #利用队列实现树的广度优先遍历
    if root is None:
        return
    my_queue = []
    node = root
    my_queue.append(node)
    while my_queue:
        node = my_queue.pop(0)
        print (node.elem)
        if node.lchild is not None:
            my_queue.append(node.lchild)
        if node.rchild is not None:
            my_queue.append(node.rchild)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2. 爬虫网址去重策略

  1. 将访问过的url保存到数据库中
  2. 将url保存到set中。只需要O(1)的代价就可以查询到url 

    100000000*2byte*50个字符/1024/1024/1024 = 9G

  3. url经过md5等方法哈希后保存到set中,将url压缩到固定长度而且不重复
  4. 用bitmap方法,将访问过的url通过hash函数映射到某一位
  5. bloomfilter方法对bitmap进行改进,多重hash函数降低冲突

scrapy去重使用的是第三种方法:后面分布式scrapy-redis会讲解bloomfilter方法。

3. Python字符串编码问题解决:

  1. 计算机只能处理数字,文本转换为数字才能处理,计算机中8个bit作为一个字节, 
    所以一个字节能表示的最大数字就是255
  2. 计算机是美国人发明的,所以一个字节就可以标识所有单个字符 
    ,所以ASCII(一个字节)编码就成为美国人的标准编码
  3. 但是ASCII处理中文明显不够,中文不止255个汉字,所以中国制定了GB2312编码 
    ,用两个字节表示一个汉字。GB2312将ASCII也包含进去了。同理,日文,韩文,越来越多的国家为了解决这个问题就都发展了一套编码,标准越来越多,如果出现多种语言混合显示就一定会出现乱码
  4. 于是unicode出现了,它将所有语言包含进去了。
  5. 看一下ASCII和unicode编码: 
    1. 字母A用ASCII编码十进制是65,二进制 0100 0001
    2. 汉字”中” 已近超出ASCII编码的范围,用unicode编码是20013二进制是01001110 00101101
    3. A用unicode编码只需要前面补0二进制是 00000000 0100 0001
  6. 乱码问题解决的,但是如果内容全是英文,unicode编码比ASCII编码需要多一倍的存储空间,传输也会变慢。
  7. 所以此时出现了可变长的编码”utf-8” ,把英文:1字节,汉字3字节,特别生僻的变成4-6字节,如果传输大量的英文,utf8作用就很明显。
**读取文件,进行操作时转换为unicode编码进行处理** **保存文件时,转换为utf-8编码。以便于传输** 读文件的库会将转换为unicode *python2 默认编码格式为`ASCII`,Python3 默认编码为 `utf-8`*
#python3
import sys
sys.getdefaultencoding()
s.encoding("utf-8")
  • 1
  • 2
  • 3
  • 4
#python2
import sys
sys.getdefaultencoding()
s = "我和你"
su = u"我和你"
~~s.encode("utf-8")#会报错~~
s.decode("gb2312").encode("utf-8")
su.encode("utf-8")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

二、伯乐在线爬取所有文章

1. 初始化文件目录

基础环境
  1. python 3.5.1
  2. JetBrains PyCharm 2016.3.2
  3. mysql+navicat
为了便于日后的部署:我们开发使用了虚拟环境。
pip install virtualenv
pip install virtualenvwrapper-win
安装虚拟环境管理
mkvirtualenv articlespider3
创建虚拟环境
workon articlespider3
直接进入虚拟环境
deactivate
退出激活状态
workon
知道有哪些虚拟环境
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

scrapy项目初始化介绍

自行官网下载py35对应得whl文件进行pip离线安装 
Scrapy 1.3.3

**命令行创建scrapy项目**
cd desktop

scrapy startproject ArticleSpider
  • 1
  • 2
  • 3
**scrapy目录结构** scrapy借鉴了django的项目思想
  • scrapy.cfg:配置文件。
  • setings.py:设置
SPIDER_MODULES = ["ArticleSpider.spiders"] #存放spider的路径
NEWSPIDER_MODULE = "ArticleSpider.spiders"
  • 1
  • 2
pipelines.py:

做跟数据存储相关的东西

middilewares.py:

自己定义的middlewares 定义方法,处理响应的IO操作

__init__.py:

项目的初始化文件。

items.py:

定义我们所要爬取的信息的相关属性。Item对象是种类似于表单,用来保存获取到的数据

**创建我们的spider**
cd ArticleSpider
scrapy genspider jobbole blog.jobbole.com
  • 1
  • 2
可以看到直接为我们创建好的空项目里已经有了模板代码。如下:
# -*- coding: utf-8 -*-
import scrapy


class JobboleSpider(scrapy.Spider):
    name = "jobbole"
    allowed_domains = ["blog.jobbole.com"]
    # start_urls是一个带爬的列表,
    #spider会为我们把请求下载网页做到,直接到parse阶段
    start_urls = ["http://blog.jobbole.com/"]
    def parse(self, response):
        pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
scray在命令行启动某一个Spyder的命令:
scrapy crawl jobbole
  • 1
**在windows报出错误** `ImportError: No module named ‘win32api’`
pip install pypiwin32#解决
  • 1
**创建我们的调试工具类*** 在项目根目录里创建main.py 作为调试工具文件
# _*_ coding: utf-8 _*_
__author__ = "mtianyan"
__date__ = "2017/3/28 12:06"

from scrapy.cmdline import execute

import sys
import os

#将系统当前目录设置为项目根目录
#os.path.abspath(__file__)为当前文件所在绝对路径
#os.path.dirname为文件所在目录
#H:CodePathspiderArticleSpidermain.py
#H:CodePathspiderArticleSpider
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
#执行命令,相当于在控制台cmd输入改名了
execute(["scrapy", "crawl" , "jobbole"])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
**settings.py的设置不遵守reboots协议** `ROBOTSTXT_OBEY = False` 在jobble.py打上断点:
def parse(self, response):
    pass
  • 1
  • 2
可以看到他返回的htmlresponse对象: 对象内部:
  • body:网页内容
  • _DEFAULT_ENCODING= ‘ascii’
  • encoding= ‘utf-8’
可以看出scrapy已经为我们做到了将网页下载下来。而且编码也进行了转换.

2. 提取伯乐在线内容

xpath的使用

xpath让你可以不懂前端html,不看html的详细结构,只需要会右键查看就能获取网页上任何内容。速度远超beautifulsoup。 目录:
1. xpath简介
2. xpath术语与语法
3. xpath抓取误区:javasrcipt生成html与html源文件的区别
4. xpath抓取实例
  • 1
  • 2
  • 3
  • 4
  • 5
为什么要使用xpath?
  • xpath使用路径表达式在xml和html中进行导航
  • xpath包含有一个标准函数库
  • xpath是一个w3c的标准
  • xpath速度要远远超beautifulsoup。
**xpath节点关系**
  1. 父节点*上一层节点*
  2. 子节点
  3. 兄弟节点*同胞节点*
  4. 先辈节点*父节点,爷爷节点*
  5. 后代节点*儿子,孙子* 
    xpath语法:
表达式 说明
article 选取所有article元素的所有子节点
/article 选取根元素article
article/a 选取所有属于article的子元素的a元素
//div 选取所有div元素(不管出现在文档里的任何地方)
article//div 选取所有属于article元素的后代的div元素,不管它出现在article之下的任何位置
//@class 选取所有名为class的属性

xpath语法-谓语:

表达式 说明
/article/div[1 选取属于article子元素的第一个div元素
/article/div[last()] 选取属于article子元素的最后一个div元素
/article/div[last()-1] 选取属于article子元素的倒数第二个div元素
//div[@color] 选取所有拥有color属性的div元素
//div[@color=’red’] 选取所有color属性值为red的div元素

xpath语法:

表达式 说明
/div/* 选取属于div元素的所有子节点
//* 选取所有元素
//div[@*] 选取所有带属性的div 元素
//div/a 丨//div/p 选取所有div元素的a和p元素
//span丨//ul 选取文档中的span和ul元素
article/div/p丨//span 选取所有属于article元素的div元素的p元素以及文档中所有的 span元素

xpath抓取误区

firebugs插件

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像