(3)分布式下的爬虫Scrapy应该如何做-递归爬取方式,数据输出方式以及数据库链接
放假这段时间好好的思考了一下关于Scrapy的一些常用操作,主要解决了三个问题:
1.如何连续爬取
2.数据输出方式
3.数据库链接
一,如何连续爬取:
思考:要达到连续爬取,逻辑上无非从以下的方向着手
1)预加载需要爬取的列表,直接到这个列表都处理完,相应的爬取工作都已经完成了。
2)从第一页开始爬取,遇到有下一页标签的,那继续爬取,如果没有下一页类似的标签,那表示已经爬到最后一页
3)分析当前页面的所有链接,对于链接符合某种特定规则的,继续爬取,如果没有那表示爬取工作完成(此时需要建立已经爬取列表,防止重复操作)
一般会于定向的爬虫,比如爬取某宝或者某东的数据时,可以采用方式一,二,写好规则就可以了,也方便维护。
1.1对于预加载的列表,那根据需要生成列表就可以了。
在start_urls 里面生成相应的列表就可以,这里引入一个概念,列表推导式。
我们将代码变换成如下:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from cnblogs.items import CnblogsItem class CnblogsSpider(BaseSpider):
name = "cnblogs"
allowed_domains = ["cnblogs.com"]
start_urls = [
'http://www.cnblogs.com/#p%s' % p for p in xrange(1, 11)
] 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'] = ''.join(author.select('text()').extract())
item['TitleUrl'] = author.select('@href').extract()
listitems.append(item) return listitems
在这里,start_urls里面使用列表推导式,爬出了一共10页的数据。
1.2对于爬取下一页实现全趴取的过程,就需要使用yield关键字
我们就虫师的博客来进行测试实验:
http://www.cnblogs.com/fnng/default.aspx?page=1
这里介绍一个scrapy 一个非常有用的技巧,scrapy shell ,因为使用 xpath 可以帮助我们调试xpath语法(或者使用firebug又或者是chrome都可以)
语法:scrapy shell http://你要调试xpath的网址

这里我就不继续讲xpath的语法了,自己去搜一下,相比正则要相对简单好理解。
相应的Spider可以这样编写:
# -*- coding: utf-8 -*-
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from cnblogs.items import CnblogsItem
from scrapy.http import Request
from scrapy import log
# please pay attention to the encoding of info,otherwise raise error of decode
import sys
reload(sys)
sys.setdefaultencoding('utf8') class BlogsSpider(BaseSpider):
name = "cnblogs_blogs"
allowed_domains = ["cnblogs.com"]
start_urls = [
'http://www.cnblogs.com/fnng/default.aspx?page=1'
] def parse(self, response):
hxs = HtmlXPathSelector(response)
# authors = hxs.select('//a[@class="titlelnk"]')
# sel.xpath('//a[@class="PostTitle"]').xpath('text()')
items = hxs.select('//a[@class="PostTitle"]')
a_page = hxs.select('//div[@id="pager"]/a')
for a_item in items:
item = CnblogsItem()
# property
item['Title'] = ''.join(a_item.xpath('text()').extract())
item['TitleUrl'] = a_item.xpath('@href').extract()
yield item # get the page index
log.msg(len(a_page))
if len(a_page) > 0:
for a_item in a_page:
page_text = ''.join(a_item.xpath('text()').extract())
if page_text == '下一页'.encode('utf-8') or 'Next' in page_text:
next_url = ''.join(a_item.xpath('@href').extract())
log.msg(next_url)
yield Request(next_url, callback=self.parse)
break
我们来运行看看效果如何:

所有的数据完整,效果还是不错的。
关于第三种,以规则来规划爬虫的机制,在以后会介绍 :)
二,数据输出的方式:
上面的scrapy命令是:scrapy crawl cnblogs_blogs --nolog -o cnblogs_blogs.json -t json
那结果输出的就是json格式的文件,-t 指的是输出文件格式,json ,-t 支持下列参数:
xml
csv
json
jsonlines
jl
pickle
marshal
一般选择xml ,csv,json三种格式就够了,这样可以很方便的导入各种数据库。
更多的参考:http://doc.scrapy.org/en/latest/topics/feed-exports.html
三,数据库连接:
数据保存为文件的形式然后导入是一个不错的选择,不过一般都会有一定的IO开销,一般可以将Item直接保存到数据库中,这个时候就要引入pipelines这个部件了。
在我们项目的根目录下有一个名为:pipelines.py文件,我们在设置里面首先启用这个文件,在启用之后,spider得到的item都会传入到这个部件中进行二次处理,
3.1在settings.py中启用pipelines
ITEM_PIPELINES = {
'cnblogs.pipelines.CnblogsPipelineobj': 300,
}
注意命名方式:botname.moudlename.classname 要不然会找不到指定的模块。
3.2 编写pipelines
# -*- coding: utf-8 -*- import MySQLdb
import MySQLdb.cursors
import logging
from twisted.enterprise import adbapi class CnblogsPipelineobj(object):
def __init__(self):
self.dbpool = adbapi.ConnectionPool(
dbapiName ='MySQLdb',
host ='127.0.0.1',
db = 'cnblogs',
user = 'root',
passwd = '密码',
cursorclass = MySQLdb.cursors.DictCursor,
charset = 'utf8',
use_unicode = False
) # pipeline dafault function
def process_item(self, item, spider):
query = self.dbpool.runInteraction(self._conditional_insert, item)
logging.debug(query)
return item # insert the data to databases
def _conditional_insert(self, tx, item):
parms = (item['Title'], item['TitleUrl'])
sql = "insert into blogs values('%s','%s') " % parms
#logging.debug(sql)
tx.execute(sql)
OK.运行一下看一下效果如何

中文数据得以保存,OK
总结:本次主要多三个方向来解决连续爬取文章内容,并将获得内容保存的问题,不过文中主要介绍的,还是以定向为基础的爬取,和以规则来构建的爬虫还是有区别,下篇文章将介绍。
(3)分布式下的爬虫Scrapy应该如何做-递归爬取方式,数据输出方式以及数据库链接的更多相关文章
- (5)分布式下的爬虫Scrapy应该如何做-windows下的redis的安装与配置
软件版本: redis-2.4.6-setup-64-bit.exe — Redis 2.4.6 Windows Setup (64-bit) 系统: win7 64bit 本篇的内容是为了给分布式下 ...
- (2)分布式下的爬虫Scrapy应该如何做-关于对Scrapy的反思和核心对象的介绍
本篇主要介绍对于一个爬虫框架的思考和,核心部件的介绍,以及常规的思考方法: 一,猜想 我们说的爬虫,一般至少要包含几个基本要素: 1.请求发送对象(sender,对于request的封装,防止被封) ...
- (4)分布式下的爬虫Scrapy应该如何做-规则自动爬取及命令行下传参
本次探讨的主题是规则爬取的实现及命令行下的自定义参数的传递,规则下的爬虫在我看来才是真正意义上的爬虫. 我们选从逻辑上来看,这种爬虫是如何工作的: 我们给定一个起点的url link ,进入页面之后提 ...
- (8)分布式下的爬虫Scrapy应该如何做-图片下载(源码放送)
转载主注明出处:http://www.cnblogs.com/codefish/p/4968260.html 在爬虫中,我们遇到比较多需求就是文件下载以及图片下载,在其它的语言或者框架中,我们可能 ...
- (1)分布式下的爬虫Scrapy应该如何做-安装
关于Scrapy的安装,网上一搜一大把,一个一个的安装说实话是有点麻烦,那有没有一键安装的?答案显然是有的,下面就是给神器的介绍: 主页:http://conda.pydata.org/docs/ 下 ...
- (9)分布式下的爬虫Scrapy应该如何做-关于ajax抓取的处理(一)
转载请注明出处:http://www.cnblogs.com/codefish/p/4993809.html 最近在群里频繁的被问到ajax和js的处理问题,我们都知道,现在很多的页面都是用动态加载的 ...
- 爬虫系列4:Requests+Xpath 爬取动态数据
爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...
- 另类爬虫:从PDF文件中爬取表格数据
简介 本文将展示一个稍微不一样点的爬虫. 以往我们的爬虫都是从网络上爬取数据,因为网页一般用HTML,CSS,JavaScript代码写成,因此,有大量成熟的技术来爬取网页中的各种数据.这次, ...
- 吴裕雄--天生自然PYTHON爬虫:安装配置MongoDBy和爬取天气数据并清洗保存到MongoDB中
1.下载MongoDB 官网下载:https://www.mongodb.com/download-center#community 上面这张图选择第二个按钮 上面这张图直接Next 把bin路径添加 ...
随机推荐
- idea 一次性自动导包
当复制粘贴一段纯文本代码时,许多类需要导包. 如图 使用optimize imports了,发还是没有办法导入未导入的包,只能删除未使用导包,这跟eclipse不一样,让人很不习惯,查了好多资料都没有 ...
- jquery mobile 移动web(2)
button 按钮 data-role="button" 将超链接变成button. 具有icon 图标的button 组件. 提供了18常用的图标 data-icon =&quo ...
- 自定义组件v-model的实质性理解
用了几个月Vue一直很纠结自定义组件的v-model实现,最近开始学习React时,React中受控组件与状态提升的理念与v-model不谋而合. 转载请注明地址: https://www.cnblo ...
- 【TOJ 3305】Hero In Maze II
描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^.突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫,开 ...
- Git基本使用及工具
好久没用git管理代码了,最近忙着要实习,一直在看面试题,后天入职了,就提前再复习一下git吧. git比较方便的两个网站,如果你想逼格高就用GitHub(https://github.com/),如 ...
- win10家庭版升级为win10专业版
windows10 升级钥匙: DR9VN-GF3CR-RCWT2-H7TR8-82QGT 亲测可用
- Linux密钥登录原理和ssh使用密钥实现免密码登陆
目录 1. 公钥私钥简介 2. 使用密钥进行ssh免密登录 2.1. 实验环境 2.2. 开始实验 3. ssh的两种登陆方式介绍 3.1. 口令验证登录 3.2. 密钥验证登录 4. 总结 1.公私 ...
- hibernate笔记1
1. 数据库中的表关系 一对一.一对多(多对一).多对一 2. 如何确立表中的表关系 一对多的关系如何实现:使用外键约束,一的方称为主表,多的方称为从表. 外键:从表中有一列,该列的取值除了nul ...
- 【cisco下针对冗余链路故障备份的处理措施】
对于中小型的网络中,为了流量的分担,可制定负载均衡方案,但往往带来的是链路的冗余.导致多条物理线路不能够最大的发挥其作用:冗余链路随可避免环路,但在实际的网络中还是存在一些需要完善的地方: 假设有一组 ...
- 五、RegExp(正则表达式)篇
正则表达式,只用记住: 0./pattern/igm i--不区分大小写 g--找到所有相匹配的 m--多行匹配 可以只写其中一个 ps:/pattern/i (无视大小写) 1." ...