使用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 相关文章推荐
python编码总结(编码类型、格式、转码)
Jul 01 Python
python3+PyQt5实现柱状图
Apr 24 Python
python发送告警邮件脚本
Sep 17 Python
Python函数返回不定数量的值方法
Jan 22 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
Numpy之reshape()使用详解
Dec 26 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
Python如何读写二进制数组数据
Aug 01 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
python3中确保枚举值代码分析
Dec 02 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 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
PHP分页显示制作详细讲解
2006/10/09 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
node.js连接mysql与基本用法示例
2019/01/05 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
学习python类方法与对象方法
2016/03/15 Python
详解Python自建logging模块
2018/01/29 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
Python内置异常类型全面汇总
2020/05/28 Python
python的数学算法函数及公式用法
2020/11/18 Python
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
毕业生个人求职自荐信
2014/02/26 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
小学班主任寄语大全
2014/04/04 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
水浒传读书笔记
2015/06/25 职场文书
教师个人教学反思
2016/02/23 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL