使用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的函数嵌套的使用方法
Jan 24 Python
使用python实现省市三级菜单效果
Jan 20 Python
Python中int()函数的用法浅析
Oct 17 Python
用pandas中的DataFrame时选取行或列的方法
Jul 11 Python
Flask之请求钩子的实现
Dec 23 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 Python
python 穷举指定长度的密码例子
Apr 02 Python
python脚本和网页有何区别
Jul 02 Python
Django CBV模型源码运行流程详解
Aug 17 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
教你漂亮打印Pandas DataFrames和Series
May 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
数字转英文
2006/12/06 PHP
劣质的PHP代码简化
2010/02/08 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
javascript 写类方式之六
2009/07/05 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
继续学习javascript闭包
2015/12/03 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
Python多线程学习资料
2012/12/19 Python
零基础写python爬虫之神器正则表达式
2014/11/06 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
Python内置函数delattr的具体用法
2017/11/23 Python
python实现list由于numpy array的转换
2018/04/04 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
简历自我评价怎么写好呢?
2014/01/04 职场文书
考试不及格检讨书
2014/01/09 职场文书
介绍信的写法
2015/01/31 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
Python 内置函数速查表一览
2021/06/02 Python
怎么用Python识别手势数字
2021/06/07 Python