使用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使用递归解决全排列数字示例
Feb 11 Python
python统计一个文本中重复行数的方法
Nov 19 Python
python 读取摄像头数据并保存的实例
Aug 03 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
ActiveMQ:使用Python访问ActiveMQ的方法
Jan 30 Python
python画图把时间作为横坐标的方法
Jul 07 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
django实现支付宝支付实例讲解
Oct 17 Python
python实现LRU热点缓存及原理
Oct 29 Python
python分布式计算dispy的使用详解
Dec 22 Python
基于Python的自媒体小助手---登录页面的实现代码
Jun 29 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中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
Js sort排序使用方法
2011/10/17 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python读取Excel的方法实例分析
2015/07/11 Python
Python中optparser库用法实例详解
2018/01/26 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
linux面试题参考答案(9)
2015/01/07 面试题
酒店个人培训自我鉴定
2013/12/11 职场文书
电大本科自我鉴定
2014/02/05 职场文书
班主任班级寄语大全
2014/04/04 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
工作年限证明模板
2015/06/15 职场文书
创业计划书之水果店
2019/07/18 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
Python合并pdf文件的工具
2021/07/01 Python
Go Plugins插件的实现方式
2021/08/07 Golang