scrapy爬虫2--Selector篇

网页内容的解析可以说是爬虫最主要和最核心的工作,从一堆看似杂乱的代码中获取我们需要的信息,这就是爬虫的本质。

python对于网页解析提供了很多的方式,传统的即通过urllib2包获取网页代码,再通过re正则表达式模块自己写规则来获取信息。

第三方的包也有,类似pyquery、lxml、BeautifulSoup。

对于单个页面的抓取来说,上面的3个包都是很适合的,特别是BeautifulSoup,这个包非常的方便,使用期间也很简单。

但是scrapy并没有直接使用上面的3个包,而是选择自己封装了一层,提供了一个类Selectors,采用XPath的工作原理。

scrapy自己封装网页处理包的原因是因为第三方的包,类似BeautifulSoup,在处理大量的网页时效率不高,scrapy主要是基于大规模页面的爬虫处理方案,

用 scrapy,我们可以自己写一个类似百度、360蜘蛛的爬虫,只不过爬行的范围没有那么广而已。

而Selectors则是针对这个目的开发出来的,下面就其使用方法做一个简单的演示。

这里有一段html代码,算是比较标准的,如下:

<div class="mainbox">
    <div class="hdmenu">
    	<ul>
			<li class="s"><a href="http://finance.eastmoney.com/">财经</a></li>
			<li><a href="http://stock.eastmoney.com/">股票</a></li>
			<li><a href="http://stock.eastmoney.com/newstock.html">新股</a></li>
			<li><a href="http://stock.eastmoney.com/gzqh.html">期指</a></li>
			<li><a href="http://stock.eastmoney.com/chuangyeban.html">创业板</a></li>
			<li><a href="http://quote.eastmoney.com/" class="red">行情</a></li>
			<li><a href="http://data.eastmoney.com/">数据</a></li>
			<li><a href="http://stock.eastmoney.com/global.html">全球</a></li>
			<li><a href="http://hk.eastmoney.com/">港股</a></li>
			<li><a href="http://futures.eastmoney.com/">期货</a></li>
			<li><a href="http://forex.eastmoney.com/">外汇</a></li>
			<li><a href="http://gold.eastmoney.com/">黄金</a></li>
			<li><a href="http://fund.eastmoney.com/">基金</a></li>
			<li><a href="http://money.eastmoney.com/">理财</a></li>
			<li><a href="http://bank.eastmoney.com/">银行</a></li>
			<li><a href="http://insurance.eastmoney.com/">保险</a></li>
			<li><a href="http://bond.eastmoney.com/" target="_blank">债券</a></li>
			<li><a href="http://video.eastmoney.com/">视频</a></li>
			<li><a href="http://guba.eastmoney.com/">股吧</a></li>
			<li><a href="http://fund2.eastmoney.com/">基金吧</a></li>
			<li><a href="http://blog.eastmoney.com/">博客</a></li>
			<li><a href="http://t.eastmoney.com/">财迷</a></li>
			<li><a href="http://so.eastmoney.com/" target="_blank">搜索</a></li>
        </ul>
    </div>
</div>

这段代码从内到外,有2个div标签,1个ul标签,正常情况下,如果我们要获取ul标签的内容,可以用如下的方式:

sel = HtmlXPathSelector(response)  #response即为上面代码的网页相应

ul = sel.select(‘//ul‘)

但是,因为一个大的网页里面有不止一个ul,为了特别取这个类别的ul,我们需要把外面一层的div标记加上,这样就成了:

sel = HtmlXPathSelector(response)  #response即为上面代码的网页相应

ul = sel.select(‘//div[@class="hdmenu"]/ul‘)

上面的代码执行后,实际上ul即为:

<ul>
			<li class="s"><a href="http://finance.eastmoney.com/">财经</a></li>
			<li><a href="http://stock.eastmoney.com/">股票</a></li>
			<li><a href="http://stock.eastmoney.com/newstock.html">新股</a></li>
			<li><a href="http://stock.eastmoney.com/gzqh.html">期指</a></li>
			<li><a href="http://stock.eastmoney.com/chuangyeban.html">创业板</a></li>
			<li><a href="http://quote.eastmoney.com/" class="red">行情</a></li>
			<li><a href="http://data.eastmoney.com/">数据</a></li>
			<li><a href="http://stock.eastmoney.com/global.html">全球</a></li>
			<li><a href="http://hk.eastmoney.com/">港股</a></li>
			<li><a href="http://futures.eastmoney.com/">期货</a></li>
			<li><a href="http://forex.eastmoney.com/">外汇</a></li>
			<li><a href="http://gold.eastmoney.com/">黄金</a></li>
			<li><a href="http://fund.eastmoney.com/">基金</a></li>
			<li><a href="http://money.eastmoney.com/">理财</a></li>
			<li><a href="http://bank.eastmoney.com/">银行</a></li>
			<li><a href="http://insurance.eastmoney.com/">保险</a></li>
			<li><a href="http://bond.eastmoney.com/" target="_blank">债券</a></li>
			<li><a href="http://video.eastmoney.com/">视频</a></li>
			<li><a href="http://guba.eastmoney.com/">股吧</a></li>
			<li><a href="http://fund2.eastmoney.com/">基金吧</a></li>
			<li><a href="http://blog.eastmoney.com/">博客</a></li>
			<li><a href="http://t.eastmoney.com/">财迷</a></li>
			<li><a href="http://so.eastmoney.com/" target="_blank">搜索</a></li> </ul>

如果我们要获取ul里面的li列别,即可定义一个变量li,如下:

li = ul.select(‘//li‘)

如果我们是要获取这个特殊的li: <li class="s"><a href="http://finance.eastmoney.com/">财经</a></li>

我们可以这样写

li = ul.select(‘//li[@class="s"])

综括号[]里面的@xxx="xxx",即为过滤条件。

我们如果要获取单个li的文本(即位于<>之外的部分),可以这样写:

li = ul.select(‘//li‘)

for lli in li:
    text = lli.select(‘a/text()‘).extract()[0]

这里的‘a/text()‘表示取<a xxx>后面的文本,即text()。

extract方法用于抽取数据,后面跟一个[0]是因为extract方法返回一个数组的结果集,[0]为取其中第一个元素。

如果我们要获取a href="xxxx"这个后面的链接怎么办呢?

可以这样写:

li = ul.select(‘//li‘)

for lli in li:
    text = lli.select(‘a/@href‘).extract()[0]

这里a/的后面跟@href即表示在本层次内继续向右查找href,然后获取后面的值。

上面即为Selectors的一些基本用法,其实主要就是从外到内,通过标记外部标签的类名来定位我们所需要的信息。

时间: 2024-08-06 06:34:11

scrapy爬虫2--Selector篇的相关文章

scrapy爬虫1--基础设置篇

scrapy作为一个用python编写的网络爬虫,继承了python简单易用的特点,目前已经在很多项目中所使用. 这里也是因为工作中的需要,把scrapy使用过程中的一些心得和遇到的问题记录下来以便加深记忆. scrapy安装的过程就不在这里详述了,大家安装都会碰到各种不同的问题,主要还是因为python版本,vc++版本以及scrapy版本的兼容性引起的. 这里也附上我的安装及运行环境:windows7+python2.6+Microsoft Visual Studio 2010+scrapy

如何让你的scrapy爬虫不再被ban

前面用scrapy编写爬虫抓取了自己博客的内容并保存成json格式的数据(scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据)和写入数据库(scrapy爬虫成长日记之将抓取内容写入mysql数据库).然而,这个爬虫的功能还是过于弱小,一旦目标网站设置了爬虫的限制,我们的爬虫也就失效了.因此这里重点讲述一下如何避免scrapy爬虫被ban.本门的所有内容都是基于前面两篇文章的基础上完成的,如果您错过了可以点击此回看:scrapy爬虫成长日记之创建工程-抽取数据-保存为json格

scrapy爬虫成长日记之将抓取内容写入mysql数据库

前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的.这很显然不满足我们日常的实际应用,接下来看下如何将抓取的内容保存在常见的mysql数据库中吧. 说明:所有的操作都是在“scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据”的基础上完成,如果您错过了这篇文章可以移步这里查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据 环

Python之Scrapy爬虫框架安装及简单使用

题记:早已听闻python爬虫框架的大名.近些天学习了下其中的Scrapy爬虫框架,将自己理解的跟大家分享.有表述不当之处,望大神们斧正. 一.初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫. 本文档将

Scrapy爬虫学习,及实践项目。

作为初学者,首先贴出自己看到的一个教程所提供的实例..后边会讲解我自身所完成的项目说明. 我自己所做项目下载地址为:Scrapy爬虫项目 自己项目说明: 爬取某网站流行时尚网页项目,并对具体项目内容进行二次爬取,将爬取到的内容拼接成为新的静态html,存入自身Ftp服务器,并将信息提交到某接口..(接口中进行数据操作.接口部分未上传) 示例 scrapy爬取了链接之后,如何继续进一步爬取该链接对应的内容? parse可以返回Request列表,或者items列表,如果返回的是Request,则这

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

试想一下,前面做的实验和例子都只有一个spider.然而,现实的开发的爬虫肯定不止一个.既然这样,那么就会有如下几个问题:1.在同一个项目中怎么创建多个爬虫的呢?2.多个爬虫的时候是怎么将他们运行起来呢? 说明:本文章是基于前面几篇文章和实验的基础上完成的.如果您错过了,或者有疑惑的地方可以在此查看: 安装python爬虫scrapy踩过的那些坑和编程外的思考 scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据 scrapy爬虫成长日记之将抓取内容写入mysql数据库 如何让

SSH框架调用scrapy爬虫

毕设刚答辩完毕,不用担心查重了,所以补一篇毕设的内容. 毕设是图片搜索网站,使用python爬虫获取图片资源,再由javaweb管理使用图片的信息和图片,大部分实现起来十分简单,也不好意思炫耀.但是有些地方还是有自己的想法,所以记下来供以后参考. 创新之处就在于整合了SSH和scrapy两个相互独立的框架,整合好的框架图如下: 方法是把写好的scrapy爬虫部署到scrapyd应用程序上,关于scrapyd应用程序的安装网上有很多资料,然后是启动和关闭爬虫,是通过控制台运行curl命令实现的,关

Python爬虫教程-31-创建 Scrapy 爬虫框架项目

本篇是介绍在 Anaconda 环境下,创建 Scrapy 爬虫框架项目的步骤,且介绍比较详细 Python爬虫教程-31-创建 Scrapy 爬虫框架项目 首先说一下,本篇是在 Anaconda 环境下,所以如果没有安装 Anaconda 请先到官网下载安装 Anaconda 下载地址:https://www.anaconda.com/download/ Scrapy 爬虫框架项目的创建 0.打开[cmd] 1.进入你要使用的 Anaconda 环境 1.环境名可以在[Pycharm]的[Se

scrapy爬虫基本实现和爬虫思想

今天分享下scrapy爬虫的基本使用方法,scarpy是一个比较成熟稳定的爬虫框架,方便了爬虫设计,有较强的逻辑性.我们以旅游网站为例进行介绍,一方面是旅游网站多,各个网站的适用情况不同,方便我们的学习.最后有网易云评论的一个爬取思路和不同的实现方法. 话不多说,下面是scrapy的框架: 创建scrapy爬虫的命令可以在cmd中输入 scrapy project XXXX 之后创建蜘蛛文件使用 scrapy genspider xxx "xxxx.com" 接着初始化工作就做完了,下

一篇文章教会你理解和定义Scrapy爬虫框架中items.py文件

在前面几篇文章中我们已经学会了如何了编写Spider去获取网页上所有的文章链接及其对应的网页目标信息.在这篇文章中,我们将主要介绍Scrapy中的Item. 在介绍Item之前,我们需要知道明确一点,网络爬虫的主要目标就是需要从非结构化的数据源中提取出结构化的数据,在提取出结构化的数据之后,怎么将这些数据进行返回呢?最简单的一种方式就是将这些字段放到一个字典当中来,然后通过字典返回给Scrapy.虽然字典很好用,但是字典缺少一些结构性的东西,比方说我们容易敲错字段的名字,容易导致出错,比方说我们