Scrapy是一个流行的Python爬虫框架, 用途广泛.

使用pip安装scrapy:

pip install scrapy

scrapy由一下几个主要组件组成:

  • scheduler: 调度器, 决定下一个要抓取的url, 核心是一个任务队列

  • scrapy engine: 引擎, 用于控制整个系统的任务和数据流

  • downloader: 下载器, 下载目标url的内容并交给spider处理

  • spider: 爬虫, 用于分析下载内容, 提取数据项(item)包括获取要继续爬取的url.

  • pipeline: 项管道, 接受spider获得item并进行处理.

  • downloader middleware: 下载器中间件, 处理engine与downloader之间的请求响应

  • spider middleware: 爬虫中间件, 处理engine与spider之间的数据流

  • scheduler middleware: 调度器中间件, 处理engine与scheduler之间的数据流

首先engine从scheduler中获得一项任务(url), 并将其封装为一个请求(request)交给downloader.

downloader下载链接内容, 封装为响应(response)交给spider,spider获得item交给pipeline进行处理, 并将需要继续爬取的url交给scheduler.

scrapy使用twisted提供的网络IO异步支持, 性能出色.

第一个Scrapy爬虫

在实际编写爬虫之前,首先要建立一个项目. 在项目目录的父目录中执行命令:

scrapy startproject ScrapyDemo

建立一个名为ScrapyDemo的项目, 目录结构如下:

|- scrapy.cfg
|- ScrapyDemo
|- __init__.py
|- items.py
|- pipelines.py
|- settings.py
|- spiders
|- __init__.py

spider用于解析页面内容, 生成item.

在spiders包下建立python脚本MySpider:

from scrapy import Spider

class MySpider(Spider):
name = "cnblogs"
allowed_domains = ["cnblogs.com"]
start_urls = [
"http://www.cnblogs.com/Finley/",
] def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)

重写Spider类需要定义几个必须的成员:

  • name: spider的名字, 必须是唯一的

  • start_urls: 起始的url, 爬取时首先从该列表中开始爬取.从这些页面中得到的复合要求的url将被添加到队列中.

  • parse(): 负责解析downloader得到的response, 得到items交给pipeline处理.当然上述示例中只是保存了爬取的内容.

parse方法是spider的核心, parse方法可以yield或返回两类对象:

  • scrapy.item.Item: item实例将被送入Pipeline进行处理

  • scrapy.Request: 请求将加入任务队列, 常用于爬取页内链接

在项目根目录中执行命令开始爬取:

scrapy crawl cnblogs

使用selector分析内容

在spider.parse中使用选择器(selector)来解析html(xml), selector采用XPath表达式来选择XML中的元素.

    def parse(self, response):
for e in response.xpath('//ul/li'):
title = e.xpath('a/text()').extract()
link = e.xpath('a/@href').extract()
desc = e.xpath('text()').extract()
print title, link, desc

选择器提供了四个方法:

  • xpath(pattern): 通过xpath选择元素

  • css(pattern): 通过css选择元素

  • extract(): 从元素中提取内容字符串

  • re(pattern): 使用正则表达式提取内容, 返回匹配的字符串

常用xpath表达式:

  • 'html/head/title' 选择HTML文档中<head>标签内的<title>元素

  • '/html/head/title/text()': 选择<title>元素内的文本

  • '//div' 选择所有<div>元素

  • '//div[@class="panel"]' 选取class属性panel的<div>元素.

  • '//div[@id=d1]'; 选取id属性为d1的<div>元素.

css()方法则是使用css选择器进行选择:

  • '#id': id选择器

  • '.class' class选择器

  • 'div' 标签选择器

更多关于XPath的内容参见菜鸟教程

更多关于Selector的讲解

使用 item

item的行为类似dict, 用于存储spider解析得到的数据:

from scrapy.item import Item, Field

class MyItem(Item):
name = Field()
content = Field()
url = Field()

在spider.parse中将结果以item的形式返回:

def parse(self, response):
items = []
for post in response.xpath('//a[@class="postTitle2"]'):
item = MyItem()
name = post.xpath('text()').extract()[0]
url = post.xpath('@href').extract()[0]
print('post:', name, url)
item['name'] = name
item['url'] = url
items.append(item)
return items

更多关于item的内容参见这里

使用Item PipeLine

定义一个Python类,然后实现process_item(self, item, spider)方法即可作为一个PipeLine中一个过滤器的实现.

process_item的item参数为要处理的项目, spider则是相应的spider对象.process_item返回的item对象将交给下个过滤器处理, 或者或者抛出DropItem异常丢弃这个item.

from scrapy.exceptions import DropItem

class StopWordPipeline:
def process_item(self, item, spider):
if item['name'] in stop_words:
raise DropItem(item['name'])
return item

注册item只需要在settings.py中添加:

ITEM_PIPELINES = {
'ScrapyDemo.StopWordPipeline': 300,
'ScrapyDemo.JsonWriterPipeline': 800,
}

值表示Pipeline的执行顺序,从低到高执行,范围0-1000.

Scrapy Shell

scrapy使用engine调度spider, 不便于调试.scrapy提供了shell, 在python shell环境中建立上下文以便于调试. 启动shell:

scrapy shell <url>

url为要爬取的网址.终端中建立了相关对象:

  • crawler: 当前 Crawler 对象.

  • spider : 处理URL的spider。 对当前URL没有处理的Spider时则为一个 Spider 对象。

  • request : 最近获取到的页面的 Request 对象。 您可以使用 replace() 修改该request。或者 使用 fetch 快捷方式来获取新的request。

  • response: 包含最近获取到的页面的 Response 对象。

  • sel : 根据最近获取到的response构建的 Selector 对象。

  • settings - 当前的 Scrapy settings

可以在shell下调试选择器:

$scrapy shell www.cnblogs.com/Finley
>>> response
<200 http://www.cnblogs.com/Finley>
>>> response.xpath('//a[@class="postTitle2"]')
...

scrapy.org

Python爬虫框架Scrapy的更多相关文章

  1. 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scr ...

  2. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  3. Linux 安装python爬虫框架 scrapy

    Linux 安装python爬虫框架 scrapy http://scrapy.org/ Scrapy是python最好用的一个爬虫框架.要求: python2.7.x. 1. Ubuntu14.04 ...

  4. Python爬虫框架Scrapy实例(三)数据存储到MongoDB

    Python爬虫框架Scrapy实例(三)数据存储到MongoDB任务目标:爬取豆瓣电影top250,将数据存储到MongoDB中. items.py文件复制代码# -*- coding: utf-8 ...

  5. 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码

    下载:https://pan.baidu.com/s/1oejHek3Vmu0ZYvp4w9ZLsw <Python 3网络爬虫开发实战>中文PDF+源代码 下载:https://pan. ...

  6. Python爬虫框架Scrapy教程(1)—入门

    最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...

  7. 《精通Python爬虫框架Scrapy》学习资料

    <精通Python爬虫框架Scrapy>学习资料 百度网盘:https://pan.baidu.com/s/1ACOYulLLpp9J7Q7src2rVA

  8. Python爬虫框架Scrapy获得定向打击批量招聘信息

    爬虫,就是一个在网上到处或定向抓取数据的程序,当然,这样的说法不够专业,更专业的描写叙述就是.抓取特定站点网页的HTML数据.只是因为一个站点的网页非常多,而我们又不可能事先知道全部网页的URL地址, ...

  9. Python爬虫框架Scrapy安装使用步骤

    一.爬虫框架Scarpy简介Scrapy 是一个快速的高层次的屏幕抓取和网页爬虫框架,爬取网站,从网站页面得到结构化的数据,它有着广泛的用途,从数据挖掘到监测和自动测试,Scrapy完全用Python ...

随机推荐

  1. Python自动化开发 - 函数式编程

    本节内容 一.函数式编程 二.高阶函数 1.变量可以指向函数 2.函数名也是变量 3.传入函数 三.返回函数 1.函数作为返回值 2.闭包特性 一.函数式编程 函数是Python内建支持的一种封装,我 ...

  2. 怎么找到与你Eclipse匹配的spring tool suite插件

    在Eclipse中安装插件是很简单的,但是某些插件需要与你的Eclipse的版本对应才能用,比如spring的插件. 首先,查看你的Eclipse的版本. 从eclipse的Help菜单的About ...

  3. ReLU 和sigmoid 函数对比

    详细对比请查看:http://www.zhihu.com/question/29021768/answer/43517930 . 激活函数的作用: 是为了增加神经网络模型的非线性.否则你想想,没有激活 ...

  4. Swagger ui测试中的验证 apikey

    Swagger ui测试中的验证 apikey 我们使用swagger 用来呈现webapi的接口,除了可以看到接口的说明和参数说明,还可以进行测试.但是我们的接口通常是有验证的,不是随便就能调用的, ...

  5. XAML 调试工具 不见了?

    XAML调试工具不见了怎么办? 1.调试---> 选项---> 选中 启用XAML的UI调试工具 2.调试---> 选项---> 禁用 使用托管兼容模式 欧了!

  6. WPF Bitmap转成Imagesource的性能优化

    之前有个需求是在WPF中生成二维码,用的是QRCoder. QRCoder生成的是Bitmap,在wpf中需要转换成ImageSource才能显示. 之前的转换方式是: IntPtr hBitmap ...

  7. VS2017+EF+Mysql生成实体数据模型(解决闪退的坑) 版本对应才行

    最近要使用VS2017+EF+Mysql,在生成实体数据模型踏过一些坑,在此做个总结. 1.先下载并安装 mysql-connector-net-6.9.10.msi  和  mysql-for-vi ...

  8. AEAI DP V3.8.0 升级说明,开源综合应用开发平台

    1 升级说明AEAI DP 3.8版本是一次常规升级,安全机制是本次开发平台的升级重点,如果开发的应用对外部用户开放,一定要注意升级!升级说明及产品介质已上传至网盘中,地址:http://pan.ba ...

  9. 关于WordCount的作业

    一.开发者:201631062418 二.代码地址:https://gitee.com/YsuLIyan/WordCount 三.作业地址:https://edu.cnblogs.com/campus ...

  10. ssh连接卡在【To escape to local shell, press 'Ctrl+Alt+]'.】的解决方法

    一.现象 1.使用xshell连接远程主机的时候一直卡在To escape to local shell, press 'Ctrl+Alt+]'.,要等很久才能连上: Connecting to 19 ...