使用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 相关文章推荐
Pycharm学习教程(2) 代码风格
May 02 Python
Python编写登陆接口的方法
Jul 10 Python
python binascii 进制转换实例
Jun 12 Python
python防止随意修改类属性的实现方法
Aug 21 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
Django操作session 的方法
Mar 09 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
python中def是做什么的
Jun 10 Python
PyQt5 QDockWidget控件应用详解
Aug 12 Python
python -v 报错问题的解决方法
Sep 15 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
Feb 03 Python
asyncio异步编程之Task对象详解
Mar 13 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调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
jquery text()要注意啦
2009/10/30 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
Python实现常见的回文字符串算法
2018/11/14 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
自荐信需注意事项
2014/01/25 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
安全标准化实施方案
2014/02/20 职场文书
保健品市场营销方案
2014/03/31 职场文书
标准单位租车协议书
2014/09/23 职场文书
学生检讨书如何写
2014/10/30 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
Java使用Unsafe类的示例详解
2021/09/25 Java/Android