使用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判断图片宽度和高度后删除图片的方法
May 22 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
python2 与 pyhton3的输入语句写法小结
Sep 10 Python
win10系统下Anaconda3安装配置方法图文教程
Sep 19 Python
快速排序的四种python实现(推荐)
Apr 03 Python
python求最大值最小值方法总结
Jun 25 Python
python防止随意修改类属性的实现方法
Aug 21 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
python中设置超时跳过,超时退出的方式
Dec 13 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
基于python实现ROC曲线绘制广场解析
Jun 28 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命令权限不足问题解决方法
2015/02/07 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
PHP读取Excel类文件
2017/05/15 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
javascript模块化简单解析
2016/04/07 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
python实现图像拼接功能
2020/03/23 Python
销售部主管岗位职责
2013/12/18 职场文书
新农村建设标语
2014/06/24 职场文书
保险专业求职信
2014/07/07 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
个人总结格式范文
2015/03/09 职场文书
八一建军节主持词
2015/07/01 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
初中政治教师教学反思
2016/02/23 职场文书
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python