1. 程式人生 > >Python的scrapy之爬取boss直聘

Python的scrapy之爬取boss直聘

在我們的專案中,單單分析一個51job網站的工作職位可能爬取結果不太理想,所以我又爬取了boss直聘網的工作,不過boss直聘的網站一次只能展示300個職位,所以我們一次也只能爬取300個職位。

jobbossspider.py:

# -*- coding: utf-8 -*-
import scrapy
from ..items import JobbossItem

class JobbosspiderSpider(scrapy.Spider):
    name = 'jobbosspider'
    #allowed_domains = ['https://www.zhipin.com/']
    allowed_domains = ['zhipin.com']
    # 定義入口URL
    #start_urls = ['https://www.zhipin.com/c101010100/?query=python&page=1&ka=page-1']    #北京
    #start_urls=['https://www.zhipin.com/c100010000/h_101010100/?query=Python&ka=sel-city-100010000']   #全國
    #start_urls=['https://www.zhipin.com/c101020100/h_101010100/?query=Python&ka=sel-city-101020100']   #上海
    #start_urls=['https://www.zhipin.com/c101280100/h_101010100/?query=Python&ka=sel-city-101280100']     #廣州
    #start_urls=['https://www.zhipin.com/c101280600/h_101010100/?query=Python&ka=sel-city-101280600']    #深圳
    #start_urls=['https://www.zhipin.com/c101210100/h_101010100/?query=Python&ka=sel-city-101210100']     #杭州
    #start_urls=['https://www.zhipin.com/c101030100/h_101010100/?query=Python&ka=sel-city-101030100']      #天津
    #start_urls=['https://www.zhipin.com/c101110100/h_101010100/?query=Python&ka=sel-city-101110100']       #西安
    #start_urls=['https://www.zhipin.com/c101200100/h_101010100/?query=Python&ka=sel-city-101200100']        #武漢
    #start_urls=['https://www.zhipin.com/c101270100/h_101010100/?query=Python&ka=sel-city-101270100']         #成都
    start_urls=['https://www.zhipin.com/c100010000/h_101270100/?query=python%E7%88%AC%E8%99%AB&ka=sel-city-100010000']  #爬蟲工程師,全國

    # 定義解析規則,這個方法必須叫做parse
    def parse(self, response):
        item = JobbossItem()
        # 獲取頁面資料的條數
        node_list = response.xpath("//*[@id=\"main\"]/div/div[2]/ul/li")
        # 迴圈解析頁面的資料
        for node in node_list:
            item["job_title"] = node.xpath(".//div[@class=\"job-title\"]/text()").extract()[0]
            item["compensation"] = node.xpath(".//span[@class=\"red\"]/text()").extract()[0]
            item["company"] = node.xpath("./div/div[2]/div/h3/a/text()").extract()[0]
            company_info = node.xpath("./div/div[2]/div/p/text()").extract()
            temp = node.xpath("./div/div[1]/p/text()").extract()
            item["address"] = temp[0]
            item["seniority"] = temp[1]
            item["education"] = temp[2]
            if len(company_info) < 3:
                item["company_type"] = company_info[0]
                item["company_finance"] = ""
                item["company_quorum"] = company_info[-1]
            else:
                item["company_type"] = company_info[0]
                item["company_finance"] = company_info[1]
                item["company_quorum"] = company_info[2]
            yield item
            # 定義下頁標籤的元素位置
            next_page = response.xpath("//div[@class=\"page\"]/a/@href").extract()[-1]
            # 判斷什麼時候下頁沒有任何資料
            if next_page != 'javascript:;':
                base_url = "https://www.zhipin.com"
                url = base_url + next_page
                yield scrapy.Request(url=url, callback=self.parse)




'''
# 斜槓(/)作為路徑內部的分割符。
# 同一個節點有絕對路徑和相對路徑兩種寫法。
# 絕對路徑(absolute path)必須用"/"起首,後面緊跟根節點,比如/step/step/...。
# 相對路徑(relative path)則是除了絕對路徑以外的其他寫法,比如 step/step,也就是不使用"/"起首。
# "."表示當前節點。
# ".."表示當前節點的父節點

nodename(節點名稱):表示選擇該節點的所有子節點

# "/":表示選擇根節點

# "//":表示選擇任意位置的某個節點

# "@": 表示選擇某個屬性
'''

items.py

import scrapy


class JobbossItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    job_title = scrapy.Field()  # 崗位
    compensation = scrapy.Field()  # 薪資
    company = scrapy.Field()  # 公司
    address = scrapy.Field()  # 地址
    seniority = scrapy.Field()  # 工作年薪
    education = scrapy.Field()  # 教育程度
    company_type = scrapy.Field()  # 公司型別
    company_finance = scrapy.Field()  # 融資
    company_quorum = scrapy.Field()  # 公司人數

pipelines輸出管道:

class JobbossPipeline(object):
    def process_item(self, item, spider):
        print('職位名:',item["job_title"])
        print('薪資:',item["compensation"])
        print('公司名:',item["company"])
        print('公司地點:',item["address"])
        print('工作經驗:',item["seniority"])
        print('學歷要求:',item["education"])
        print('公司型別:',item["company_type"])
        print('融資:',item["company_finance"])
        print('公司人數:',item["company_quorum"])
        print('-'*50)
        return item

pipelinemysql輸入到資料庫中:

# -*- coding: utf-8 -*-
from week5_day04.dbutil import dbutil

# 作業: 自定義的管道,將完整的爬取資料,儲存到MySql資料庫中
class JobspidersPipeline(object):
    def process_item(self, item, spider):
        dbu = dbutil.MYSQLdbUtil()
        dbu.getConnection()  # 開啟事物

        # 1.新增
        try:
            sql = "insert into boss_job (job_title,compensation,company,address,seniority,education,company_type,company_finance,company_quorum)values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"
            #date = []
            #dbu.execute(sql, date, True)
            dbu.execute(sql, (item["job_title"],item["compensation"],item["company"],item["address"],item["seniority"],item["education"],item["company_type"],item["company_finance"],item["company_quorum"]),True)
            dbu.commit()
            print('插入資料庫成功!!')
        except:
            dbu.rollback()
            dbu.commit()  # 回滾後要提交
        finally:
            dbu.close()
        return item

在settings.py中開啟如下設定

SPIDER_MIDDLEWARES = {
    'jobboss.middlewares.JobbossSpiderMiddleware': 543,
}

DOWNLOADER_MIDDLEWARES = {
    'jobboss.middlewares.JobbossDownloaderMiddleware': 543,
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None, # 這一行是取消框架自帶的useragent
    'jobboss.rotateuseragent.RotateUserAgentMiddleware': 400
}

ITEM_PIPELINES = {
    'jobboss.pipelines.JobbossPipeline': 300,
    'jobboss.pipelinesmysql.JobspidersPipeline': 301,
}

LOG_LEVEL='INFO'
LOG_FILE='jobboss.log'

#最後這兩行是加入日誌

最後啟動專案,可以在pycharm自帶的terminal中輸入 :scrapy crawl 爬蟲檔案的名稱

也可以創一個小的啟動程式:

from scrapy.cmdline import execute

execute(['scrapy', 'crawl', 'jobbosspider'])

爬蟲啟動結果:

資料庫中的資料如下:

 

以上就是爬取boss直聘的所有內容了