使用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中的魔法方法深入理解
Jul 09 Python
Django中使用group_by的方法
May 26 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
python 抓包保存为pcap文件并解析的实例
Jul 23 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
基于Django实现日志记录报错信息
Dec 17 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
Python文件的操作示例的详细讲解
Apr 08 Python
Python实现提取PDF简历信息并存入Excel
Apr 02 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 !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
2011/01/07 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
理解JS绑定事件
2016/01/19 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
浅谈sass在vue注意的地方
2017/08/10 Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
2018/07/01 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
使用Python的判断语句模拟三目运算
2015/04/24 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
python3中的eval和exec的区别与联系
2019/10/10 Python
ipad上运行python的方法步骤
2019/10/12 Python
python标识符命名规范原理解析
2020/01/10 Python
python学习将数据写入文件并保存方法
2020/06/07 Python
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
社会实践自我鉴定
2013/11/07 职场文书
打架检讨书100字
2014/01/08 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
人力资源求职信
2014/05/25 职场文书
中职招生先进个人材料
2014/08/31 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
彻底理解golang中什么是nil
2021/04/29 Golang