使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤


Posted in Python onJanuary 23, 2014
#!/usr/bin/env python
# -*- coding: utf-8 -*- 
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from cnbeta.items import CnbetaItem
class CBSpider(CrawlSpider):
    name = 'cnbeta'
    allowed_domains = ['cnbeta.com']
    start_urls = ['https://3water.com']
    rules = (
        Rule(SgmlLinkExtractor(allow=('/articles/.*\.htm', )),
             callback='parse_page', follow=True),
    )
    def parse_page(self, response):
        item = CnbetaItem()
        sel = Selector(response)
        item['title'] = sel.xpath('//title/text()').extract()
        item['url'] = response.url
        return item

实现蜘蛛爬虫步骤

1.实例初级目标:从一个网站的列表页抓取文章列表,然后存入数据库中,数据库包括文章标题、链接、时间

首先生成一个项目:scrapy startproject fjsen
先定义下items,打开items.py:

我们开始建模的项目,我们想抓取的标题,地址和时间的网站,我们定义域为这三个属性。这样做,我们编辑items.py,发现在开放目录目录。我们的项目看起来像这样:

from scrapy.item import Item, Field
class FjsenItem(Item):
    # define the fields for your item here like:
    # name = Field()
    title=Field()
    link=Field()
    addtime=Field()

第二步:定义一个spider,就是爬行蜘蛛(注意在工程的spiders文件夹下),他们确定一个初步清单的网址下载,如何跟随链接,以及如何分析这些内容的页面中提取项目(我们要抓取的网站是http://www.fjsen.com/j/node_94962.htm 这列表的所有十页的链接和时间)。
新建一个fjsen_spider.py,内容如下:

#-*- coding: utf-8 -*-
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from fjsen.items import FjsenItem
class FjsenSpider(BaseSpider):
    name="fjsen"
    allowed_domains=["fjsen.com"]
    start_urls=['http://www.fjsen.com/j/node_94962_'+str(x)+'.htm' for x in range(2,11)]+['http://www.fjsen.com/j/node_94962.htm']
    def parse(self,response):
        hxs=HtmlXPathSelector(response)
        sites=hxs.select('//ul/li')
        items=[]
        for site in sites:
            item=FjsenItem()
            item['title']=site.select('a/text()').extract()
            item['link'] = site.select('a/@href').extract()
            item['addtime']=site.select('span/text()').extract()
            items.append(item)
        return items                 

name:是确定蜘蛛的名称。它必须是独特的,就是说,你不能设置相同的名称不同的蜘蛛。
allowed_domains:这个很明显,就是允许的域名,或者说爬虫所允许抓取的范围仅限这个列表里面的域名。
start_urls:是一个网址列表,蜘蛛会开始爬。所以,第一页将被列在这里下载。随后的网址将生成先后从数据中包含的起始网址。我这里直接是列出十个列表页。
parse():是蜘蛛的一个方法,当每一个开始下载的url返回的Response对象都会执行该函数。
这里面,我抓取每一个列表页中的<ul>下的<li>下的数据,包括title,链接,还有时间,并插入到一个列表中

第三步,将抓取到的数据存入数据库中,这里就得在pipelines.py这个文件里面修改了

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
from os import path
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher
class FjsenPipeline(object):    def __init__(self):
        self.conn=None
        dispatcher.connect(self.initialize,signals.engine_started)
        dispatcher.connect(self.finalize,signals.engine_stopped)
    def process_item(self,item,spider):
        self.conn.execute('insert into fjsen values(?,?,?,?)',(None,item['title'][0],'https://3water.com/'+item['link'][0],item['addtime'][0]))
        return item
    def initialize(self):
        if path.exists(self.filename):
            self.conn=sqlite3.connect(self.filename)
        else:
            self.conn=self.create_table(self.filename)
    def finalize(self):
        if self.conn is not None:
            self.conn.commit()
            self.conn.close()
            self.conn=None
    def create_table(self,filename):
        conn=sqlite3.connect(filename)
        conn.execute("""create table fjsen(id integer primary key autoincrement,title text,link text,addtime text)""")
        conn.commit()
        return conn

这里我暂时不解释,先继续,让这个蜘蛛跑起来再说。

第四步:修改setting.py这个文件:将下面这句话加进去

ITEM_PIPELINES=['fjsen.pipelines.FjsenPipeline']

接着,跑起来吧,执行:

scrapy crawl fjsen

就会在目前下生成一个data.sqlite的数据库文件,所有抓取到的数据都会存在这里。
Python 相关文章推荐
在Django中管理Users和Permissions以及Groups的方法
Jul 23 Python
python生成圆形图片的方法
Mar 25 Python
python实现树形打印目录结构
Mar 29 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
Python数据类型之String字符串实例详解
May 08 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
python列表每个元素同增同减和列表元素去空格的实例
Jul 20 Python
python3用urllib抓取贴吧邮箱和QQ实例
Mar 10 Python
Django项目uwsgi+Nginx保姆级部署教程实现
Apr 19 Python
聊聊Python中关于a=[[]]*3的反思
Jun 02 Python
Python max函数中key的用法及原理解析
Jun 26 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 Python
python使用scrapy解析js示例
Jan 23 #Python
php使用递归与迭代实现快速排序示例
Jan 23 #Python
python实现批量转换文件编码(批转换编码示例)
Jan 23 #Python
python写的一个文本编辑器
Jan 23 #Python
python生成指定长度的随机数密码
Jan 23 #Python
python使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 #Python
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 #Python
You might like
用libtemplate实现静态网页生成
2006/10/09 PHP
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
JS获取浮动(float)元素的style.left值为空的快速解决办法
2017/02/19 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
python最小生成树kruskal与prim算法详解
2019/01/17 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
python爬虫基础知识点整理
2020/06/02 Python
Python sublime安装及配置过程详解
2020/06/29 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
结婚邀请函范文
2014/01/14 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
导游词之麻姑仙境
2019/11/18 职场文书
MySQL中一条update语句是如何执行的
2022/03/16 MySQL
java版 简单三子棋游戏
2022/05/04 Java/Android
MYSQL如何查看操作日志详解
2022/05/30 MySQL