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'))
最后 总结:这些碰到的问题都是小问题,也就第一次写才会出现。共勉
另外:此例子的仅仅用来练习,功能还不完全。