#!/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 = ['//m.survivalescaperooms.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],'//m.survivalescaperooms.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的數據庫文件,所有抓取到的數據都會存在這里。