scrapy之CrawlSpider 样例分析

crawlSpider 概念性的知识此处不再赘述。下面直接上自己写的一个例子,并列出碰到的问题,方便以后复习。由于是刚开始学习这个框架,碰到的问题都很小白。

该例子是通过51的一个列表页面,获取该页面的所有详情页链接,并解析。

items.py:(注:这里并没有抓取详情页的全部招聘信息,只是大概列了几个,检查效果)

class jobTest(scrapy.Item):
    title=scrapy.Field()
    wages=scrapy.Field()
    company=scrapy.Field()
    description=scrapy.Field()
    url=scrapy.Field()

spider.py

class jobDemo(CrawlSpider):
    name ='jobDemo'
    start_urls=['https://search.51job.com/list/100200,000000,0000,32,9,99,%2B,2,1.html']
    xpaths = '//div[@class="el"]/p[@class="t1 "]'
    links = LinkExtractor(restrict_xpaths=xpaths, allow_domains='51job.com', tags='a', attrs='href')
    rules =(
        Rule(links,callback='parse_item',follow=True),
            )
    def parse_item(self,response):
        item=jobTest()
        item['title']="".join(response.xpath('//div[@class="cn"]/h1/@title').extract())
        item['url']=response.url
        item['company']="".join(response.xpath('//p[@class="cname"]/a/@title').extract())
        item['wages']="".join(response.xpath('//div[@class="cn"]/strong/text()').extract())
        des_tag=response.xpath('//div[@class="bmsg job_msg inbox"]')
        if des_tag:
            des_u="".join(des_tag.xpath('string(.)').extract()).encode('utf-8')
            item['description']=des_u.replace('\n','')
        else:
            item['description']=""
        yield item

pipelines.py

class CSVPipeLine(object):#导出csv
    def __init__(self):
        # csv文件的位置, os.path.dirname(__file__) + '/spiders/qtw.csv' 存在项目下
        store_file = 'E:\\jobTest.csv'
        # 打开(创建)文件
        self.file = open(store_file, 'wb')
        # csv写法
        self.writer = csv.writer(self.file)
        self.writer.writerow(('title','wages','简介','公司','url'))
    def process_item(self,item,spider):
        # 可以加if 判断 如果不存在可以不写入
        self.writer.writerow((item['title'].encode('utf-8'), item['wages'].encode('utf-8'),item['description'].encode('utf-8'),
                              item['company'].encode('utf-8'),item['url'].encode('utf-8')))
        return item

Rule中定义的linkExtract(链接提取器)用来获取start中的链接。然后把提取到的链接的response 传递到callback定义的方法中。

问题记录:

1.rules 中写的Rule括号后面要+逗号,不然报错(坑死)

2.不管是/@xxx 获取属性内容还是/text() 获取文本,返回都是一个列表

3.用 list[0 ] 方式获取列表的内容,有可能内容为空 这里我用join获取(保证数据只能为0 或1个),如果用下标的方式 要判空

4.获取标签下的文本内容 使用string(.) 该方法返回的是一个Selector,不是字符

5.本例中,结果是导出到csv中,需要去除description字段中的换行,需要转为utf类型 才能使用replace方法(附

reload(sys)
sys.setdefaultencoding('utf-8'))

最后 总结:这些碰到的问题都是小问题,也就第一次写才会出现。共勉

另外:此例子的仅仅用来练习,功能还不完全。

 

 

你可能感兴趣的:(框架,爬虫)