使用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 SQLite3数据库操作类分享
Jun 10 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
Python3批量移动指定文件到指定文件夹方法示例
Sep 02 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
python redis存入字典序列化存储教程
Jul 16 Python
使用python批量修改XML文件中图像的depth值
Jul 22 Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 28 Python
Django中ORM的基本使用教程
Dec 22 Python
python 实现体质指数BMI计算
May 26 Python
Python机器学习之基于Pytorch实现猫狗分类
Jun 08 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中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
php xhprof使用实例详解
2019/04/15 PHP
javascript StringBuilder类实现
2008/12/22 Javascript
javascript 冒号 使用说明
2009/06/06 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
Python学习笔记之if语句的使用示例
2017/10/23 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
python中的colorlog库使用详解
2019/07/05 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
测绘工程专业个人自我评价
2013/12/01 职场文书
十佳家长事迹材料
2014/08/26 职场文书
会计主管岗位职责
2015/04/02 职场文书