本篇主要介绍对于一个爬虫框架的思考和,核心部件的介绍,以及常规的思考方法:

一,猜想

我们说的爬虫,一般至少要包含几个基本要素:

1.请求发送对象(sender,对于request的封装,防止被封)

2.解析文档对象(将请求的网页当作是html文档还是字符串)

3.承载所需要的解析对象(标准格式的数据承载者)

4.获取所需对象后的操作者 (得到对象后,是以文件形式保存还是存入数据库)

5.整个流程的错误处理者(整个流程的异常监控者)

二,验证

我们来看看Scrapy 提供了哪些核心的对象

基本概念

命令行工具(Command line tools)
学习用于管理Scrapy项目的命令行工具
Items
定义爬取的数据
Spiders
编写爬取网站的规则
选择器(Selectors)
使用XPath提取网页的数据
Scrapy终端(Scrapy shell)
在交互环境中测试提取数据的代码
Item Loaders
使用爬取到的数据填充item
Item Pipeline
后处理(Post-process),存储爬取的数据
Feed exports
以不同格式输出爬取数据到不同的存储端
Link Extractors
方便用于提取后续跟进链接的类。

refer from :https://scrapy-chs.readthedocs.org/zh_CN/0.24/

基本上我们所设想的对象Scrapy都会包含在里面了

三,爬取

我们知道,一般爬虫都是按如下规则来爬取数据的

输入目标网址=> 编写处理规则(正则表达式或者xpath语法)=>对得到的数据进行处理

Scrapy的做法如下:

1)新建一个项目

以命令行形式切换到需要将代码放置的文件夹下,然后输入如下命令:

scrapy startproject cnblogs

文件夹下会生成一个cnblogs的文件下,切换到该文件夹下(记住切换)

Item.py就是我们所需要数据承载器

修改为如下代码:

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html import scrapy
from scrapy.item import Field,Item class CnblogsItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field() Title = Field()
TitleUrl = Field()

在Spider文件夹下添加BasicGroupSpider.py 修改为如下内容

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from cnblogs.items import CnblogsItem class CnblogsSpider(BaseSpider):
name = "cnblogs" #spider的名字
allowed_domains = ["cnblogs.com"]
start_urls = [
'http://www.cnblogs.com/'
] #待抓取的列表 def parse(self, response):
self.log("Fetch douban homepage page: %s" % response.url)
hxs = HtmlXPathSelector(response) #authors = hxs.select('//a[@class="titlelnk"]') items = hxs.select('//a[contains(@class, "titlelnk")]') listitems = [] for author in items:
#print author.select('text()').extract()
item = CnblogsItem()
#property
item['Title'] = author.select('text()').extract()
item['TitleUrl'] =author.select('@href').extract()
listitems.append(item) return listitems

OK ,回到第一步的命令台的界面,输入如下命令

scrapy crawl cnblogs --logfile=test.log -o cnblogs.json -t json

四,结果

关于里面的代码功能,自己去理解吧,写过代码的人大致都了解。

====>DEMO下载<====

总结:

本次主要分析了爬虫框架的大致构件,并验证了我们的猜想,关于python的爬虫框架有很多,不过像scrapy这样值得入手和研究的,比较少了,.net下的更少了。

(2)分布式下的爬虫Scrapy应该如何做-关于对Scrapy的反思和核心对象的介绍的更多相关文章

  1. (5)分布式下的爬虫Scrapy应该如何做-windows下的redis的安装与配置

    软件版本: redis-2.4.6-setup-64-bit.exe — Redis 2.4.6 Windows Setup (64-bit) 系统: win7 64bit 本篇的内容是为了给分布式下 ...

  2. (4)分布式下的爬虫Scrapy应该如何做-规则自动爬取及命令行下传参

    本次探讨的主题是规则爬取的实现及命令行下的自定义参数的传递,规则下的爬虫在我看来才是真正意义上的爬虫. 我们选从逻辑上来看,这种爬虫是如何工作的: 我们给定一个起点的url link ,进入页面之后提 ...

  3. (8)分布式下的爬虫Scrapy应该如何做-图片下载(源码放送)

      转载主注明出处:http://www.cnblogs.com/codefish/p/4968260.html 在爬虫中,我们遇到比较多需求就是文件下载以及图片下载,在其它的语言或者框架中,我们可能 ...

  4. (3)分布式下的爬虫Scrapy应该如何做-递归爬取方式,数据输出方式以及数据库链接

    放假这段时间好好的思考了一下关于Scrapy的一些常用操作,主要解决了三个问题: 1.如何连续爬取 2.数据输出方式 3.数据库链接 一,如何连续爬取: 思考:要达到连续爬取,逻辑上无非从以下的方向着 ...

  5. (1)分布式下的爬虫Scrapy应该如何做-安装

    关于Scrapy的安装,网上一搜一大把,一个一个的安装说实话是有点麻烦,那有没有一键安装的?答案显然是有的,下面就是给神器的介绍: 主页:http://conda.pydata.org/docs/ 下 ...

  6. (9)分布式下的爬虫Scrapy应该如何做-关于ajax抓取的处理(一)

    转载请注明出处:http://www.cnblogs.com/codefish/p/4993809.html 最近在群里频繁的被问到ajax和js的处理问题,我们都知道,现在很多的页面都是用动态加载的 ...

  7. 同时运行多个scrapy爬虫的几种方法(自定义scrapy项目命令)

    试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来 ...

  8. 【初码干货】记一次分布式B站爬虫任务系统的完整设计和实施

    [初码文章推荐] 程序员的自我修养 Azure系列文章 阿里云系列文章 爬虫系列文章 [初码产品推荐] AlphaMS开发模式 闪送达城市中央厨房 今天带来一个有意思的东西-分布式B站爬虫任务系统 这 ...

  9. Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】

    (1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...

随机推荐

  1. ActionBar 的应用

    转载:http://blog.csdn.net/yuxlong2010 作为Android 3.0之后引入的新的对象,ActionBar可以说是一个方便快捷的导航神器.它可以作为活动的标题,突出活动的 ...

  2. HDU 1160(两个值的LIS,需dfs输出路径)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/ ...

  3. EntityFramework Code-First教程(一)

    前言:学习了EF框架这么久,还没有好好总结一番,正好遇到一国外的网站,发现不错,随即翻译过来,一是让自己复习一遍,二是供广大初学者学习,翻译过程中加入了一些自己的理解,如有错误,还请指出,多谢多谢.好 ...

  4. 与select2有关的知识点总结

    1.多选下拉框设置提示 var datass = [ { id:0, text: '你好' }, { id:1, text: '好久不见' }, { id:2, text: '好想你' } ]; va ...

  5. Select 语句执行顺序以及如何提高Oracle 基本查询效率

    今天把这几天做的练习复习了一下,不知道自己写得代码执行的效率如何以及要如何提高,于是乎上网开始研究一些材料,现整理如下: 首先,要了解在Oracle中Sql语句运行的机制.以下是sql语句的执行步骤: ...

  6. 范围for语句的整理

    1.如何处理stirng中的每个字符?(来自C++Primer中文版5th中P83) 使用基于范围的for语句,比如下面的例子,输出每个字符 #include<iostream> #inc ...

  7. Django模板简介

    在settings.py中有个TEMPLATES的设置,其中BACKEND用来配置Django模板引擎, DIRS 定义了一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件 一般我们都会把模 ...

  8. 03 shell编程之case语句与函数

    本文所有内容均来自当年博主当年学习笔记,若有不足欢迎指正 Shell编程之case语句与函数 学习目标: 掌握case语句编程 掌握shell函数的使用 目录结构: Case语句 Case语句的作用 ...

  9. js继承的几种方法和es6继承方法

        一.原型链继     1.基本思想     利用原型链来实现继承,超类的一个实例作为子类的原型     2.具体实现     function F() {}     //原型属性,原型方法: ...

  10. iOS 开发中保留小数问题

    保留两位小数(四舍五入) - (void)viewDidLoad { [super viewDidLoad]; // 有时候我们需要对数据保留两位小数,而且需要四舍五入,并且需要把末尾多余的0给去掉\ ...