使用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流程控制语句
Dec 04 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
Python实现读取json文件到excel表
Nov 18 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
Feb 24 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
Python中zip函数如何使用
Jun 04 Python
Python Selenium库的基本使用教程
Jan 04 Python
python自动化办公操作PPT的实现
Feb 05 Python
Python使用永中文档转换服务
May 06 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
C# Assembly类访问程序集信息
2009/06/13 PHP
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
OpenLayers3实现测量功能
2020/09/25 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
跟老齐学Python之深入变量和引用对象
2014/09/24 Python
python使用mailbox打印电子邮件的方法
2015/04/30 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
python正则表达式re之compile函数解析
2017/10/25 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
对python的文件内注释 help注释方法
2018/05/23 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
Python对象转换为json的方法步骤
2019/04/25 Python
linux 下selenium chrome使用详解
2020/04/02 Python
校园之星获奖感言
2014/01/29 职场文书
环境保护标语
2014/06/20 职场文书
党课培训心得体会
2014/09/02 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书