python爬虫Scrapy(一)-我爬了boss数据

一、概述

学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门

本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴。

本篇文章我们爬取的是boss直聘来数据,毕竟这个网站的数据还是很有参考价值的,这篇文章我们只讲述怎么爬取boss直聘的招聘信息,下一篇文章我们在对爬取到的数据进行分析。

二、Scrapy框架使用步骤

下面我们做一个简单示例,创建一个名字为movie的爬虫工程,然后创建一个名字为meiju的爬虫来爬取meijutt.com这个网站

创建工程步骤:

1、创建工程 scrapy startproject movie

2、创建爬虫程序 cd movie 回车 scrapy gensipder meiju meijutt.com

3、编写数据存储模板items.py 类对象继承自scrapy.item

4、编写爬虫meiju.py 类对象集成子scrapy.Spider

5、修改settings.py配置文件 ITEM_PIPELINES = {‘movie.pipelines.MoviePipeline’:100}

6、编写数据处理脚本进行数据保存,pipelines.py 类对象继承自object

def process_item(self, item, spider):
    with open("my_meiju.txt", 'a') as fp:
        fp.write(item['name'] + '\n')

7、执行爬虫 cd movie 回车 scrapy crawl meiju --nolog
注意:如果导出的中文乱码则需要在settings.py文件中配置编码:FEED_EXPORT_ENCODING = ‘utf-8’

三、环境安装

爬虫框架我们使用Scrapy,爬取到的数据我们使用mongodb来存储

1、安装Scrapy

pip install Scrapy

2、安装mongodb

pip install pymongo

如果安装速度太慢,或者安装失败可以尝试使用如下命令

pip install pymongo -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 

四、mongodb使用

上一小节我们安装了mongodb数据库,我们爬取到的招聘信息就存储在该数据库中,为了方便数据存储,我们可以封装一个类,来快速的访问数据库,代码如下所示

from pymongo import MongoClient

class my_connect(object):
    def __init__(self, settings):
        try:
            self.conn = MongoClient(settings["ip"], settings["port"])
        except Exception as e:
            print(e)
        self.db = self.conn[settings["db_name"]]
        self.my_set = self.db[settings["set_name"]]

    def insert(self, dic):
        self.my_set.insert(dic)

    def update(self, dic, newdic):
        self.my_set.update(dic, newdic)

    def delete(self, dic):
        self.my_set.remove(dic)

    def dbfind(self, dic):
        return self.my_set.find(dic)

    def setTableName(self, name):
        #print(u'修改当前使用集合:{}'.format(name))
        self.my_set = self.db[name]

上述代码中我们封装了一个名为my_connect的类,并提供了输入、更新、删除和查找文档的接口,除此之外还提供了一个setTableName的接口,这个接口主要是用于往不同集合中插入文档数据。

MongoDB 概念解析可以看这里

mongodb属于非关系型数据库,与关系型数据库对比图如下

my_connect初始化函数中需要一个参数,需要我们传入ip地址、端口号、数据库名字和集合名字,使用方式如下所示

from pymongo import MongoClient
from my_connect import my_connect

settings = {
    "ip":'127.0.0.1',   #ip
    "port":27017,           #端口
    "db_name" : "zhipin_datas",    #数据库名字
    "set_name" : "test"   #集合名字
}

conn = my_connect(settings)
conn.setTableName('21') 
conn.insert({'12':'3'})

五、创建爬虫zhipin

1、输入如下命令,创建zhipin爬虫

scrapy startproject www_zhipin_com

cd www_zhipin_com

回车

scrapy gensipder zhipin www.zhipin.com

2、修改zhipin.py

修改zhipin.py,爬取数据,各类成员属性信息代码中有消息解释,需要注意的是parse方法,该方法是爬取到数据以后的回调函数,参数response表示爬取到的结果,我们可以对其进行解析拿到网页数据。

解析数据时

def parse(self, response):
        job_list = response.css('div.job-list > ul > li')
        request_data = []
        for job in job_list:
            item = WwwZhipinComItem()
			'''
			yield item
			

2.1、这里有一个小技巧,我们重写start_requests方法,让他调用了我们自己写的一个方法next_request,并设置了回调函数为parse方法,当parse数据解析完毕后,又构造一个新的url在次调用next_request方法拉取数据,一直循环迭代,拉取数据、解析数据

2.2、boss直聘有一个限制,不管以什么样的方式搜索数据,数据最多显示10页,这也就要求我们需要对爬虫做一个处理,在合适的实际去终止拉取数据

2.3、经过对爬虫数据的分析,我们发现当最后一次请求和上一次请求的数据完全一样时,我们可能已经到达请求的最后一页,那么这个时候我们就可以去终止爬虫了

2.4、为了快速的比对我么爬取到的数据是否和上一次一样,我们对爬取到的数据进行简单的处理,每次去对比关键字段即可

class itemData(object):
    def __init__(self, data):
        self.companyShortName = data['companyShortName']
        self.positionName = data['positionName']
        self.time = data['time']
        self.city = data['city']
   
    def __eq__(self, other):
        return (self.positionName == other.positionName
        and self.companyShortName == other.companyShortName
        and self.time == other.time
        and self.city == other.city)

    def __str__(self):
        return "{}:{}:{}:{}".format(self.companyShortName
        , self.time
        , self.city
        , self.positionName)

itemData包含是一条招聘信息,存储了招聘公司名称,职位名称,发布时间和发布城市,我们重写了__eq__方法,就是为了比对两个对象是否相等。

2.5、一次请求的数据是一个itemData集合,当两个集合相等时我们即可终止爬虫

if one_request == request_data:#已经拉取到最后一页数据了  退出
	print('{}:本次拉取数据和上次拉取数据相同,{}'.format(time.strftime("%Y-%m-%d %H:%M:%S"
	, time.localtime()), self.curPage))
	return

one_request = request_data #更新最后一次请求数据

print('{}:拉取数据量:{}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), len(job_list)))
self.curPage += 1
time.sleep(5) # 停停停!听听听!都给我停下来听着!睡一会(~﹃~)~zZ
yield self.next_request()

2.6、parse解析数据时,对每一条数据会构造一个WwwZhipinComItem对象item,并通过yield item方式触发

3、修改item.py

对于爬取的字段定义需要我们修改item.py文件,定义爬取字段如下

class WwwZhipinComItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pid = scrapy.Field()
    positionName = scrapy.Field()
    positionLables = scrapy.Field()
    workYear = scrapy.Field()
    salary = scrapy.Field()
    city = scrapy.Field()
    education = scrapy.Field()
    companyShortName = scrapy.Field()
    industryField = scrapy.Field()
    financeStage = scrapy.Field()
    companySize = scrapy.Field()
    time = scrapy.Field()
    updated_at = scrapy.Field()
    

4、最后一步写入数据库

4.1、第四小节我们封装了一个名字为my_connect的数据库操作对象,在这里我们就可以用上了。

4.2、首先构造一个conn对象

db_name = 'zhipin_datas_C++'
nowMonth = datetime.datetime.now().month
settings = {
    "ip":'127.0.0.1',   #ip
    "port":27017,           #端口
    "db_name" : db_name,    #数据库名字
    "set_name" : "test"   #集合名字
}

conn = my_connect(settings)

4.3、指定要插入的集合,构造数据、插入数据

conn.setTableName(month) 

data = {"pid": item['pid']#"27102804"
, "positionName": item['positionName']
, "positionLables": item['positionLables']#[]
, "workYear": item['workYear']#"5-10年"
, "salary": item['salary']#"30k-50k"
, "city": item['city']#"北京 海淀区 知春路"
, "education": item['education']#"硕士"
, "companyShortName": item['companyShortName']#"vmware"
, "industryField": item['industryField']#"计算机软件"
, "financeStage": item['financeStage']#"已上市"
, "companySize": item['companySize']#"10000人以上"
, "time": item['time']#"2018-11-13 17:35:02"
, "updated_at": item['updated_at']#"2018-11-13 17:35:02"
}

conn.insert(data)

4.4、数据爬取结束后,使用gui工具Navicat 12 for MongoDB可以查看爬取到的数据,效果如下图所示

六、源码下载

需要全部代码的到csdn直接下载:python爬虫Scrapy(一)-我爬了boss数据


如果您觉得文章不错,不妨给个 打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!




很重要–转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords

  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值