日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:220日期: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 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩av免费| 综合一区av| 日韩福利视频一区| sm捆绑调教国产免费网站在线观看| 蜜臀a∨国产成人精品| 日韩欧美一区二区三区免费观看| 你懂的网址国产 欧美| 蜜桃一区二区三区在线| 亚洲福利一区| 久久麻豆精品| 99精品视频精品精品视频| 高清av一区| 福利在线一区| 国内精品亚洲| 精品午夜久久| 欧美亚洲色图校园春色| 亚洲日本欧美| 亚洲综合婷婷| 亚洲精品在线二区| 亚洲精品影视| 亚洲深深色噜噜狠狠爱网站 | 国产精品亚洲人成在99www| 亚洲一区av| 亚洲精品动态| 日韩国产在线观看一区| 欧美欧美黄在线二区| 国产精品一区二区三区www| 国产精品探花在线观看| 国产欧美精品| 国产情侣久久| 精品一区二区三区免费看| 高潮久久久久久久久久久久久久| 国产午夜精品一区在线观看| 国产精品久久国产愉拍| 老牛国内精品亚洲成av人片 | 伊人精品一区| 好看的亚洲午夜视频在线| 不卡福利视频| 福利片在线一区二区| 成人片免费看| 欧美成人日韩| 亚洲区国产区| 国产精品视频一区二区三区| 精品亚洲a∨| 日韩不卡在线| 久久精品高清| 免费欧美日韩| 97久久亚洲| 精品国产乱码| 日韩欧美另类一区二区| 新版的欧美在线视频| 伊人影院久久| 日韩综合一区二区三区| 国产欧美综合一区二区三区| 国产一区精品福利| jiujiure精品视频播放| 蜜臀精品一区二区三区在线观看| 91精品视频一区二区| 精品国产三区在线| 一本色道精品久久一区二区三区| 亚洲毛片视频| 国产伦精品一区二区三区千人斩 | 国产丝袜一区| 成人国产精品久久| 午夜国产精品视频免费体验区| 亚洲一区二区小说| 国产精品极品| 美女毛片一区二区三区四区| 亚洲最新av| 国产精品成久久久久| 夜夜精品视频| 国产精品igao视频网网址不卡日韩| 国产成人精品一区二区三区视频| 国产精品97| 久久狠狠久久| 亚洲午夜久久久久久尤物| 青青草国产精品亚洲专区无| 韩国精品主播一区二区在线观看 | 国产va在线视频| 在线视频日韩| 成人亚洲精品| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品v日韩精品v欧美精品网站| 99热精品久久| 亚洲乱亚洲高清| 国产精品专区免费| 日本精品久久| 国产一区观看| 久久av超碰| 老鸭窝毛片一区二区三区| 激情综合婷婷| 在线观看视频免费一区二区三区| 国产专区精品| 亚洲精品美女| 成人看片网站| 88久久精品| 日本精品影院| 欧美精品91| 亚洲色图国产| 中文字幕高清在线播放| 日韩国产91| 悠悠资源网久久精品| 国产 日韩 欧美 综合 一区| 婷婷亚洲精品| 午夜欧美精品| 成人一区不卡| 国产精品大片免费观看| 在线精品福利| 一区二区三区四区日本视频| 综合在线一区| 亚洲女同一区| 三级小说欧洲区亚洲区| 国产日韩中文在线中文字幕 | 狂野欧美性猛交xxxx| 蜜桃91丨九色丨蝌蚪91桃色| 成人一区而且| 久久不见久久见免费视频7| 蜜桃视频第一区免费观看| 999久久久精品国产| 精品国产a一区二区三区v免费| 日本不卡视频在线观看| 三级在线观看一区二区 | 亚洲精品护士| 视频在线不卡免费观看| 天堂久久一区| 视频在线观看一区二区三区| 免费久久精品| 精品日韩视频| 成人欧美一区二区三区的电影| 国产精品igao视频网网址不卡日韩| 日韩中文av| 国产农村妇女精品一二区| 在线日韩电影| 欧美午夜精品一区二区三区电影| 国产精品精品| 国产精品视频一区视频二区| 三级欧美韩日大片在线看| 激情综合网站| 美女一区网站| 国产超碰精品| 久久精品国内一区二区三区水蜜桃| 中文在线中文资源| 欧美激情另类| 日韩av免费大片| 国产不卡精品在线| 国产欧美69| 国产极品久久久久久久久波多结野| 奇米狠狠一区二区三区| 久久激五月天综合精品| 日本vs亚洲vs韩国一区三区二区| 亚洲精品高潮| 日韩在线黄色| 亚洲另类黄色| 久久午夜视频| 日韩欧美四区| 国产精品主播| 国产一区国产二区国产三区| www在线观看黄色| 91成人精品| 日韩av网站在线观看| 成人在线视频中文字幕| 亚洲精品中文字幕乱码| 日产欧产美韩系列久久99| 久久久精品区| 自由日本语亚洲人高潮| 欧美视频一区| 成人精品亚洲| 日韩国产一二三区| 国产一区二区三区四区大秀| 亚洲经典在线| 久久免费视频66| 免费日韩精品中文字幕视频在线| 国产丝袜一区| re久久精品视频| 国产精品自在| 亚洲视频综合| 国产精品超碰| 国产精品美女久久久| 国产精品magnet| 偷拍欧美精品| 久久久国产精品网站| 午夜在线视频观看日韩17c| 麻豆精品视频在线观看| 亚洲成人精选| 久久gogo国模啪啪裸体| 亚洲一区二区三区高清| 国产成人免费av一区二区午夜| 亚洲一区二区三区免费在线观看| 久久精品国产免费| 热久久国产精品| 亚洲一级少妇| 日本久久一区| 国产真实久久| 国产午夜精品一区在线观看| 激情丁香综合| 精品日韩一区| 日韩不卡一二三区| 国产韩日影视精品| 久久麻豆视频| 日本综合视频|