• python-scrapy爬取某招聘网站信息(一)


    首先准备python3+scrapy+mysql+pycharm。。。

    这次我们选择爬取智联招聘网站的企业招聘信息,首先我们有针对的查看网站的html源码,发现其使用的是js异步加载的方式,直接从服务端调取json数据,这就意味着我们用地址栏的网址获取的网站内容是不全的,无法获得想要的数据。

    那么我们用什么方式获取想要的数据呢,正所谓道高一尺魔高一丈,有反爬虫就有范反爬虫,当然我们不用那么麻烦,通过分析页面的加载有针对性的抓包获取信息进行分析,我们会发现每次刷新或者搜索页面时候,除了会加载许多图片、广告等信息外,还加载了一个包,这个包里就有我们想要的所有信息,并且服务端都给我们打包成json格式了,这样看似复杂,实则简化了我们对数据进行过滤的步骤。

    直接从头文件中找到请求的url源头,那么就能直接获取json数据了。 怎么样是不是感受到了世界的友好呢?

    分析完毕,接下来就可以编写爬虫数据了。。。

    一、创建爬虫项目

    在命令行中在指定的目录创建爬虫项目

    scrapy startproject zhilian

    然后就是创建爬虫文件

    scrapy genspider zhaopin "sou.zhaopin.com"  
    #要把http://www去掉因为爬虫项目运行时会自动加上,这里也是为了避免不必要的错误

    二、编写程序

    首先编写item文件,我们有选择的爬取几个关键数据

    import scrapy
    
    class ZhilianItem(scrapy.Item):
        # 岗位名称
        jobName = scrapy.Field()
        # 公司名称
        companyName = scrapy.Field()
        # 工作地点
        workSite = scrapy.Field()
        # 更新日期
        updateDate = scrapy.Field()
        # 薪资水平
        salaryLevel = scrapy.Field()
        # 岗位关键词
        jobKeyWord = scrapy.Field()

    然后就是编写爬虫文件了我们的命名为zhaopin.py

    # -*- coding: utf-8 -*-
    import json
    
    import scrapy
    from zhilian.items import ZhilianItem
    
    
    class zhaopinSpider(scrapy.Spider):
        name = 'javaDevelop'
        allowed_domains = ['sou.zhaopin.com']
        offset = 0
        url1 = "https://fe-api.zhaopin.com/c/i/sou?start="
        url2 = "&pageSize=90&cityId=530&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E7%BB%8F%E6%B5%8E&kt=3"
        start_urls = (
            url1 + str(offset) + url2,  #此为我们简化后的网址,网址的规律相当简单,简单试试就找到规律了
        )
    
        print(start_urls)
        def parse(self, response):for flag in range(0, 90):
                item = ZhilianItem()
                job = json.loads(response.text)['data']['results'][flag]
    
                # 岗位名称
                item['jobName'] = job['jobName']
                # 公司名称
                item['companyName'] = job['company']['name']
                # 工作地点
                item['workSite'] = job['city']['display']
                # 更新日期
                item['updateDate'] = job['updateDate']
                # 薪资水平
                item['salaryLevel'] = job['salary']
                # 岗位关键词
                item['jobKeyWord'] = job['welfare']
                yield item
    
            if self.offset < 450:
                self.offset += 90
                yield scrapy.Request(self.url1 + str(self.offset) + self.url2, callback=self.parse, dont_filter=True)
           #dont_filter=True这个参数相当重要,指不过滤url直接爬取。否则你会发现你的爬虫爬取完第一页后就不会再爬取了,这样是因为url与爬取域url不符,爬虫自动认为爬取结束

    接下来就是写管道文件了,这里我用了两种方式,一种是写到数据库中,还有一种是写道本地txt文件中

    import pymysql
    
    
    class zhaoPipeline(object):
        def __init__(self):
            self.conn = pymysql.connect(host='172.18.96.151', user='root',
                                        password='123456', db='zhilian', charset='utf8'
                                        )
            self.cur = self.conn.cursor()
    
        def process_item(self, item, spider):
            # 岗位名称
            jobName = item['jobName']
            # 公司名称
            companyName = item['companyName']
            # 工作地点
            workSite = item['workSite']
            # 官网链接
            updateDate = item['updateDate']
            # 薪资水平
            salaryLevel = item['salaryLevel']
            # 岗位关键词
            jobKeyWord = item['jobKeyWord']
            data = [jobName, companyName, workSite, updateDate, salaryLevel, ','.join(jobKeyWord)]
            print(data)
            print("======================================")
            sql = """
            insert into zhaopin (jobname,companyname,worksite,updatedate,salarylevel,jobkeyword) values 
            (%s,%s,%s,%s,%s,%s)
            """
            # self.conn.ping(reconnect=True)
            self.cur.execute(sql, data)
            self.conn.commit()
    
        def close_spider(self, spider):
            self.cur.close()
            self.conn.close()
    
    
    class ZhilianPipeline(object):
        def __init__(self):
            self.filename = open("java.txt", 'wb')
            # self.path = "G:imagesp"
            # if not os.path.exists(self.path):
            #     os.mkdir(self.path)
    
        def process_item(self, item, spider):
            # 岗位名称
            jobName = item['jobName']
            # 公司名称
            companyName = item['companyName']
            # 工作地点
            workSite = item['workSite']
            # 官网链接
            updateDate = item['updateDate']
            # 薪资水平
            salaryLevel = item['salaryLevel']
            # 岗位关键词
            jobKeyWord = item['jobKeyWord']
    
            self.filename.write(jobName.encode('utf-8') + '    '.encode('utf-8')
                                + companyName.encode('utf-8') + '   '.encode('utf-8')
                                + workSite.encode('utf-8') + '    '.encode('utf-8')
                                + updateDate.encode('utf-8') + '    '.encode('utf-8')
                                + salaryLevel.encode('utf-8') + '    '.encode('utf-8')
                                + ','.join(jobKeyWord).encode('utf-8') + '
    '.encode('utf-8'))
            return item
    
        def close_spider(self, spider):
            self.filename.close()

    手把手教学,我们附上建立库语句

    create table zhaopin
    (id int(10) not null primary key AUTO_INCREMENT,
      jobname varchar(40),
        companyname varchar(20),
        worksite varchar(10),
        updatedate datetime,
        salarylevel varchar(10),
        jobkeyword varchar(40)
        );

    然后就剩下最后的设置setting了,下面三个关键的地方要改

    ROBOTSTXT_OBEY = False

    DEFAULT_REQUEST_HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36', # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', # 'Accept-Language': 'en', }

    ITEM_PIPELINES = {
    'zhilian.pipelines.ZhilianPipeline': 300,
    'zhilian.pipelines.zhaoPipeline': 200,
    }

    三、运行爬虫

    scrapy crawl zhaopin

    等待片刻,刷新数据表

     OVER。。。

  • 相关阅读:
    CentOS7 安装Redis Cluster集群
    CentOS7 安装Redis 单机版
    CentOS7 配置免密登陆
    深入java虚拟机学习 -- 内存管理机制
    深入java虚拟机学习 -- 类的卸载
    深入java虚拟机学习 -- 类的加载机制(四)
    深入java虚拟机学习 -- 类的加载机制(三)
    深入java虚拟机学习 -- 类的加载机制(续)
    (原创)cocos lua 热更新从零开始(一)最简单demo
    lua 调用参数报错(a userdata value)
  • 原文地址:https://www.cnblogs.com/jake-jin/p/11965702.html
Copyright © 2020-2023  润新知