Python項目實戰:使用selenium爬取拉勾網數據

前言:

​ 一切不經過項目驗證的代碼都是耍流氓,今天我們就通過一個簡單的招聘網站的數據歸檔進行當前熱門崗位的大數據分析,最後以wordcloud進行顯示。本文爲數據爬取篇

項目準備:

​ 這次我們來比較完整的抓取拉勾網上面“Python”相關招聘信息以及招聘要求詳情。

​ 能聯網的電腦、搭建好Python3以上環境,如果環境沒有配置,可以參考我原來的文章 環境安裝及軟件下載地址。IDE這次我們採用Jupyter Notebook ,採集我們使用selenium+pyquery,爲什麼用這個? 說起來都是淚,文末我再解釋。數據分析使用pandas。

分析頁面,尋找數據來源

打開拉勾網,搜索“Python”得到下面這個頁面。最近疫情我被關在武漢了,我就以武漢站爲目的地好了。
共30頁,每頁展示15個職位[職位(368)]。

image-20200405030834644

image-20200405031132861

通過selenium採集比request採集的效率要低許多,因爲是模擬瀏覽器方式進行抓取,所以每次都要對頁面進行渲染。但是同樣也有個好處,就是不用在意header和cookie問題。廢話不多說,直接開始操作

按照以前我們的方法,在Notebook中新建Python 3文件:

引入各種模塊:

import pyquery as pq
from selenium import webdriver
import pandas as pd
import time
import os

初始化一個瀏覽器:

driver = webdriver.Firefox()
driver.implicitly_wait(5)
driver.get("https://www.lagou.com/")

在打開的頁面中,進行處理拉勾網的登陸狀態

while True:
    i = input("已登陸成功請輸入“OK”:")
    if i == 'OK':
        break
    elif i == 'quit':
        print("取消執行,關閉!")
        os._exit(1)

登陸成功後,在命令行輸入窗輸入“OK”,會進入下一步執行。

進入列表採集:

print("開始執行採集")
data = []
driver.get("https://www.lagou.com/jobs/list_Python/p-city_184?&cl=false&fromSearch=true&labelWords=&suginput=")
while True:
    but_class = driver.find_element_by_css_selector(".pager_next").get_attribute('class')

    if but_class == 'pager_next ':
        driver.find_element_by_xpath("//span[@action='next']").click()
        items = pq.PyQuery(driver.page_source).find(".con_list_item")
        data += getPosition(items)
        time.sleep(2)
    else:
        print('列表採集結束')
        break

我們單獨定義了一個採集方法,getPosition 這個方法接收一個pyquery的對象。

方法代碼如下:

def getPosition(items):
    datalist=[]
    for item in items.items():
        temp = dict()
        temp['職位ID']= item.attr('data-positionid')
        temp['職位名']= item.attr('data-positionname')
        temp['薪資範圍']= item.attr('data-salary')
        temp['公司ID']= item.attr('data-companyid')
        temp['公司名']= item.attr('data-company')
        temp['職位鏈接']=pq.PyQuery(item).find(".position_link").attr("href")
        temp['發佈時間']=pq.PyQuery(item).find(".format-time").text()
        temp['獵頭名稱']=pq.PyQuery(item).find(".hr_name").text()
        temp['獵頭ID']=pq.PyQuery(item).find(".target_hr").text()
        temp['工作經驗']=pq.PyQuery(item).find(".p_bot>.li_b_l").remove(".money").text()
        temp['公司主頁']=pq.PyQuery(item).find(".company_name>a").attr('href')
        temp['公司描述']=pq.PyQuery(item).find(".industry").text()
        temp['崗位亮點']=pq.PyQuery(item).find(".li_b_r").text()

        datalist.append(temp)
    return datalist

到這裏,主要列表的採集和整理工作就結束了,我們把採集到的數據整合到pandas中,並保存到csv文件,以方便後面使用。

csv = pd.DataFrame(data)
csv.to_csv("lagou.csv")

image-20200405101319498

截圖爲保存的DataFrame。可以看到,我們保存了二級頁名,和公司相關的信息。

一共採集了368條數據。這個時候,我們開始進行第二步詳情數據的完善採集。

我們先查看一個二級頁面,看一下數據格式

在網頁裏面點擊任意一個職位進入查看詳情,例如https://www.lagou.com/jobs/4263258.html

img

參照我們最開始的方法可以發現,我們需要的信息就在右鍵html網頁源代碼裏面,就在一個class='job_bt'的dd標籤裏面:

img

我這裏使用pyquery 來處理html內容:(記得在代碼同級建立data文件位)

text =pq.PyQuery(driver.page_source).find(".job-detail").text()
with open("./data/%s.txt" %row[1],"w+") as f:
    f.write(text)

如果對JQuery熟悉的同學一定可以看出來,PyQuery的選擇器實在是簡單。。

最後別忘了測試一下存儲的數據是否正確:

彩蛋:

​ 最開始寫這個文章時,我是打算使用request進行數據採集的,在代碼實現的時候發現一個問題,拉勾網的防爬做得還是挺不錯,在採集列表頁面時,同一header的使用一旦超過5次就被判定爲爬蟲。在這個坑上足足花了二個小時。雖然這個坑大概是什麼原因,但是我實現在是太困,不想再花時間處理。(頁面的COOKIE是經過頁面Js調用生成的)如果以後有精力再說吧。

總結

  • 先分析頁面,知道數據從哪裏來、什麼格式?(網頁源代碼html?Network面板的xhr請求到的json數據?),本項目使用的selenium,所以只用處理頁面數據。
  • 根據數據來源格式確定使用解析方式
  • 處理防爬機制
  • 利用def定義不同的函數處理單獨的請求可以讓代碼更清晰
  • 把獲取的內容存儲到文件(簡單橫豎列表數據存.csv),注意要轉爲字符串存儲,注意文件名要唯一。
  • 儘可能在必要的位置合理的使用time.sleep(1)延緩一下,特別是防爬高的站點,一定要加上
  • 代碼要一點點測試,Jupyter Notebook是一個神器。

作者相關:

博客新浪微博簡書

本系列教程及源碼地址:點擊訪問

最後:如果你正在學習Python的路上,或者準備打算學習Python、明哥會陪着你陪你一起共同進步!

手打不易,有用的話,請記得關注轉發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章