使用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的Django框架中用流响应生成CSV文件的教程
May 02 Python
Django中处理出错页面的方法
Jul 15 Python
python查询mysql,返回json的实例
Mar 26 Python
解决python "No module named pip" 的问题
Oct 13 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
Jan 08 Python
Python3简单实现串口通信的方法
Jun 12 Python
python可迭代对象去重实例
May 15 Python
记一次Django响应超慢的解决过程
Sep 17 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
python cv2图像质量压缩的算法示例
Jun 04 Python
PyQt5结合QtDesigner实现文本框读写操作
Jun 11 Python
在Python 中将类对象序列化为JSON
Apr 06 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中使用memcache存储session的三种配置方法
2014/04/05 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
php生成图片验证码的方法
2016/04/15 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
js打造数组转json函数
2015/01/14 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
Python中的ceil()方法使用教程
2015/05/14 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
pygame实现非图片按钮效果
2019/10/29 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
Python中的__init__作用是什么
2020/06/09 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
教师党员公开承诺书
2014/03/25 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
股份合作协议书范本
2014/04/14 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
学校领导班子对照检查材料
2014/09/24 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
Java中的随机数Random
2022/03/17 Java/Android