主要有3个文件,作用分别是:字段的定义(字典的构造)、主爬取代码、文件处理(数据存储)。
代码如下:
#items.py
# -*- coding: utf-8 -*-
import scrapy
class JobItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()#职位名称
company=scrapy.Field()#公司名称
loc = scrapy.Field()#所在城市
salary = scrapy.Field()#薪资范围
pubTime=scrapy.Field()#发布时间
eduBack = scrapy.Field()#学历
expTime=scrapy.Field()#经验
comNature=scrapy.Field()#公司性质
scale=scrapy.Field()#公司规模
requirement = scrapy.Field()#招聘要求
#myjob.py
# -*- coding: utf-8 -*-
import scrapy
from job.items import JobItem
from lxml import html
import re
class MyjobSpider(scrapy.Spider):
name = 'myjob'
allowed_domains = ['51job.com']
start_urls = 'https://jobs.51job.com/hy40/jisuanjiruanjian/p%s/'
def start_requests(self):
page_num = self.settings['PAGE_NUM']
for i in range(page_num):
url=self.start_urls %(i)
yield scrapy.Request(url,callback=self.parse)
def parse(self, response):
DeLists=response.xpath('/html/body/div[3]/div[3]/div[1]/div[2]')
DeList=DeLists[0] # 定位到其中的第一个节点
for ex in DeList.xpath('./div'):
item = JobItem() # 实例化Item
#/html/body/div[3]/div[3]/div[1]/div[2]/div[1]/p[1]/span[1]/a
item['name']=ex.xpath('./p[1]/span[1]/a/text()').extract()[0].strip()
item['company']=ex.xpath('./p[1]/a/text()').extract()[0].strip()
item['loc']=ex.xpath('./p[1]/span[2]/text()').extract()[0].strip()
item['salary']=ex.xpath('./p[1]/span[3]/text()').extract()[0].strip()
item['pubTime']=ex.xpath('./p[1]/span[4]/text()').extract()[0].strip()
item['eduBack']=ex.xpath('./p[2]/text()[1]').extract()[0].strip()
item['expTime']=ex.xpath('./p[2]/text()[2]').extract()[0].strip()
item['comNature']=ex.xpath('./p[2]/text()[3]').extract()[0].strip()
item['scale']=ex.xpath('./p[2]/text()[4]').extract()[0].strip()
item['requirement']=ex.xpath('./p[3]/text()').extract()[0].strip()
yield item
由下面例子:
>>> response.xpath('//title/text()')
[
可知.xpath() 及 .css() 方法返回一个类 SelectorList 的实例, 它是一个新选择器的列表。为了提取真实的原文数据,需要调用 .extract()。而.strip()方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
#pipeline.py
#将数据存入Excel文件
import xlwt
class JobPipeline(object):
wb = xlwt.Workbook() # 创建xls文件对象
sh = wb.add_sheet('JobList') # 新增一个表单
r=1
def open_spider(self, spider):
self.sh.write(0, 0, '职位名称') # 在指定单元格写数据
self.sh.write(0, 1, '公司名称')
self.sh.write(0, 2, '所在城市')
self.sh.write(0, 3, '薪资范围')
self.sh.write(0, 4, '发布时间')
self.sh.write(0, 5, '学历要求')
self.sh.write(0, 6, '工作经验')
self.sh.write(0, 7, '公司性质')
self.sh.write(0, 8, '公司规模')
self.sh.write(0, 9, '招聘要求')
def process_item(self, item, spider):
self.sh.write(self.r,0,item['name'])
self.sh.write(self.r,1,item['company'])
self.sh.write(self.r,2,item['loc'])
self.sh.write(self.r,3,item['salary'])
self.sh.write(self.r,4,item['pubTime'])
self.sh.write(self.r,5,item['eduBack'])
self.sh.write(self.r,6, item['expTime'])
self.sh.write(self.r,7, item['comNature'])
self.sh.write(self.r,8, item['scale'])
self.sh.write(self.r,9,item['requirement'])
self.r=self.r+1
self.wb.save('51Job.xls')
return item
def close_spider(self, spider):
self.wb.close()
主要代码就是以上内容,下面就是一些公共的设置,没有什么的特别处理,如下:
#settings.py
BOT_NAME = 'job'
SPIDER_MODULES = ['job.spiders']
NEWSPIDER_MODULE = 'job.spiders'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
'job.pipelines.JobPipeline': 300,
}
PAGE_NUM=232#页数