抓取智聯招聘html
1、 項目需求python
1. 爬取智聯招聘有關於「房地產銷售」關鍵字的崗位信息,包括公司名稱、招聘崗位、薪資和公司地址。(此處的關鍵字其實還能夠更靈活的設置,若是直接是房地產銷售就把程序寫死了,這個程序只能抓取房地產銷售崗位的信息,咱們能夠經過觀察分析URL地址來推理設計出更靈活的程序,好比能夠靈活的根據輸入的關鍵字和工做地點來動態生成一個URL,具體的操做後面再詳細闡述)瀏覽器
2. 使用請求庫:requestsapp
3. 使用解析庫:pyquery函數
4. 使用CSV儲存數據網站
2、 項目分析編碼
用瀏覽器打開智聯招聘官網,搜索關鍵字「房地產銷售」,獲取目標URL:url
https://sou.zhaopin.com/jobs/searchresult.ashx?jl=廣州&kw=房地產銷售&sg=11dd585aae0f4afdbcf9150b215cc8ba&p=1
spa
(注:若是圖片看不清楚請右鍵點擊圖片經過新的標籤打開)設計
這裏拿到了一個URL,其中裏面包含了咱們看不懂的參數,好比說sg參數,然而此時能夠簡單粗暴的將這個參數刪除,即直接訪問:
https://sou.zhaopin.com/jobs/searchresult.ashx?jl=廣州&kw=房地產銷售&p=1 這個URL,發現結果跟前面截圖的如出一轍,也就能夠推測,sg參數應該是給機器看的,對咱們的抓取沒有影響,也就是能夠忽略。
對於URL的其餘參數估計不正常的人都能秒懂了,jl參數表明地址,kw參數就是keyword,而p參數就是當前所在的第幾頁。完了之後接下來就是構造請求URL了:
from urllib import parse url_params = { 'jl':'廣州', 'kw':'房地產銷售', 'p':1 } url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' + parse.urlencode(url_params)
接下來就該設置請求頭了,請求頭最重要的信息其實就是 User-Agent 了,由於有些網站有反爬機制,若是咱們直接經過 requests 庫向一個URL發起請求時,此時默認的User-Agent爲python-requests/2.10.0,這樣就很容易被識別爲爬蟲於是被拒絕訪問。
from requests headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36' } requests.get(url=url,headers=headers)
然而這裏就能夠抓取到上面截圖的頁面源碼了,接下來要作的就是從源碼裏面提取咱們須要的信息,包括公司名稱、招聘崗位、薪資和公司地址。
分析發現,每條記錄都被以一個class屬性爲newlist的table標籤包裹着,可是咱們須要的信息在這裏並無徹底包含,缺乏了公司的詳細地址和工做崗位,因此抓取到這個頁面還不足以完成需求,然而再分析發現,每一個table下都有一個a元素,它的href屬性就是這條記錄連接,點開這個連接就能夠看到這個公司詳細的招聘信息了:
分析發現,咱們須要的公司名稱就在class屬性爲inner-left和fl的div元素下的第一個h2元素下的a元素的文本內容;月薪在class屬性爲terminalpage-left的div元素下的第一個li元素裏面的strong元素的文本;招聘崗位信息在最後一個li下的a元素的文本;工做地點在class屬性爲tab-inner-cont的div元素下的h2元素的文本,固然,這裏面的a元素也有文本內容,因此在這裏須要將a元素的文本內容排除掉(詳細看後面源碼)。
3、 項目源碼
import requests from pyquery import PyQuery as pq import re import csv from urllib import parse from tqdm import tqdm from requests.exceptions import RequestException def get_one_page(url): """獲取一個網頁,參數url在主函數構造,防止程序出錯還捕捉了RequestException異常""" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/67.0.3396.62 Safari/537.36' } try: response = requests.get(url=url,headers=headers) if response.status_code == 200: return response.text return None except RequestException: return None def parse_one_page(html): """解析一個網頁,獲取一個頁面中全部公司的url連接,並將這些連接儲存在列表中,最後返回這個列表""" document = pq(html) url_list = [] a_list = document('.zwmc a:first') for item in a_list.items(): url_list.append(item.attr('href')) if url_list: return url_list def parse_one_company(url_list): """生成器函數,使用pyquery解析庫提取咱們須要的信息""" pattern = re.compile('(.*?) .*?') for url in url_list: html = get_one_page(url) document = pq(html) company_name = document('.inner-left.fl h2').text() salary = document('.terminalpage-left li:first strong').text() position = document('.terminalpage-left li:eq(7) strong').text() address = document('.tab-inner-cont h2').text() address = re.findall(pattern,address) if not address: address = '地址信息爲空' else: address = address[0] yield { 'company_name':company_name, 'salary':salary, 'position':position, 'address':address } def write_with_csv(content): """將數據寫入csv文件中,注意若是數據存在中文必須指定編碼格式""" with open('data.csv','a',encoding='utf-8') as csvfile: fieldnames = ['company_name','salary','position','address'] writer = csv.DictWriter(csvfile,fieldnames=fieldnames) writer.writerow(content) def main(city,keyword,page): """主函數,動態生成url,調用以上全部函數實現數據抓取,分析及儲存功能""" url_params = { 'jl':city, 'kw':keyword, 'p':page } url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' + parse.urlencode(url_params) html = get_one_page(url) if html: url_list = parse_one_page(html) items = parse_one_company(url_list) for item in items: write_with_csv(item) if __name__ == '__main__': # tqdm模塊用於顯示進度 for i in tqdm(range(1,11)): main('廣州','房地產銷售',i)