Scrapy研究探索(六)——自己主动爬取网页之II(CrawlSpider)
原创,转载注明:http://blog.csdn.net/u012150179/article/details/34913315
一.目的。
在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中使用基于Spider实现了自己的w3cschool_spider,并在items.py中定义了数据结构,
在pipelines.py中实现获得数据的过滤以及保存。
可是以上述方法仅仅能爬取start_url列表中的网页。而网络爬虫如google等搜索引擎爬虫实现的就是对整个互联网的爬取,所以在本教程中研究使用scrapy自己主动实现多网页爬取功能。
在教程(五)(http://blog.csdn.net/u012150179/article/details/34486677)中已经编写继承自spider的类实现爬虫。实现了自己主动多网页爬取,这里引出CrawlSpider类,使用更简单方式实现自己主动爬取。
二.热身。
1.CrawlSpider
(1)概念与作用:
它是Spider的派生类。首先在说下Spider,它是全部爬虫的基类,对于它的设计原则是仅仅爬取start_url列表中的网页。而从爬取的网页中获取link并继续爬取的工作CrawlSpider类更适合。
(2)使用:
它与Spider类的最大不同是多了一个rules參数,其作用是定义提取动作。在rules中包括一个或多个Rule对象,Rule类与CrawlSpider类都位于scrapy.contrib.spiders模块中。
class scrapy.contrib.spiders.Rule (
link_extractor, callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None )
当中:
link_extractor为LinkExtractor,用于定义须要提取的链接。
callback參数:当link_extractor获取到链接时參数所指定的值作为回调函数。
callback參数使用注意:
当编写爬虫规则时,请避免使用parse作为回调函数。于CrawlSpider使用parse方法来实现其逻辑,假设您覆盖了parse方法。crawlspider将会执行失败。
follow:指定了依据该规则从response提取的链接是否须要跟进。当callback为None,默认值为true。
process_links:主要用来过滤由link_extractor获取到的链接。
process_request:主要用来过滤在rule中提取到的request。
2.LinkExtractor
(1)概念:
顾名思义。链接提取器。
(2) 作用:
response对象中获取链接,而且该链接会被接下来爬取。
(3) 使用:
通过SmglLinkExtractor提取希望获取的链接。
classscrapy.contrib.linkextractors.sgml.SgmlLinkExtractor(
allow=(),deny=(),allow_domains=(),deny_domains=(),deny_extensions=None,restrict_xpaths=(),tags=('a','area'),attrs=('href'),canonicalize=True,unique=True,process_value=None)
主要參数:
allow:满足括号里“正則表達式”的值会被提取,假设为空,则所有匹配。
deny:与这个正則表達式(或正則表達式列表)不匹配的URL一定不提取。
allow_domains:会被提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。
三.RUN!
shell中验证
開始编写代码之前。使用scrapyshell查看使用SmglLinkExtractor在网页中获取到的链接:
scrapy shell http://blog.csdn.net/u012150179/article/details/11749017
继续import相关模块:
fromscrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
如今使用SgmlLinkExtractor查看在当前网页中获得的链接:
item=SgmlLinkExtractor(allow=('/u012150179/article/details')).extract_links(response)
当中item为包括Link()对象的列表。如今显示当中的text元素(就是获取到的文章链接相应的文章标题):
for i in item:
print i.text部分结果截图:
对比网页能够得到此时获取的是当前网页中全部满足allow条件的链接,不仅包括“下一篇”的链接,还有网页側边栏“阅读排行“、”评论排行“中的文章链接。为了仅仅获得”下一篇“文章链接,这就要进行全部链接的筛选。引入參数restrict_xpaths,继续:
item= SgmlLinkExtractor(allow=('/u012150179/article/details'),restrict_xpaths=('//li[@class="next_article"]')).extract_links(response)
这是在如上查看结果,便提取出了“下一篇”文章链接。
注意:在shell中并不正确提取到的link进行跟进。
在这里不得不提的就是scrapy shell是对调试、验证非常实用的交互工具。应该掌握。
在shell中进行了验证后进入写代码阶段。
编写代码
(1)items.py和pipelines.py以及settings.py与之前教程类似,不具体描写叙述。
(2)爬虫编写。
上码:
# -*- coding:utf-8 -*- from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from CSDNBlogCrawlSpider.items import CsdnblogcrawlspiderItem class CSDNBlogCrawlSpider(CrawlSpider): """继承自CrawlSpider,实现自己主动爬取的爬虫。 """ name = "CSDNBlogCrawlSpider"
#设置下载延时
download_delay = 2
allowed_domains = ['blog.csdn.net']
#第一篇文章地址
start_urls = ['http://blog.csdn.net/u012150179/article/details/11749017'] #rules编写法一。官方文档方式
#rules = [
# #提取“下一篇”的链接并**跟进**,若不使用restrict_xpaths參数限制。会将页面中所有
# #符合allow链接所有抓取
# Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'),
# restrict_xpaths=('//li[@class="next_article"]')),
# follow=True)
#
# #提取“下一篇”链接并运行**处理**
# #Rule(SgmlLinkExtractor(allow=('/u012150179/article/details')),
# # callback='parse_item',
# # follow=False),
#] #rules编写法二,更推荐的方式(自己測验。使使用方法一时常常出现爬到中间就finish情况,而且无错误码)
rules = [
Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'),
restrict_xpaths=('//li[@class="next_article"]')),
callback='parse_item',
follow=True)
] def parse_item(self, response): #print "parse_item>>>>>>"
item = CsdnblogcrawlspiderItem()
sel = Selector(response)
blog_url = str(response.url)
blog_name = sel.xpath('//div[@id="article_details"]/div/h1/span/a/text()').extract() item['blog_name'] = [n.encode('utf-8') for n in blog_name]
item['blog_url'] = blog_url.encode('utf-8') yield item
执行:
scrapy crawl CSDNBlogCrawlSpider
得到的效果如教程(五)一致。
当中指出和教程(五)所编写爬虫方法的差异:
首先。基类CrawlSpider提供了更完好的自己主动多网页爬取机制,仅仅须要我们配置的就是rules,通过Rule对象实现链接的提取与跟进。恩,对,没了。
。。
就这样。
具体的凝视也都在程序中。
进行到这里,就将本篇文章主题讲述完成。核心是CrawlSpider,主要方法是rules。
关于scrapy的使用可參见之前文章:
http://blog.csdn.net/u012150179/article/details/34913315
http://blog.csdn.net/u012150179/article/details/34486677
Scrapy研究探索(六)——自己主动爬取网页之II(CrawlSpider)的更多相关文章
- scrapy研究探索(二)——爬w3school.com.cn
下午被一个问题困扰了好一阵.终于使用还有一种方式解决. 開始教程二.关于Scrapy安装.介绍等请移步至教程(一)(http://blog.csdn.net/u012150179/article/de ...
- python3下scrapy爬虫(第八卷:循环爬取网页多页数据)
之前我们做的数据爬取都是单页的现在我们来讲讲多页的 一般方式有两种目标URL循环抓取 另一种在主页连接上找规律,现在我用的案例网址就是 通过点击下一页的方式获取多页资源 话不多说全在代码里(因为刚才写 ...
- Scrapy研究探索(三)——Scrapy核心架构与代码执行分析
学习曲线总是这样,简单样例"浅尝".在从理论+实践慢慢攻破.理论永远是基础,切记"勿在浮沙筑高台". 一. 核心架构 关于核心架构.在官方文档中阐述的非常清晰, ...
- 【网络爬虫】【python】网络爬虫(五):scrapy爬虫初探——爬取网页及选择器
在上一篇文章的末尾,我们创建了一个scrapy框架的爬虫项目test,现在来运行下一个简单的爬虫,看看scrapy爬取的过程是怎样的. 一.爬虫类编写(spider.py) from scrapy.s ...
- Python网页解析库:用requests-html爬取网页
Python网页解析库:用requests-html爬取网页 1. 开始 Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等.在网上玩爬虫的文章通常都是 ...
- python3爬取网页
爬虫 python3爬取网页资源方式(1.最简单: import'http://www.baidu.com/'print2.通过request import'http://www.baidu.com' ...
- [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】
[python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...
- python(27)requests 爬取网页乱码,解决方法
最近遇到爬取网页乱码的情况,找了好久找到了种解决的办法: html = requests.get(url,headers = head) html.apparent_encoding html.enc ...
- python学习之——爬取网页信息
爬取网页信息 说明:正则表达式有待学习,之后完善此功能 #encoding=utf-8 import urllib import re import os #获取网络数据到指定文件 def getHt ...
随机推荐
- Linux 技巧:让进程在后台可靠执行的几种方法
我们常常会碰到这种问题.用 telnet/ssh 登录了远程的 Linux server,执行了一些耗时较长的任务, 结果却因为网络的不稳定导致任务中途失败.怎样让命令提交后不受本地关闭终端窗体/网络 ...
- 4418: [Shoi2013]扇形面积并|二分答案|树状数组
为何感觉SHOI的题好水. ..又是一道SB题 从左到右枚举每个区间,遇到一个扇形的左区间就+1.遇到右区间就-1,然后再树状数组上2分答案,还是不会码log的.. SHOI2013似乎另一道题发牌也 ...
- 35.QT蝴蝶飞舞
fly.h #ifndef FLY_H #define FLY_H #include <QObject> #include <QPainter> #include <QG ...
- [转]Linux+XAMPP+eolinker开源版v3.2.4
eolinker是一个由国人开源的接口管理系统(AMS),特性及介绍详见开源中国-eolinker首页. 搭建步骤参考:eolinker开源指南 系统环境:CentOS Linux release 7 ...
- .NET Core 开发:永远的Hello Word
从.NET Core发布到现在已经很长一段时间了,园子里的各路大神也和它打的火热,本着与时俱进,啥火学啥的原则,我也开始了我的.NET Core学习之旅. 简介 .NET从2002年发行到现在,从呱呱 ...
- POJ 2346 DP or打表
这题 不算重复的数.. 就变成水题了. 思路: 1.打表 2.DP 打表的: // by SiriusRen #include <cstdio> using namespace std; ...
- Neo4j下执行cypher-shell时,Connection refused问题解决?
不多说,直接上干货! 问题现象 root@zhouls-/bin# ls cypher-shell neo4j neo4j-admin neo4j-import neo4j-shell tools ...
- 基于Doxygen的C/C++注释原则
基于Doxygen的C/C++注释原则 标注总述 .文件头标注 . 命名空间标注 . 类.结构.枚举标注 . 函数注释原则 . 变量注释 . 模块标注 . 分组标注 总述 华丽的分隔线 //----- ...
- Oracle学习笔记——常用函数总结
在平时写PL/SQL的时候,经常要用到很多系统自带的函数,而这些函数用起来非常好用,但是每次用完以后,就又忘到脑后了,为了加深自己的映象,以及对这些函数做一个全面的总结,就有了今天这篇文章. 首先这就 ...
- AARRR:互联网创业者一定要掌握的指标
创业公司如何做数据分析?网站分析工具里的指标千百种,到底要从哪些数据入手呢?除了流量跟转换率,还有哪些数据跟公司成长有关呢?或许可以从了解AARRR Metrics开始.AARRR Metrics是由 ...