<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>104人力銀行 on IT 空間</title><link>https://blog.jiatool.com/tags/104%E4%BA%BA%E5%8A%9B%E9%8A%80%E8%A1%8C/</link><description>Recent content in 104人力銀行 on IT 空間</description><generator>Hugo -- gohugo.io</generator><language>zh</language><managingEditor>jia@jiatool.com (Jia)</managingEditor><webMaster>jia@jiatool.com (Jia)</webMaster><copyright>&amp;copy;{year}, Jia All Rights Reserved</copyright><lastBuildDate>Sat, 07 Aug 2021 20:30:00 +0800</lastBuildDate><atom:link href="https://blog.jiatool.com/tags/104%E4%BA%BA%E5%8A%9B%E9%8A%80%E8%A1%8C/index.xml" rel="self" type="application/rss+xml"/><item><title>[Python爬蟲實例] 104人力銀行：抓取更詳細的職缺資訊，搶先別人一步收到通知！</title><link>https://blog.jiatool.com/posts/job104_spider/</link><pubDate>Sat, 07 Aug 2021 20:30:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Wed, 08 Dec 2021 20:40:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/job104_spider/</guid><description>前言 最近這兩年受到疫情的衝擊，不少人遭到公司裁員，接下來可能就該思考尋找下份工作了。 台灣老字號、最大的人力銀行—104人力銀行 ，我們來看看其</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>最近這兩年受到疫情的衝擊，不少人遭到公司裁員，接下來可能就該思考尋找下份工作了。&lt;/p>
&lt;p>台灣老字號、最大的人力銀行—&lt;a href="https://www.104.com.tw/" target="_blank" rel="noopener">
104人力銀行
&lt;/a>，我們來看看其網頁是如何向後端請求職缺資料，實際用 Python 來在 104 上搜尋職缺、查看職缺詳細資料。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/plan.jpg" alt="來源：Unsplash" data-caption="來源：Unsplash" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
來源：Unsplash
&lt;/figcaption>
&lt;/figure>
&lt;p>備註：此文僅教育學習，切勿用作商業用途，個人實作皆屬個人行為，本作者不負任何法律責任。&lt;/p>
&lt;h2 id="套件">套件&lt;/h2>
&lt;p>此次 Python 爬蟲主要使用到的套件：&lt;/p>
&lt;ul>
&lt;li>Requests [&lt;a href="https://requests.readthedocs.io/en/master/" target="_blank" rel="noopener">
Doc
&lt;/a>] [&lt;a href="https://github.com/psf/requests" target="_blank" rel="noopener">
GitHub
&lt;/a>]&lt;/li>
&lt;/ul>
&lt;p>安裝&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Shell" data-lang="Shell">pip install requests
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;!--adsense-->
&lt;h2 id="搜尋職缺">搜尋職缺&lt;/h2>
&lt;p>當在104人力銀行網頁上方，輸入職缺的篩選條件後搜尋，下方會顯示出搜尋結果，中間也有許多篩選條件、排序方式供我們使用。&lt;/p>
&lt;p>我們來找找&amp;quot;python&amp;quot;在&amp;quot;台北市&amp;quot;內現在有哪些職缺吧~&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/search.jpg" alt="搜尋職缺 104人力銀行" data-caption="搜尋職缺 104人力銀行" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='900px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:900px;height:;"/>
&lt;figcaption style="text-align: center;">
搜尋職缺 104人力銀行
&lt;/figcaption>
&lt;/figure>
&lt;h3 id="請求路徑與參數">請求路徑與參數&lt;/h3>
&lt;p>跟以前的步驟一樣，一開始先打開瀏覽器的 &lt;strong>開發人員工具&lt;/strong> (F12 或 Ctrl + Shift + i) &amp;gt; &lt;strong>Network&lt;/strong>(網路) &amp;gt; &lt;strong>XHR&lt;/strong> 分頁，找找網頁有沒有透過動態載入的方式請求職缺資料。&lt;/p>
&lt;p>此時重新整理(F5)網頁，好像沒看見有關職缺資料的請求。&lt;br />
先別放棄，可以往下滾頁面或更改篩選條件，有了！發現到一個 list 開頭的請求，包含著職缺相關資料。&lt;/p>
&lt;p>* 一開始點搜尋、網頁第一次載入卻沒有職缺的請求，應該是因為它已經崁入在網頁內一起傳送過來顯示了。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/search_xhr.jpg" alt="搜尋職缺請求 104人力銀行" data-caption="搜尋職缺請求 104人力銀行" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='900px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:900px;height:;"/>
&lt;figcaption style="text-align: center;">
搜尋職缺請求 104人力銀行
&lt;/figcaption>
&lt;/figure>
&lt;p>切回到 &lt;strong>Headers&lt;/strong> 查看請求的方式與參數。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/search_request.png" alt="&amp;#34;搜尋職缺&amp;#34;請求的方式與參數" data-caption="&amp;#34;搜尋職缺&amp;#34;請求的方式與參數" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='900px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:900px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;搜尋職缺&amp;#34;請求的方式與參數
&lt;/figcaption>
&lt;/figure>
&lt;p>並且在用程式測試此請求時，發現還要帶上 Headers 內的 &lt;code>Referer&lt;/code> 參數，才可正常取得資料。&lt;/p>
&lt;p>將其整理出來，相關參數如下：&lt;br />
&lt;div class="box">&lt;p>Request URL：&lt;code>https://www.104.com.tw/jobs/search/list&lt;/code>&lt;br />
Request Methon：&lt;code>GET&lt;/code>&lt;br />
Headers Referer：&lt;code>https://www.104.com.tw/jobs/search/&lt;/code>&lt;/p>
&lt;p>Query String Parameters：&lt;/p>
&lt;pre>&lt;code>ro: 0
kwop: 7
keyword: python
expansionType: area,spec,com,job,wf,wktm
area: 6001001000
order: 1
asc: 0
page: 1
mode: s
jobsource: 2018indexpoc
&lt;/code>&lt;/pre>&lt;/div>&lt;/p>
&lt;br/>
&lt;p>請求網址後方代的參數有很多，代表我們對職缺的篩選條件與排序條件，經過我的實測整理出以下。&lt;/p>
&lt;h4 id="篩選條件">篩選條件&lt;/h4>
&lt;p>某些條件可以多選(使用 &lt;code>,&lt;/code> 連接)，某些條件只能單選。&lt;br />
例如我要查詢&amp;quot;台北市&amp;quot;與&amp;quot;新北市&amp;quot;的職缺，就需要帶上 &lt;code>area=6001001000,6001002000&lt;/code>。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>頁數 &lt;code>page&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>關鍵字 &lt;code>keyword&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>地區 &lt;code>area&lt;/code>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>地區&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>台北市&lt;/td>
&lt;td>6001001000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>新北市&lt;/td>
&lt;td>6001002000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>桃園市&lt;/td>
&lt;td>6001005000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>台中市&lt;/td>
&lt;td>6001008000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>彰化縣&lt;/td>
&lt;td>6001010000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>台南市&lt;/td>
&lt;td>6001014000&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>高雄市&lt;/td>
&lt;td>6001016000&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>上班時段 &lt;code>s9&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>上班時段&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>日班&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>夜班&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>大夜班&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>假日班&lt;/td>
&lt;td>8&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>是否輪班 &lt;code>s5&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>是否輪班&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>不需輪班&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>輪班&lt;/td>
&lt;td>256&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>休假制度 &lt;code>wktm&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>休假制度&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>沒有週休二日&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>週休二日&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>更新日期 &lt;code>isnew&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>更新日期&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>本日最新&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>三日內&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>一週內&lt;/td>
&lt;td>7&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>兩週內&lt;/td>
&lt;td>14&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>一個月內&lt;/td>
&lt;td>30&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>經歷要求 &lt;code>jobexp&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>經歷要求&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1 年以下&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>1-3 年&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3-5 年&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5-10 年&lt;/td>
&lt;td>10&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10 年以上&lt;/td>
&lt;td>99&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>科技園區 &lt;code>newZone&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>科技園區&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>竹科&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>中科&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>南科&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>內湖&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>南港&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>公司類型 &lt;code>zone&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>公司類型&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>上市上櫃&lt;/td>
&lt;td>16&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>外商一般&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>外商資訊&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>福利制度 &lt;code>wf&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>福利制度&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>年終獎金&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>三節獎金&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>員工旅遊&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>分紅配股&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>設施福利&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>休假福利&lt;/td>
&lt;td>6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>津貼/補助&lt;/td>
&lt;td>7&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>彈性上下班&lt;/td>
&lt;td>8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>健康檢查&lt;/td>
&lt;td>9&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>團體保險&lt;/td>
&lt;td>10&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>學歷要求 &lt;code>edu&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>學歷要求&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>高中職以下&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>高中職&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>專科&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>大學&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>碩士&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>博士&lt;/td>
&lt;td>6&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>上班型態 &lt;code>remoteWork&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>上班型態&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>完全遠端&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>部分遠端&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>
&lt;p>排除關鍵字 &lt;code>excludeJobKeyword&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>只搜尋職務名稱 &lt;code>kwop&lt;/code>&lt;/p>
&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>只搜尋職務名稱&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>只搜尋職務名稱&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;br/>
&lt;h4 id="排序條件">排序條件&lt;/h4>
&lt;ul>
&lt;li>排序依據 &lt;code>order&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>排序依據&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>符合度&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>日期&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>經歷&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>學歷&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>應徵人數&lt;/td>
&lt;td>7&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>待遇&lt;/td>
&lt;td>13&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ul>
&lt;li>排序順序 &lt;code>asc&lt;/code>&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>排序順序&lt;/th>
&lt;th>數值&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>由大到小&lt;/td>
&lt;td>0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>由小到大&lt;/td>
&lt;td>1&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="回傳資料">回傳資料&lt;/h3>
&lt;p>切換到此請求的 &lt;strong>Preview&lt;/strong> 分頁，能讓我們方便的檢視回傳資料，了解它的資料結構。&lt;br />
資料為 JSON 格式(原始資料可至 &lt;strong>Response&lt;/strong> 分頁查看)。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/search_preview.png" alt="&amp;#34;搜尋職缺&amp;#34;請求的回傳資料" data-caption="&amp;#34;搜尋職缺&amp;#34;請求的回傳資料" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='800px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:800px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;搜尋職缺&amp;#34;請求的回傳資料
&lt;/figcaption>
&lt;/figure>
&lt;p>依照我觀察到的推測，來說明個欄位所代表的數值意思：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;code>status&lt;/code>、&lt;code>statusMsg&lt;/code>、&lt;code>errorMsg&lt;/code>：請求狀態與訊息。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>pageNo&lt;/code>：頁數。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>data &amp;gt; count&lt;/code>：各種類的職缺數量，如下圖藍框圈選內顯示數量。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/result_count.png" alt="各種類的職缺數量" data-caption="各種類的職缺數量" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
各種類的職缺數量
&lt;/figcaption>
&lt;/figure>
&lt;/li>
&lt;li>
&lt;p>&lt;code>data &amp;gt; totalCount&lt;/code>：搜尋結果的職缺&amp;quot;總數&amp;quot;。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>data &amp;gt; totalPage&lt;/code>：搜尋結果的職缺&amp;quot;總頁數&amp;quot;。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>data &amp;gt; list&lt;/code>：搜尋職缺結果，包含各職缺名稱、簡介、公司等等資訊，通常一次最多 20 筆資料。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>data &amp;gt; query&lt;/code>：搜尋職缺的 query 參數，也就是我們送出請求所夾帶的篩選條件，像是地區、經歷要求、上班時段。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>data &amp;gt; queryDesc&lt;/code>：搜尋職缺的 query 參數所代表的意思。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;br/>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">&amp;quot;搜尋職缺&amp;quot;回覆資料範例：&lt;a href="https://github.com/it-jia/job104_spider/blob/main/104_search.json">104_search.json&lt;/a>&lt;/div>
&lt;p>* 其中得到的資料，有些還要進一步轉換或挑選，因此我們還可以再寫個函式來執行此步驟，可參考&amp;quot;&lt;a href="#%e5%ae%8c%e6%95%b4%e7%a8%8b%e5%bc%8f%e7%a2%bc" target="_blank" rel="noopener">
完整程式碼
&lt;/a>&amp;quot;。&lt;/p>
&lt;h3 id="範例程式">範例程式&lt;/h3>
&lt;p>使用 Python 搭配 requests 套件的寫法如下，：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">random&lt;/span>
&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;span class="k">def&lt;/span> &lt;span class="nf">search_job&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">keyword&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_mun&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filter_params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="bp">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">sort_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;符合度&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">is_sort_asc&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="bp">False&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;搜尋職缺&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;span class="n">jobs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;span class="n">total_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://www.104.com.tw/jobs/search/list&amp;#39;&lt;/span>
&lt;span class="n">query&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;ro=0&amp;amp;kwop=7&amp;amp;keyword={keyword}&amp;amp;expansionType=area,spec,com,job,wf,wktm&amp;amp;mode=s&amp;amp;jobsource=2018indexpoc&amp;#39;&lt;/span>
&lt;span class="k">if&lt;/span> &lt;span class="n">filter_params&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="c1"># 加上篩選參數，要先轉換為 URL 參數字串格式&lt;/span>
&lt;span class="n">query&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;&amp;amp;{key}={value}&amp;#39;&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">filter_params&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">items&lt;/span>&lt;span class="p">()])&lt;/span>
&lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s1">&amp;#39;User-Agent&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s1">&amp;#39;Referer&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;https://www.104.com.tw/jobs/search/&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="c1"># 加上排序條件&lt;/span>
&lt;span class="n">sort_dict&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s1">&amp;#39;符合度&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s1">&amp;#39;日期&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;2&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s1">&amp;#39;經歷&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s1">&amp;#39;學歷&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;4&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s1">&amp;#39;應徵人數&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;7&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s1">&amp;#39;待遇&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;13&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="n">sort_params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="s2">&amp;#34;&amp;amp;order={sort_dict.get(sort_type, &amp;#39;1&amp;#39;)}&amp;#34;&lt;/span>
&lt;span class="n">sort_params&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="s1">&amp;#39;&amp;amp;asc=1&amp;#39;&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">is_sort_asc&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="s1">&amp;#39;&amp;amp;asc=0&amp;#39;&lt;/span>
&lt;span class="n">query&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">sort_params&lt;/span>
&lt;span class="n">page&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;span class="k">while&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">jobs&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">max_mun&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="n">params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;{query}&amp;amp;page={page}&amp;#39;&lt;/span>
&lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">if&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">codes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ok&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;請求失敗&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;status&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;statusMsg&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;errorMsg&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="k">break&lt;/span>
&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">total_count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;data&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;totalCount&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="n">jobs&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">extend&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;data&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;list&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">page&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;data&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;totalPage&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="ow">or&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;data&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="s1">&amp;#39;totalPage&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="k">break&lt;/span>
&lt;span class="n">page&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">uniform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="k">return&lt;/span> &lt;span class="n">total_count&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">jobs&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="n">max_mun&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="n">filter_params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s1">&amp;#39;area&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;6001001000&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># (地區) 台北市&lt;/span>
&lt;span class="s1">&amp;#39;s9&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># (上班時段) 日班&lt;/span>
&lt;span class="s1">&amp;#39;isnew&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># (更新日期) 本日最新&lt;/span>
&lt;span class="s1">&amp;#39;jobexp&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;1,3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># (經歷要求) 1年以下,1-3年&lt;/span>
&lt;span class="s1">&amp;#39;zone&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;16&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># (公司類型) 上市上櫃&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="n">total_count&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">jobs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">search_job&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;python&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_mun&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">filter_params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">filter_params&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;搜尋結果職缺總數：&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">total_count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;br/>
&lt;h2 id="取得職缺詳細資料">取得職缺詳細資料&lt;/h2>
&lt;p>透過上一步&amp;quot;搜尋職缺&amp;quot;所得到的職缺資料還不太完整，接下來我們來尋找取得職缺詳細資料的辦法。&lt;/p>
&lt;p>這邊以&lt;a href="https://www.104.com.tw/job/71gqf" target="_blank" rel="noopener">
此職缺
&lt;/a>為範例說明。&lt;/p>
&lt;h3 id="請求路徑與參數-1">請求路徑與參數&lt;/h3>
&lt;p>如果你點進職缺介紹網頁後，在 &lt;strong>開發人員工具&lt;/strong> (F12 或 Ctrl + Shift + i) &amp;gt; &lt;strong>Network&lt;/strong>(網路) &amp;gt; &lt;strong>XHR&lt;/strong> 分頁，會發現它也是動態載入的方式請求。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/job_request.png" alt="&amp;#34;取得職缺詳細資料&amp;#34;請求的方式與參數" data-caption="&amp;#34;取得職缺詳細資料&amp;#34;請求的方式與參數" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='900px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:900px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;取得職缺詳細資料&amp;#34;請求的方式與參數
&lt;/figcaption>
&lt;/figure>
&lt;p>後方的 &lt;code>71gqf&lt;/code> 代表此職缺的 ID。&lt;/p>
&lt;p>還有請求一樣需要帶上 Headers 內的 &lt;code>Referer&lt;/code> 參數，才可正常取得資料。&lt;/p>
&lt;p>將其整理出來，相關參數如下：&lt;br />
&lt;div class="box">Request URL：&lt;code>https://www.104.com.tw/job/ajax/content/71gqf&lt;/code>&lt;br />
Request Methon：&lt;code>GET&lt;/code>&lt;br />
Headers Referer：&lt;code>https://www.104.com.tw/job/71gqf&lt;/code>&lt;/div>&lt;/p>
&lt;h3 id="回傳資料-1">回傳資料&lt;/h3>
&lt;p>切換到此請求的 &lt;strong>Preview&lt;/strong> 分頁，能讓我們方便的檢視回傳資料，了解它的資料結構。&lt;br />
資料為 JSON 格式(原始資料可至 &lt;strong>Response&lt;/strong> 分頁查看)。&lt;/p>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/job_preview.png" alt="&amp;#34;取得職缺詳細資料&amp;#34;請求的回傳資料" data-caption="&amp;#34;取得職缺詳細資料&amp;#34;請求的回傳資料" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='800px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:800px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;取得職缺詳細資料&amp;#34;請求的回傳資料
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;br/>
&lt;p>依照我觀察到的推測，來說明個欄位所代表的數值意思，在 &lt;code>data&lt;/code> 底下：&lt;/p>
&lt;ul>
&lt;li>&lt;code>header&lt;/code>：&lt;strong>標題&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/header_web.jpg" alt="&amp;#34;標題&amp;#34;網頁區塊" data-caption="&amp;#34;標題&amp;#34;網頁區塊" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='400px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:400px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;標題&amp;#34;網頁區塊
&lt;/figcaption>
&lt;/figure>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/header_json.png" alt="&amp;#34;標題&amp;#34;JSON" data-caption="&amp;#34;標題&amp;#34;JSON" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;標題&amp;#34;JSON
&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>&lt;code>jobDetail&lt;/code>：&lt;strong>工作內容&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/jobDetail_web.jpg" alt="&amp;#34;工作內容&amp;#34;網頁區塊" data-caption="&amp;#34;工作內容&amp;#34;網頁區塊" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='450px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:450px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;工作內容&amp;#34;網頁區塊
&lt;/figcaption>
&lt;/figure>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/jobDetail_json.png" alt="&amp;#34;工作內容&amp;#34;JSON" data-caption="&amp;#34;工作內容&amp;#34;JSON" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;工作內容&amp;#34;JSON
&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>&lt;code>condition&lt;/code>：&lt;strong>條件要求&lt;/strong>，例如工作經歷、學歷要求、語文條件、擅長工具、工作技能等等。&lt;/li>
&lt;/ul>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/condition_web.jpg" alt="&amp;#34;條件要求&amp;#34;網頁區塊" data-caption="&amp;#34;條件要求&amp;#34;網頁區塊" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='450px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:450px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;條件要求&amp;#34;網頁區塊
&lt;/figcaption>
&lt;/figure>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/condition_json.png" alt="&amp;#34;條件要求&amp;#34;JSON" data-caption="&amp;#34;條件要求&amp;#34;JSON" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;條件要求&amp;#34;JSON
&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>&lt;code>environmentPic&lt;/code>：&lt;strong>公司環境照片&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/environmentPic_web.jpg" alt="&amp;#34;公司環境照片&amp;#34;網頁區塊" data-caption="&amp;#34;公司環境照片&amp;#34;網頁區塊" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='400px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:400px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;公司環境照片&amp;#34;網頁區塊
&lt;/figcaption>
&lt;/figure>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/environmentPic_json.png" alt="&amp;#34;公司環境照片&amp;#34;JSON" data-caption="&amp;#34;公司環境照片&amp;#34;JSON" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='550px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:550px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;公司環境照片&amp;#34;JSON
&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>&lt;code>welfare&lt;/code>：&lt;strong>福利制度&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/welfare_web.jpg" alt="&amp;#34;福利制度&amp;#34;網頁區塊" data-caption="&amp;#34;福利制度&amp;#34;網頁區塊" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='450px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:450px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;福利制度&amp;#34;網頁區塊
&lt;/figcaption>
&lt;/figure>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/welfare_json.png" alt="&amp;#34;福利制度&amp;#34;JSON" data-caption="&amp;#34;福利制度&amp;#34;JSON" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='550px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:550px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;福利制度&amp;#34;JSON
&lt;/figcaption>
&lt;/figure>
&lt;ul>
&lt;li>&lt;code>contact&lt;/code>：&lt;strong>聯絡方式&lt;/strong>，例如聯絡人、連絡電話等等。&lt;/li>
&lt;/ul>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/contact_web.jpg" alt="&amp;#34;聯絡方式&amp;#34;網頁區塊" data-caption="&amp;#34;聯絡方式&amp;#34;網頁區塊" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='350px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:350px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;聯絡方式&amp;#34;網頁區塊
&lt;/figcaption>
&lt;/figure>
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/job104_spider/contact_json.png" alt="&amp;#34;聯絡方式&amp;#34;JSON" data-caption="&amp;#34;聯絡方式&amp;#34;JSON" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='350px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:350px;height:;"/>
&lt;figcaption style="text-align: center;">
&amp;#34;聯絡方式&amp;#34;JSON
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">&amp;quot;取得職缺詳細資料&amp;quot;回覆資料範例：&lt;a href="https://github.com/it-jia/job104_spider/blob/main/104_job.json">104_job.json&lt;/a>&lt;/div>
&lt;h3 id="範例程式-1">範例程式&lt;/h3>
&lt;p>使用 Python 搭配 requests 套件的寫法如下，：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="kn">import&lt;/span> &lt;span class="nn">requests&lt;/span>
&lt;span class="k">def&lt;/span> &lt;span class="nf">get_job&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">job_id&lt;/span>&lt;span class="p">):&lt;/span>
&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;取得職缺詳細資料&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;https://www.104.com.tw/job/ajax/content/{job_id}&amp;#39;&lt;/span>
&lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s1">&amp;#39;User-Agent&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s1">&amp;#39;Referer&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="s1">&amp;#39;https://www.104.com.tw/job/{job_id}&amp;#39;&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">headers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">if&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">codes&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ok&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;請求失敗&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">return&lt;/span>
&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="k">return&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;data&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="n">job_info&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">get_job&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;71gqf&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">job_info&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;!--adsense-->
&lt;h2 id="完整程式碼">完整程式碼&lt;/h2>
&lt;p>我將&amp;quot;搜尋職缺&amp;quot;與&amp;quot;取得職缺詳細資料&amp;quot;包成一個 class，可以傳入不同的值來篩選，供需要的人參考。&lt;/p>
&lt;p>附上完整程式碼：&lt;a href="https://github.com/it-jia/job104_spider/blob/main/job104_spider.py" target="_blank" rel="noopener">
job104_spider.py | GitHub
&lt;/a>&lt;/p>
&lt;h2 id="其他說明">其他說明&lt;/h2>
&lt;p>&amp;quot;搜尋職缺&amp;quot;送出的請求中，我發現如果排序依據是選擇&amp;quot;符合度排序&amp;quot;，它送出的請求第一頁是 &lt;code>order: 1&lt;/code>，第二頁之後卻變成 &lt;code>order: 15&lt;/code>。&lt;br />
如果有網友知道原因，歡迎底下留言跟我說(也可到 &lt;a href="https://www.facebook.com/jiatool" target="_blank" rel="noopener">
FB粉專
&lt;/a> 留言)，我再補上說明，感謝~&lt;/p>
&lt;h2 id="延伸練習">延伸練習&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>在上方文章的&amp;quot;搜尋職缺&amp;quot;章節中，說了很多篩選參數(上班時段、經歷要求、學歷要求)，但還是有些網頁上有的篩選條件沒有說到，例如&amp;quot;薪資待遇&amp;quot;、&amp;quot;外語要求&amp;quot;，這部分你可以試著將它添加到程式內嗎？&lt;br />
(要注意的事，一個篩選條件不一定只有影響一個篩選參數)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>試著自己做個&amp;quot;自動職缺通知&amp;quot;，設定好篩選條件後，以日期排序，每天晚上就排程執行程式，如果有新的職缺，馬上透過 Line 或 Email 通知你，讓你搶先別人一步收到訊息。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>除了後續可以嘗試自製 &amp;quot;自動職缺通知&amp;quot; 以外，從回傳的資料中，還可以發現有些網頁上沒列出來的資訊呢！&lt;br />
像是顯示 &amp;quot;11~30人應徵&amp;quot;，到底準確是幾個人應徵，也可以從回傳資料中找到。&lt;/p>
&lt;br/>
&lt;p>之後會繼續陸續寫一些網站的&lt;a href="https://blog.jiatool.com/series/Python%e7%b6%b2%e8%b7%af%e7%88%ac%e8%9f%b2%e5%af%a6%e4%be%8b/" target="_blank" rel="noopener">
Python網路爬蟲實例
&lt;/a>，如果你正好是剛開始想學爬蟲的新手、想知道某網站如何爬取資料、遇到其他問題，也歡迎在底下留言，或追蹤 FB 粉專『&lt;a href="https://www.facebook.com/jiatool" target="_blank" rel="noopener">
IT空間
&lt;/a>』~ 🔔&lt;/p>
&lt;br/>
&lt;br/>
&lt;hr />
&lt;blockquote>
&lt;p>相信所有的挫折，都是最好的安排。&lt;/p>
&lt;p align="right">—— 郭婞淳 (台灣舉重國手)&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/job104_spider.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><media:content url="https://blog.jiatool.comimages/posts/job104_spider_meta.jpg" medium="image"><media:title type="html">meta image</media:title></media:content><category>Python</category><category>104人力銀行</category><category>網路爬蟲</category><category>Python網路爬蟲實例</category></item></channel></rss>