基於Python的模擬登錄獲取脈脈好友信息

代碼已經上傳到githubhtml

簡介:

這是一個基於python3而寫的爬蟲,爬取的網站的脈脈網(https://maimai.cn/),在搜索框中搜索「CHO」,並切換到「人脈」選項卡,點擊姓名,進入詳情頁,爬取其詳細信息python

image

獲取的具體信息有:

基本信息、工做經歷、教育經歷、職業標籤及其承認數、點評信息mysql

幾度關係:一度、二度、三度等git

寫給用戶的

注意:若是你只是想使用這個項目,那麼你能夠看這裏github

如何使用:

使用以前,你要已經保證安裝好相關的庫和軟件:

  1. re
  2. requests
  3. selenium
  4. logging
  5. pymysql
  6. chrome
  7. mysql

使用:

  1. 從github上覆制代碼
  2. 填寫本身的脈脈手機號和密碼(你能夠在login.py文件中找到他)

image

  1. 建表(詳細建表見下)
  2. 運行程序login.py

詳細建表

須要5張表,下面附上代碼:web

  • 表1:basic_info(脈脈好友基本信息)
CREATE TABLE `basic_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(56) NOT NULL COMMENT '名字',
  `mmid` int(11) NOT NULL COMMENT 'mmid',
  `rank` int(11) DEFAULT NULL COMMENT '影響力',
  `company` varchar(128) DEFAULT NULL COMMENT '目前公司簡稱',
  `stdname` varchar(128) DEFAULT NULL COMMENT '目前公司全稱',
  `position` varchar(128) DEFAULT NULL COMMENT '目前職位',
  `headline` text COMMENT '自我介紹',
  `ht_province` varchar(128) DEFAULT NULL COMMENT '家鄉-省',
  `ht_city` varchar(128) DEFAULT NULL COMMENT '家鄉-城市',
  `email` varchar(128) DEFAULT NULL COMMENT '郵箱',
  `mobile` varchar(128) DEFAULT NULL COMMENT '手機',
  `dist` tinyint(1) DEFAULT NULL COMMENT '幾度關係',
  PRIMARY KEY (`id`),
  UNIQUE KEY `mmid` (`mmid`)
) ENGINE=InnoDB AUTO_INCREMENT=873 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC COMMENT='脈脈好友基本信息'
]
  • 表2:education_exp(脈脈好友教育經歷)
CREATE TABLE `education_exp` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `mmid` int(11) NOT NULL COMMENT 'mmid',
  `school_name` varchar(128) DEFAULT NULL COMMENT '學校名稱',
  `department` varchar(128) DEFAULT NULL COMMENT '專業',
  `education` int(5) DEFAULT NULL COMMENT '學歷(0:專科,1:本科,2:碩士,3:博士,255:其餘)',
  `start_year` int(11) DEFAULT NULL COMMENT '開始時間(年)默認爲0000',
  `start_mon` int(11) DEFAULT NULL COMMENT '開始時間(月)默認爲0000',
  `end_year` int(11) DEFAULT NULL COMMENT '結束時間(年)默認爲0000',
  `end_mon` int(11) DEFAULT NULL COMMENT '結束時間(月)默認爲0000',
  PRIMARY KEY (`id`),
  UNIQUE KEY `mmid` (`mmid`,`school_name`,`education`,`start_year`)
) ENGINE=InnoDB AUTO_INCREMENT=1064 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC COMMENT='脈脈好友教育經歷'
  • 表3:review_info(脈脈好友點評信息)
CREATE TABLE `review_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `mmid` int(11) NOT NULL COMMENT 'mmid',
  `reviewer` varchar(128) DEFAULT NULL COMMENT '點評人',
  `relationship` varchar(128) DEFAULT NULL COMMENT '關係',
  `position` varchar(128) DEFAULT NULL COMMENT '點評人職位',
  `eva_info` text COMMENT '評價信息',
  PRIMARY KEY (`id`),
  UNIQUE KEY `mmid` (`mmid`,`reviewer`)
) ENGINE=InnoDB AUTO_INCREMENT=400 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC COMMENT='脈脈好友點評信息'
  • 表4:tag_info(脈脈好友點評信息)
CREATE TABLE `tag_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `mmid` int(11) NOT NULL COMMENT 'mmid',
  `tag` varchar(128) DEFAULT NULL COMMENT '標籤',
  `rec_num` varchar(128) DEFAULT NULL COMMENT '承認度',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQUE` (`mmid`,`tag`,`rec_num`)
) ENGINE=InnoDB AUTO_INCREMENT=5881 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC COMMENT='脈脈好友點評信息'
  • 表5:work_exp(脈脈好友工做經歷)
CREATE TABLE `work_exp` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `mmid` int(11) NOT NULL COMMENT 'mmid',
  `company` varchar(128) DEFAULT NULL COMMENT '公司簡稱',
  `stdname` varchar(128) DEFAULT NULL COMMENT '公司全稱',
  `et_url` varchar(244) DEFAULT NULL COMMENT '公司頁面url',
  `description` text COMMENT '描述',
  `start_year` int(11) DEFAULT NULL COMMENT '開始時間(年)默認0000',
  `start_mon` int(11) DEFAULT NULL COMMENT '開始時間(月)默認0000',
  `end_year` int(11) DEFAULT NULL COMMENT '結束時間(年)默認0000',
  `end_mon` int(11) DEFAULT NULL COMMENT '結束時間(月)默認0000',
  `position` varchar(128) DEFAULT NULL COMMENT '職位',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQUE` (`mmid`,`company`,`start_year`,`position`)
) ENGINE=InnoDB AUTO_INCREMENT=2582 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC COMMENT='脈脈好友工做經歷'


寫給開發者的

若是你是一個開發者,那麼請看這裏ajax

具體的每一個函數的做用,就不細說了,代碼中有註釋,能夠自行查看sql

請求:

在這裏咱們主要說說請求這一塊:chrome

請求須要解決2個問題:json

  • 第一個是使用cookies模擬登錄
  • 第二個是數據獲取

模擬登錄

這是使用selenium驅動瀏覽器登陸脈脈,而後獲取cookie這樣來就省去了本身去拼接cookie的麻煩,獲取到cookie以後,在利用cookie來進行requests請求數據,這裏再也不使用selenium是由於selenium太慢,並且比較容易出錯

看一下代碼,思路是:

  1. 設置selenium參數
  2. 使用selenium打開到登陸網址
  3. 輸入手機號和密碼,進行登陸
  4. 獲取cookies,並存到json文件中

這樣就獲取cookies成功了,以後將cookies添加到requests請求中,進行數據獲取

def get_cookies():
    """
    使用selenium獲取cookies的值,將其存在文件中
    :return:
    """
    logger.info("使用selenium獲取cookies")
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')  # 解決DevToolsActivePort文件不存在的報錯
    chrome_options.add_argument('--disable-gpu')  # 谷歌文件提到須要加這個屬性來規避bug
    chrome_options.add_argument('--headless')  # 無界面設置
    chrome = webdriver.Chrome(chrome_options=chrome_options)
    login_url = "https://acc.maimai.cn/login"
    chrome.get(login_url)
    wait = WebDriverWait(chrome, 10)
    wait.until(EC.element_to_be_clickable(('xpath', "//input[@class='loginBtn']")))
    time.sleep(1)
    user_name = "***"  # 你的手機號
    password = "***"  # 你的密碼
    chrome.find_element("xpath", "//input[@class='loginPhoneInput']").send_keys(user_name)
    time.sleep(1)
    chrome.find_element("xpath", "//input[@id='login_pw']").send_keys(password)
    chrome.find_element('xpath', "//input[@class='loginBtn']").click()
    cookies = chrome.get_cookies()
    with open("cookie.json", "w+")as f:
        f.write(json.dumps(cookies))
        f.close()
    logger.info("cookies獲取成功")
    chrome.close()

數據獲取

這裏面主要有2個問題:

  1. 第一個網站使用了ajax加載,咱們須要找到咱們須要的url
  2. 第二個是獲取的html須要進行處理,才能被咱們所利用

ajax加載

直接去請求https://maimai.cn/web/search_center?type=contact&query=cho&highlight=true這裏,獲取的信息是不全的,這裏使用了ajax加載,咱們打開google看一下,按F12打開開發者模式看一下

image

如圖,咱們能夠在這裏找咱們須要的數據,這個是url:https://maimai.cn/search/cont...,這裏獲取的是json格式的數據,很是好解析,再進一步去獲取詳細信息的頁面的時候,其方法也是同樣的,這裏就很少作說明了

html頁面數據處理的問題

有一部分的數據是以json的形式返回給咱們的,可是還有一些數據是在原網頁中一塊兒返回的,雖然也是json的形式,可是處理起來仍是有必定的麻煩,看一下原網頁的數據

iamge

這個JSON.parse後面的數據也是咱們須要的,能夠發現這裏有一些像"u0022"的數據,這個實際上是雙引號的utf8編碼,還有一些其餘的字符,會以utf8編碼的形式返回的,直接處理很很差處理,咱們先將這些字符編碼替換爲對應的字符,以後轉成json的格式進行解析,這樣就方便多了,看一下代碼:

def json_info(html):
    """
    處理獲取的html,轉換爲json格式
    :param html:
    :return:
    """
    print(html.text)
    c = re.search('JSON\.parse\("(.*?)"\);</script><script\ssrc=', html.text, re.S).group(1)  # 正則匹配所須要的數據
    d = c.replace('\\u0022', '"').replace("\\u002D", "-").replace("\\u0026", '&').replace("\\u005C", "\\")  # 對數據進行處理
    data = json.loads(d)
    return data

思路是很簡單的:

  1. 先是將用正則匹配所須要的數據
  2. 拿下來以後將一些utf8編碼的字符替換掉
  3. 轉換爲json的格式進行解析

主要須要解決的問題就只有這些,其餘的一些數據處理,存儲都是很簡單和常見的,就很少作說明了

相關文章
相關標籤/搜索