Python爬虫 scrapy框架 爬取智联招聘,并把数据存入数据库,存为json格式的数据

First:创建项目:执行下面三句命令:

           1、  scrapy startproject zhilianzhaopin
           2、  cd zhilianzhaopin
           3、scrapy genspider zhilian www.zhaopin.com

项目已经创建完毕,话不多说,开始我的表演:
由于智联招聘的数据是动态加载的,所以,先来寻找路由吧……
Python爬虫 scrapy框架 爬取智联招聘,并把数据存入数据库,存为json格式的数据_第1张图片
上图绿色框里的URL并不是我们想要的,得不到我们想要的数据,F12 打开Natework看看里面的ajax请求,一个一个的找,有点耐心,
Python爬虫 scrapy框架 爬取智联招聘,并把数据存入数据库,存为json格式的数据_第2张图片
结果发现红色框里的URL,这才是我们真正想要的URL,里面才是我们想要的数据,复制该路由浏览器打开,你会看到下图:
Python爬虫 scrapy框架 爬取智联招聘,并把数据存入数据库,存为json格式的数据_第3张图片这才是我们想要的数据,是json格式的数据。
然后我们打开第二页,第三页,把各自URL拿出来,仔细看,可以发现URL的变化是有规律的,所有的参数都不变,只有一个参数改变,那就是 start的参数,第一页是0,第二页是90,第三页是180,好了,URL找对了,那代码就简单了,最重要的是有耐心!!!

爬虫文件代码:zhilian.py 源代码开始:

import scrapy
import json
from zhilianzhaopin.items import ZhilianzhaopinItem
from urllib.parse import urlencode #(这个包是为了拼接下面的URL)
class ZhilianSpider(scrapy.Spider):
    name = 'zhilian'
    # allowed_domains = ['www.zhaopin.com']
    # 爬虫最重要的就是找到正确的URL,一定要认真仔细一点,尤其是动态的获取数据
    start_urls = ['https://fe-api.zhaopin.com/c/i/sou?']
    def start_requests(self):
        # 定义一个循环   range(a,b,c)里的三个参数 都必须是正整数,a代表起始位置,b代表是结束位置,c代表的是步长
        # 原路由里的参数很多,其实大部分都是没用的,就是来迷惑你的,要有耐心的找到真正有用的参数
        for i in range(0,10,90):
            start = str(i)
            ing = {
                "start":start,
                "pageSize":"90",
                "cityId":"538",
                "kw":"Python",
                "kt":'3'
            }
            for url in self.start_urls:
                new_url = url + urlencode(ing)  # 拼接URL
                yield scrapy.Request(url=new_url, callback=self.parse)
    def parse(self, response):
        # 转换一下数据格式
        response = json.loads(response.text)
        # 取出里面的数据   里面的数据都是以字典的方式存放的,所有我们用键来去值
        result = response['data']['results']
        for i in result:
            item = ZhilianzhaopinItem()
            #高级Python开发工程师 - -抖音上海
            # 工作名字
            jobname = i['jobName']
            # 公司名字    北京字节跳动科技有限公司
            company_name = i['company']['name']
            # 工资
            welfare = i['welfare']
            #print(welfare)      #['五险一金', '绩效奖金', '交通补助', '带薪年假', '弹性工作']
            if welfare:   #有的数据是空的,要判断一下
                item['welfare'] = "".join(welfare)
            else:
                item['welfare'] = ""
            # 工资
            salary = i['salary']
            # 公司详情页路由,为了取到公司的地址,在一级页面里是没有的,得请求二级页面
            url = i['company']['url']
            # https: // company.zhaopin.com / CZ439765920.html
            item['jobname'] = jobname
            item['company_name'] = company_name
            item['salary'] = salary
            # 发送二级页面请求,重写方法,把item对象也要给传递过去,
            yield scrapy.Request(url=url, callback=self.get_detail,meta={'item':item})

    def get_detail(self,response):
        # 得到Item对象
        item = response.meta['item']
        company_address = response.xpath('//div[@class="map-box"]/p/span/text()').extract_first()
        if company_address:  #有的数据是空的,所以判断一下
            item['company_address'] = company_address
        else:
            item['company_address'] = "暂时没有提供地址!!!"
        yield item

zhilian.py 源代码 结束!!!

Items.py 定义存入数据库的字段名 源代码开始:

import scrapy
class ZhilianzhaopinItem(scrapy.Item):
    # define the fields for your item here like:
    jobname = scrapy.Field()
    company_name= scrapy.Field()
    salary = scrapy.Field()
    welfare = scrapy.Field()
    company_address = scrapy.Field()

items.py 源代码 结束!!!

管道文件 pipelines.py 源代码—开始:

# 导入模块
import pymysql

class ZhilianzhaopinPipeline(object):
    conn = None   #定义连接
    mycursor = None   #定义游标
    def open_spider(self,spider):
        # 连接自己的数据库,用前面定义的变量接受一下,连接的前提是你得在数据库里建立数据库和数据表
        self.conn = pymysql.connect(host="127.0.0.1",user="root",password="962464",port=3306,db="scrapy")
    def process_item(self, item, spider):
        # 获取一下游标
        self.mycursor = self.conn.cursor()
        # 编写sql语句
        sql = "insert into zhilian(jobname,company_name,salary,welfare,company_address) values ('%s','%s','%s','%s','%s')"%(item['jobname'],item['company_name'],item['salary'],item['welfare'],item['company_address'])
        # 执行sql语句
        self.mycursor.execute(sql)
        self.conn.commit()
        print("插入成功一条数据……")
        return item
    def close_spider(self, spider):
        # 关闭游标
        self.mycursor.close()
        # 断开连接
        self.conn.close()



import json
# 以json的格式存储到文件中
class ZhilianPipeline(object):
    f = None
    list1 = []   #定义一个列表
    def open_spider(self,spider):
        print("开始爬虫……")
         # 打开文件(这里只打开一次,也就是说只运行一次)
        self.f = open('zhilian.json','w',encoding='utf-8')
    def process_item(self, item, spider):
        print("正在写入……")
        # 定义一个字典
        dict = {
            "jobname":item['jobname'],
            "company_name":item['company_name'],
            "salary":item['salary'],
            'welfare':item['welfare'],
            'company_address':item['company_address']
        }
        # 把每一个字典都加入到列表中
        self.list1.append(dict)
        return item
    def close_spider(self,spider):
        # 把列表序列化一下,转换为json格式的字符串
        ang = json.dumps(self.list1)
        # 一次性全部写入文件
        self.f.write(ang)
        print("结束爬虫……")
        self.f.close()

管道文件 pipelines.py 源代码 结束!!!
当然了,settings.py 就简单多了,,,别忘了,打开管道文件的开关,

  ITEM_PIPELINES = {
   'zhilianzhaopin.pipelines.ZhilianzhaopinPipeline': 400,
   'zhilianzhaopin.pipelines.ZhilianPipeline': 300,
}
修改robots协议,伪装浏览器访问:


 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False

好了,全部代码到此结束,那里有错的,给我留言,我会第一时间内回复,当然了,就得可以的点个赞,转发一下,谢谢!!!
再见!!!

你可能感兴趣的:(Python爬虫实战)