使用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去掉字符串中空格的方法
Mar 11 Python
Python中多线程thread与threading的实现方法
Aug 18 Python
python基础教程之循环介绍
Aug 29 Python
Python利用openpyxl库遍历Sheet的实例
May 03 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
pandas 对group进行聚合的例子
Dec 27 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
详解Python 最短匹配模式
Jul 29 Python
Python 如何实现数据库表结构同步
Sep 29 Python
Python实现给PDF添加水印的方法
Jan 25 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
将数组写入txt文件 var_export
2009/04/21 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
JS 树形递归实例代码
2010/05/18 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
基于Vue实现可以拖拽的树形表格实例详解
2018/10/18 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
经典c++面试题四
2015/05/14 面试题
楼面部长岗位职责范本
2014/02/14 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js