电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

瀏覽:132日期:2022-07-17 15:05:36

本文實例為爬取拉勾網上的python相關的職位信息, 這些信息在職位詳情頁上, 如職位名, 薪資, 公司名等等.

分析思路

分析查詢結果頁

在拉勾網搜索框中搜索’python’關鍵字, 在瀏覽器地址欄可以看到搜索結果頁的url為: ’https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=’, 嘗試將?后的參數刪除, 發現訪問結果相同.

打開Chrome網頁調試工具(F12), 分析每條搜索結果(即每個職位)在html中所處的元素定位, 發現每條結果都在<ul class='item_con_list'>下的li標簽中.

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

因為我們需要每個職位的具體信息, 因此需要獲取到每條搜索結果的詳情url, 即點擊搜索結果后進入的詳情頁的url.

繼續查看li標簽中的元素, 找到想要的詳情url, 找到后的url為: href=https://www.lagou.com/jobs/6945237.html?show=b6e8e778fcae4c2aa2111ba58f9ebfa0

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

查看其它搜索結果的詳情url, 發現其格式都為: rel='external nofollow'

對于第一個ID, 每條結果的id都不一樣, 猜想其為標記每個職位的唯一id, 對于show_id, 每條結果的id都是一樣的, 嘗試刪除show參數, 發現一樣可以訪問到具體結果詳情頁

那么我們直接通過xpath提取到每個職位的第一個ID即可, 但是調試工具的elements標簽下的html是最終網頁展示的html, 并不一定就是我們訪問 https://www.lagou.com/jobs/list_python 返回的response的html, 因此點到Network標簽, 重新刷新一下頁面, 找到 https://www.lagou.com/jobs/list_python 對應的請求, 查看其對應的response, 搜索 ’position_link’(即前面我們在elements中找到的每條搜索結果的詳情url), 發現確實返回了一個網址, 但是其重要的兩個ID并不是直接放回的, 而是通過js生成的, 說明我們想要的具體數據并不是這個這個請求返回的.

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

那么我們就需要找到具體是那個請求會返回搜索結果的信息, 一般這種情況首先考慮是不是通過ajax獲取的數據, 篩選類型為XHR(ajax)的請求, 可以逐個點開查看response, 發現 positionAjax.json 返回的數據中就存在我們想要的每條搜索結果的信息. 說明確實是通過ajax獲取的數據, 其實點擊下一頁, 我們也可以發現地址欄url地址并沒有發生變化, 只是局部刷新了搜索結果的數據, 也說明了搜索結果是通過ajax返回的.

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

分析上面ajax的response, 查看其中是否有我們想要的職位ID, 在preview中搜索之前在elements中找到的某個職位的url的兩個ID, 確實兩個ID都存在response中, 分析發現第一個ID即為positionId, 第二個即為showId, 我們還可以發現response中返回了當前的頁碼數pageNo

因此我們只需要訪問上面ajax對應的url: https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false 就可以拿到我們想要的ID, 然后填入詳情url模板: https://www.lagou.com/jobs/{position_id}.html?show={show_id}中即可訪問詳情頁了.

但是當我們直接訪問 https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false 時 ,返回的結果卻是: {'status':false,'msg':'您操作太頻繁,請稍后再訪問','clientIp':'139.226.66.44','state':2402}

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

經過百度查詢后發現原來直接訪問上述地址是不行的, 這也是拉鉤的一個反爬策略, 需要我們帶上之前訪問查詢結果頁(https://www.lagou.com/jobs/list_python?)的cookie才行, 因為我們這里使用的是scrapy框架, 該框架是能夠自帶上次請求的cookie來訪問下一個請求的, 所以我們這里不需要手動去添加cookie信息, 只需要首先訪問一下查詢結果頁就可以了. 即start_url = https://www.lagou.com/jobs/list_python

此外發現這個ajax請求是通過POST方式發送的, 因此還需要分析它提交的form數據, 在第一頁中有三條數據信息, first為true, pn為1 kd為python , 第二頁中first為false, pn為2, kd同樣為python, 且多了一個sid

分析這四個參數, 第一個first為表示是否是第一頁, 第二個pn為表示當前頁碼數, 第三個kd為表示搜索的關鍵字, 第四個sid經過和上面showId對比發現其值就為showId

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

分析職位詳情頁

前面分析完后就可以拼接出職位詳情頁url了, 點開詳情頁, 同樣的思路分析我們想要的數據是不是就在詳情頁的url中, 這里想要職位名稱, 工資, 地點, 經驗, 關鍵字, 公司信息等

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

在network中查找對應的response, 發現數據確實就存在response中, 因此直接通過xpath就可以提取想要的數據了

編寫爬蟲代碼

具體代碼在github:

這里只放出關鍵代碼

創建scrapy項目

scrapy startproject LaGou

創建爬蟲

scrapy genspider lagou www.lagou.com

編寫items.py, 設置要想爬取的字段

# -*- coding: utf-8 -*-# Define here the models for your scraped items## See documentation in:# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass LagouItem(scrapy.Item): # define the fields for your item here like: job_url = scrapy.Field() job_name = scrapy.Field() salary = scrapy.Field() city = scrapy.Field() area = scrapy.Field() experience = scrapy.Field() education = scrapy.Field() labels = scrapy.Field() publish_date = scrapy.Field() company = scrapy.Field() company_feature = scrapy.Field() company_public = scrapy.Field() company_size= scrapy.Field()

編寫爬蟲代碼 lagou.py

# -*- coding: utf-8 -*-import scrapyfrom LaGou.items import LagouItemimport jsonfrom pprint import pprintimport timeclass LagouSpider(scrapy.Spider): name = ’lagou’ allowed_domains = [’www.lagou.com’] start_urls = [’https://www.lagou.com/jobs/list_python?’] def __init__(self): # 設置頭信息, 若不設置的話, 在請求第二頁時即被拉勾網認為是爬蟲而不能爬取數據 self.headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Connection': 'keep-alive', 'Host': 'www.lagou.com', 'Referer': ’https://www.lagou.com/jobs/list_Python?’, 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'referer': 'https://www.lagou.com/jobs/list_python?' } self.sid = ’’ self.job_url_temp = ’https://www.lagou.com/jobs/{}.html?show={}’ # 清空文件 with open(’jobs.json’, ’w’) as f: f.truncate() def parse(self, response): ''' 解析起始頁 ''' # response為GET請求的起始頁, 自動獲取cookie # 提交POST帶上前面返回的cookies, 訪問數據結果第一頁 yield scrapy.FormRequest( ’https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false’, callback=self.parse_list, formdata={'first': 'false', 'pn': '1', 'kd': 'python', }, headers=self.headers ) def parse_list(self, response): ''' 解析結果列表頁的json數據 ''' # 獲取返回的json,轉為字典 res_dict = json.loads(response.text) # 判斷返回是否成功 if not res_dict.get(’success’): print(res_dict.get(’msg’, ’返回異常’)) else: # 獲取當前頁數 page_num = res_dict[’content’][’pageNo’] print(’正在爬取第{}頁’.format(page_num)) # 獲取sid if not self.sid: self.sid = res_dict[’content’][’showId’] # 獲取響應中的職位url字典 part_url_dict = res_dict[’content’][’hrInfoMap’] # 遍歷職位字典 for key in part_url_dict: # 初始化保存職位的item item = LagouItem() # 拼接完整職位url item[’job_url’] = self.job_url_temp.format(key, self.sid) # 請求職位詳情頁 yield scrapy.Request( item[’job_url’], callback=self.parse_detail, headers=self.headers, meta={’item’: item} ) # 獲取下一頁 if page_num < 30: # time.sleep(2) yield scrapy.FormRequest( ’https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false’, callback=self.parse_list, formdata={'first': 'false','pn': str(page_num+1),'kd': 'python','sid': self.sid}, headers=self.headers ) def parse_detail(self, response): ''' 解析職位詳情頁 ''' # 接收item item = response.meta[’item’] # 解析數據 # 獲取職位頭div job_div = response.xpath(’//div[@class='position-content-l']’) if job_div: item[’job_name’] = job_div.xpath(’./div/h1/text()’).extract_first() item[’salary’] = job_div.xpath(’./dd/h3/span[1]/text()’).extract_first().strip() item[’city’] = job_div.xpath(’./dd/h3/span[2]/text()’).extract_first().strip(’/’).strip() item[’area’] = response.xpath(’//div[@class='work_addr']/a[2]/text()’).extract_first() item[’experience’] = job_div.xpath(’./dd/h3/span[3]/text()’).extract_first().strip(’/’).strip() item[’education’] = job_div.xpath(’./dd/h3/span[4]/text()’).extract_first().strip(’/’).strip() item[’labels’] = response.xpath(’//ul[@class='position-label clearfix']/li/text()’).extract() item[’publish_date’] = response.xpath(’//p[@class='publish_time']/text()’).extract_first() item[’publish_date’] = item[’publish_date’].split(’&’)[0] # 獲取公司dl company_div = response.xpath(’//dl[@class='job_company']’) item[’company’] = company_div.xpath(’./dt/a/img/@alt’).extract_first() item[’company_feature’] = company_div.xpath(’./dd//li[1]/h4[@class='c_feature_name']/text()’).extract_first() item[’company_feature’] = item[’company_feature’].split(’,’) item[’company_public’] = company_div.xpath(’./dd//li[2]/h4[@class='c_feature_name']/text()’).extract_first() item[’company_size’] = company_div.xpath(’./dd//li[4]/h4[@class='c_feature_name']/text()’).extract_first() yield item

編寫middlewares.py, 自定義downloadermiddleware, 用來每次發送請求前, 隨機設置user-agent, 這里使用了第三方庫 fake_useragent, 能夠隨機提供user-agent, 使用前先安裝: pip install fake_useragent

from fake_useragent import UserAgentimport randomclass RandomUserAgentDM: ''' 隨機獲取userAgent ''' def __init__(self): self.user_agent = UserAgent() def process_request(self, request, spider): request.headers[’User-Agent’] = self.user_agent.random

編寫pipelines.py, 將數據存為json文件

import jsonclass LagouPipeline: def process_item(self, item, spider): with open(’jobs.json’, ’a’, encoding=’utf-8’) as f: item_json = json.dumps(dict(item), ensure_ascii=False, indent=2) f.write(item_json) f.write(’n’)

編寫settings.py

# 設置日志顯示LOG_LEVEL = ’WARNING’# 設置ROBOTSTXT協議, 若為true則不能爬取數據ROBOTSTXT_OBEY = False# 設置下載器延遲, 反爬蟲的一種策略DOWNLOAD_DELAY = 0.25# 開啟DOWNLOADER_MIDDLEWARESDOWNLOADER_MIDDLEWARES = { # ’LaGou.middlewares.LagouDownloaderMiddleware’: 543, ’LaGou.middlewares.RandomUserAgentDM’ :100,}# 開啟ITEM_PIPELINESITEM_PIPELINES = { ’LaGou.pipelines.LagouPipeline’: 300,}

啟動爬蟲

scrapy crawl lagou

發現依然只能5 6頁, 說明拉勾網的反爬確實做得比較好, 還可以繼續通過使用代理來進行反反爬, 這里就不再演示了,

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

查看爬取結果

Python爬蟲實例——scrapy框架爬取拉勾網招聘信息

以上就是Python爬蟲實例——scrapy框架爬取拉勾網招聘信息的詳細內容,更多關于Python爬蟲爬取招聘信息的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 电动液压篮球架_圆管地埋式篮球架_移动平箱篮球架-强森体育 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 最新电影-好看的电视剧大全-朝夕电影网 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 贵州成人高考网_贵州成考网| 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | 电动高尔夫球车|电动观光车|电动巡逻车|电动越野车厂家-绿友机械集团股份有限公司 | 沈阳缠绕包装机厂家直销-沈阳海鹞托盘缠绕包装机价格 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 除甲醛公司-甲醛检测治理-杭州创绿家环保科技有限公司-室内空气净化十大品牌 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | 千淘酒店差旅平台-中国第一家针对TMC行业的酒店资源供应平台 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 对辊破碎机-液压双辊式,强力双齿辊,四辊破碎机价格_巩义市金联机械设备生产厂家 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 家乐事净水器官网-净水器厂家「官方」 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 顺辉瓷砖-大国品牌-中国顺辉 | 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 |