今天在写python的时候遇到一个问题:定义了一个list类型的类变量,但是这个list需要在初始化的时候给它加很多的url进去.这样的话我们就需要用倒函数了.结果自己刚开始这样写的:
class TianyaSpider(CrawlSpider):
def init_start():
url_l = u'http://search.tianya.cn/s?tn=sty&rn=10&pn='
url_r = u'&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8'
urls = []
for i in range(0,75,1):
tem = url_l + str(i) + url_r
urls.append(tem)
return urls
name = 'tianya'
allowed_domains = ['tianya.cn']
start_urls = init_start()
这样写是成功了,但是总感觉不规范,如果你把函数的定义写在后面那么程序还无法识别该函数.其实我觉得这和java等是一个道理,这个方法中的代码是放在static区的.在第一次加载这个类的时候,这些代码便放了进去.这样的函数好像是不太方便在类的外部去调用的.所以这样做在python中无疑是不规范的,那么我就想换一种表达的方式
刚开始我一直想在类定义的内部去调用类函数来进行该类变量的初始化,所以代码变成下面这个样子:
# -*- coding: utf-8 -*-
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from GaoKao.items import GaokaoItem
class TianyaSpider(CrawlSpider):
name = 'tianya'
allowed_domains = ['tianya.cn']
start_urls = TianyaSpider.init_start()
count = 0
def parse(self, response):
hxs = HtmlXPathSelector(response)
self.count = self.count + 1
#title = hxs.select("//div[@id='post-title'][@class='fn-clear']/h1[@id='hTitle']//*/text()").extract()
title = hxs.select('//title/text()').extract()
item = GaokaoItem()
item['title'] = title[0]
yield item
@classmethod
def init_start(cls):
url_l = u'http://search.tianya.cn/s?tn=sty&rn=10&pn='
url_r = u'&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8'
urls = []
for i in range(0,75,1):
tem = url_l + str(i) + url_r
urls.append(tem)
return urls
但是报错说TinayaSpider没有定义,你了个妹的,估计是当成对象了,接着我又这样做:
# -*- coding: utf-8 -*-
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from GaoKao.items import GaokaoItem
class TianyaSpider(CrawlSpider):
@classmethod
def init_start(cls):
url_l = u'http://search.tianya.cn/s?tn=sty&rn=10&pn='
url_r = u'&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8'
urls = []
for i in range(0,75,1):
tem = url_l + str(i) + url_r
urls.append(tem)
return urls
name = 'tianya'
allowed_domains = ['tianya.cn']
start_urls = init_start()
count = 0
def parse(self, response):
hxs = HtmlXPathSelector(response)
self.count = self.count + 1
#title = hxs.select("//div[@id='post-title'][@class='fn-clear']/h1[@id='hTitle']//*/text()").extract()
title = hxs.select('//title/text()').extract()
item = GaokaoItem()
item['title'] = title[0]
yield item
但是还是报错说不能调用该类方法.
至今不知道在这里怎么去调用类方法来进行初始化.
但是我一想,我可以通过实例方法来改变.所以我把代码的结构一改,换成如下:
# -*- coding: utf-8 -*-
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from GaoKao.items import GaokaoItem
class TianyaSpider(CrawlSpider):
def init_start(cls):
url_l = u'http://search.tianya.cn/s?tn=sty&rn=10&pn='
url_r = u'&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8'
urls = []
for i in range(0,75,1):
tem = url_l + str(i) + url_r
urls.append(tem)
return urls
name = 'tianya'
allowed_domains = ['tianya.cn']
start_urls = []
count = 0
def __init__(self):
CrawlSpider.__init__(self)
TianyaSpider.start_urls = self.init_start()
def parse(self, response):
hxs = HtmlXPathSelector(response)
self.count = self.count + 1
#title = hxs.select("//div[@id='post-title'][@class='fn-clear']/h1[@id='hTitle']//*/text()").extract()
title = hxs.select('//title/text()').extract()
item = GaokaoItem()
item['title'] = title[0]
yield item
def init_start(self):
url_l = u'http://search.tianya.cn/s?tn=sty&rn=10&pn='
url_r = u'&s=0&pid=&f=0&h=1&ma=0&q=%B8%DF%BF%BC%D6%BE%D4%B8'
urls = []
for i in range(0,75,1):
tem = url_l + str(i) + url_r
urls.append(tem)
return urls
这样便成功了.不知道为什么这里就识别除了tinayaspider了