Python的scrapy之爬取boss直聘網站
阿新 • • 發佈:2018-12-18
在我們的專案中,單單分析一個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直聘的所有內容了