摘要:代碼已經上傳到上簡介這是一個基于而寫的爬蟲,爬取的網站的脈脈網,在搜索框中搜索,并切換到人脈選項卡,點擊姓名,進入詳情頁,爬取其詳細信息獲取的具體信息有基本信息工作經歷教育經歷職業標簽及其認可數點評信息幾度關系一度二度三度等寫給用戶的注意如
代碼已經上傳到github上
簡介:這是一個基于python3而寫的爬蟲,爬取的網站的脈脈網(https://maimai.cn/),在搜索框中搜索“CHO”,并切換到“人脈”選項卡,點擊姓名,進入詳情頁,爬取其詳細信息
獲取的具體信息有:基本信息、工作經歷、教育經歷、職業標簽及其認可數、點評信息
幾度關系:一度、二度、三度等
寫給用戶的注意:如果你只是想使用這個項目,那么你可以看這里
如何使用: 使用之前,你要已經保證安裝好相關的庫和軟件:re
requests
selenium
logging
pymysql
chrome
mysql
使用:從github上復制代碼
填寫自己的脈脈手機號和密碼(你可以在login.py文件中找到他)
建表(詳細建表見下)
運行程序login.py
詳細建表需要5張表,下面附上代碼:
表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="脈脈好友工作經歷"
如果你是一個開發者,那么請看這里
具體的每個函數的作用,就不細說了,代碼中有注釋,可以自行查看
請求:在這里我們主要說說請求這一塊:
請求需要解決2個問題:
第一個是使用cookies模擬登陸
第二個是數據獲取
這是使用selenium驅動瀏覽器登錄脈脈,然后獲取cookie這樣來就省去了自己去拼接cookie的麻煩,獲取到cookie之后,在利用cookie來進行requests請求數據,這里不再使用selenium是因為selenium太慢,而且比較容易出錯
看一下代碼,思路是:
設置selenium參數
使用selenium打開到登錄網址
輸入手機號和密碼,進行登錄
獲取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", "http://input[@class="loginBtn"]"))) time.sleep(1) user_name = "***" # 你的手機號 password = "***" # 你的密碼 chrome.find_element("xpath", "http://input[@class="loginPhoneInput"]").send_keys(user_name) time.sleep(1) chrome.find_element("xpath", "http://input[@id="login_pw"]").send_keys(password) chrome.find_element("xpath", "http://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個問題:
第一個網站使用了ajax加載,我們需要找到我們需要的url
第二個是獲取的html需要進行處理,才能被我們所利用
ajax加載直接去請求https://maimai.cn/web/search_center?type=contact&query=cho&highlight=true這里,獲取的信息是不全的,這里使用了ajax加載,我們打開google看一下,按F12打開開發者模式看一下
如圖,我們可以在這里找我們需要的數據,這個是url:https://maimai.cn/search/cont...,這里獲取的是json格式的數據,非常好解析,再進一步去獲取詳細信息的頁面的時候,其方法也是一樣的,這里就不多做說明了
html頁面數據處理的問題有一部分的數據是以json的形式返回給我們的,但是還有一些數據是在原網頁中一起返回的,雖然也是json的形式,但是處理起來還是有一定的麻煩,看一下原網頁的數據
這個JSON.parse后面的數據也是我們需要的,可以發現這里有一些像"u0022"的數據,這個其實是雙引號的utf8編碼,還有一些其他的字符,會以utf8編碼的形式返回的,直接處理很不好處理,我們先將這些字符編碼替換為對應的字符,之后轉成json的格式進行解析,這樣就方便多了,看一下代碼:
def json_info(html): """ 處理獲取的html,轉換為json格式 :param html: :return: """ print(html.text) c = re.search("JSON.parse("(.*?)");思路是很簡單的:
先是將用正則匹配所需要的數據
拿下來之后將一些utf8編碼的字符替換掉
轉換為json的格式進行解析
主要需要解決的問題就只有這些,其他的一些數據處理,存儲都是很簡單和常見的,就不多做說明了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43486.html
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:微信知乎新浪等主流網站的模擬登陸爬取方法摘要微信知乎新浪等主流網站的模擬登陸爬取方法。先說說很難爬的知乎,假如我們想爬取知乎主頁的內容,就必須要先登陸才能爬,不然看不到這個界面。圖片描述知乎需要手機號才能注冊登陸。 微信、知乎、新浪等主流網站的模擬登陸爬取方法摘要:微信、知乎、新浪等主流網站的模擬登陸爬取方法。 網絡上有形形色色的網站,不同類型的網站爬蟲策略不同,難易程度也不一樣。從是...
閱讀 2604·2021-11-02 14:39
閱讀 4321·2021-10-11 10:58
閱讀 1446·2021-09-06 15:12
閱讀 1837·2021-09-01 10:49
閱讀 1326·2019-08-29 18:31
閱讀 1882·2019-08-29 16:10
閱讀 3331·2019-08-28 18:21
閱讀 867·2019-08-26 10:42