程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python抓取招聘信息

編輯:Python

selenium應用中的坑

  1. selenium庫的使用能夠很好的讓你繞過反爬機制,應為程序在運行的過程中完全符合浏覽器的行為,既然是完全符合歷覽器的行為那麼也就不會被輕易的擋在外面,但是在應用過程中還是存在問題的。
  2. spider在獲取數據的時候,就是它能看到的,然後是你指定的數據,只要程序員爸爸給了合適的定位操作,spider就能通過定位拿到數據,但是前端的大佬們,往往在寫頁面的時候,有時候標簽的使用會變化,也就讓我們的定位無法准確的定位,這時候,你的spider就會出現宕機的危機。
  3. 解決方法:
    1. 在開始編寫代碼之前,事先打開網頁,進行查看,主要觀察的地方是,你所獲取內容在頁面上的展示方式和地方。
    2. 異常處理,利用異常處理來保證你的spider不會死亡,而且通過異常的拋出你也能夠進行發先,定位標記的錯誤,及時進行代碼的優化。
    3. 訪問時適當的加入等待機制,合適的等待機制,爬取的效率雖然會稍微的降低,但是穩定的數據獲取,能夠減少你的返工次數。

應用實例:

獵聘網的有關ptython的職位信息的獲取(僅用於練習和代碼測試)

利用chrome的自動控制,進行數據的獲取

主要獲取的字段為,公司名稱、職位名稱、薪資、應聘要求。

最後將數據存放到數據庫中。

import pymysql
import sys
def save(table):
print('------------------------------')
global conn
conn = pymysql.connect(host='127.0.0.1',
user='root',
passwd='XXX',
port=8080,
charset='utf8')
global cur
cur = conn.cursor()
print('獲取游標')
try:
cur.execute("create database lp character set utf8;")
except Exception as e:
print(e)
cur.execute('use lp;')
try:
cur.execute("create table "+table+"(id int,company char(100),job char(200),\
address char(100),salary char(100),ask varchar(5000))character set utf8;"
)
except Exception as e:
print(e)
print('創建表完成')
def inser_data(table,id,company,job,address,salary,ask):
sql_insert = 'insert into '+table+'(id,company,job,address,salary,ask) values (%s,%s,%s,%s,%s,%s);'
try:
cur.execute(sql_insert,[id,company,job,address,salary,ask])
except Exception as e:
print(e)
conn.commit()
def my_txt(table,ask):
f = open(table+'.txt','a+',encoding='utf-8')
f.write(ask)
f.close()
'''
職位要求得數據全部存儲在本地txt文檔制作詞雲
公司名稱,職位名稱和薪資字段全部存放於數據庫
由於薪資字段得數據顯示方式為“XX-XX”的范圍所以全部以字符串的形式進行存放
'''
from selenium import webdriver
from time import sleep
import random
import re
from lp_spider import save_data
# from lp_spider import py_cloud
start_url = 'https://www.liepin.com/zhaopin/'
def open_url():
global driver
driver = webdriver.Chrome()
driver.get(start_url)
driver.maximize_window()
def get_page(type):
#隱形等待,網頁完全打開
driver.implicitly_wait(20)
#輸入需要查找的類型
driver.find_element_by_xpath('//*[@id="sojob"]/div[1]/form/div[1]/div/div/div[1]/input').send_keys(type)
#點擊進行查找
driver.find_element_by_xpath('//*[@id="sojob"]/div[1]/form/div[1]/div/div/div[1]/button').click()
# 滑動滑塊
driver.execute_script('window.scrollBy(0, 500)')
def get_info(table):
global id # 標號
id = 0
for j in range(1,101):
for i in range(1,41):
global company # 公司名稱
global job # 職位名稱
global salary # 薪資
global Ask # 職位要求
try:
ty = driver.find_element_by_xpath('//*[@id="sojob"]/div[2]/div/div[1]/div[1]/ul/li['+str(i)+']/i/b').text
except:
ty = '無'
print(ty)
if ty == '企':
#sleep(random.choice(range(5, 15)))
#打開對應頁面
try:
#打開對應的頁面
driver.find_element_by_xpath('//*[@id="sojob"]/div[2]/div/div[1]/div[1]/ul/li['+str(i)+']/div/div[1]/h3/a').click()
#print(i)
#跳轉
print('站點地址:',end=' ')
print(driver.current_url)
handles = driver.window_handles
driver.switch_to.window(handles[len(handles)-1])
#print(driver.current_url)
driver.implicitly_wait(20)
#開始進行獲取信息
try:
company = driver.find_element_by_xpath(
'//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[1]/h3/a[@title]').text
except Exception as e:
print(e)
try:
company = driver.find_element_by_xpath(
'//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[1]/h3').text
except Exception as e:
print(e)
company = driver.find_element_by_xpath(
'//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[1]/h1[@title]').text
#print(company)
try:
job = driver.find_element_by_xpath('//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[1]/h1').text
except Exception as e:
print(e)
job = driver.find_element_by_xpath('//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[1]/h1[@title]').text
#print(job)
#sleep(random.choice(range(1,5)))
try:
salary = driver.find_element_by_xpath('//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/p[1]').text
salary_m = re.findall('[\u4e00-\u9fa5]+',salary)
if (salary_m[0] == '面議'):
salary = ['面議']
else:
salary = driver.find_element_by_xpath(
'//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/p[1]').text
if (len(salary)<8):
salary = [salary]
else:
salary = re.findall('[0-9]*.[0-9]*.[\u4e00-\u9fa5]+', salary)
except Exception as e:
print(e)
salary = driver.find_element_by_xpath(
'//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[2]/div/div/p[1]').text
if (len(salary) < 8):
salary = [salary]
else:
salary = re.findall('[0-9]*.[0-9]*.[\u4e00-\u9fa5]+', salary)
#print(salary)#!salary經過處理後變成字典形式
try:
address = driver.find_element_by_xpath('//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/p[2]/span/a').text
except Exception as e:
print(e)
try:
address = driver.find_element_by_xpath('//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[2]/div/div/p[2]/span').text
except Exception as e:
print(e)
try:
address = driver.find_element_by_xpath('//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/p[2]/span/text()').text
except Exception as e:
print(e)
address = driver.find_element_by_xpath('//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/p[2]/span').text
#print(address)
#移動滑動條
driver.execute_script('window.scrollBy(0,400)')
#sleep(10)
try:
Ask= driver.find_element_by_xpath('//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[3]/div').text
except Exception as e:
Ask = driver.find_element_by_xpath('//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[3]/div').text
#Ask = Ask.replace("\n",'')
try:
Ask = Ask.replace("任職要求:", "")
except:
#print(Ask)
pass
try:
Ask = Ask.replace("崗位職責:", "")
except:
#print(Ask)
pass
try:
Ask = Ask.replace("職位描述:", "")
except:
#print(Ask)
pass
try:
Ask = Ask.replace("崗位要求:", "")
except:
#print(Ask)
pass
try:
Ask = Ask.replace("職責描述:", "")
except:
#print(Ask)
pass
try:
Ask = Ask.replace("任職資格:", "")
except:
#print(Ask)
pass
# print(Ask)
driver.close()
handles = driver.window_handles
sleep(random.choice(range(1, 5)))
driver.switch_to.window(handles[len(handles)-2])
# #滑動滑塊
# driver.execute_script('window.scrollBy(0, 145)')
print(j, end='.')
print(i)
#print('————————————————————————————————————————————————————————————————————————' * 10)
save_data.inser_data(table,str(id), company, job, address, salary[0], Ask)
save_data.my_txt(table,Ask)
id = id + 1
except:
pass
else:
print(j, end='.')
print(i,end='完成')
#print('————————————————————————————————————————————————————————————————————————'*10)
if i<40:
if ty == '企':
# 滑動滑塊
driver.execute_script('window.scrollBy(0, 145)')
if ty == '獵':
driver.execute_script('window.scrollBy(0,141)')
if ty == '直':
driver.execute_script('window.scrollBy(0,145)')
if ty == '無':
driver.execute_script('window.scrollBy(0,137)')
if ty == '優':
driver.execute_script('window.scrollBy(0,139)')
try:
driver.find_element_by_xpath('//*[@id="sojob"]/div[2]/div/div[1]/div[1]/div/div/a[8]').click()
except:
driver.execute_script('window.scrollTo(0,0)')#返回到頁面首位
driver.execute_script('window.scrollBy(0,{})'.format(145 * 42))
driver.find_element_by_xpath('//*[@id="sojob"]/div[2]/div/div[1]/div[1]/div/div/a[8]').click()
sleep(random.choice(range(3,5)))
driver.execute_script('window.scrollBy(0, 500)')
save_data.cur.close()
save_data.conn.close()
if __name__ == '__main__':
while(1):
print('輸入爬取職位類別名稱,輸入後按回車繼續-->',end='')
ty = input()
save_data.save(ty)
open_url()
get_page(ty)
get_info(ty)
#py_cloud.make_cloud('python')
print('爬取結束')
# 詞雲
from wordcloud import WordCloud
import cv2
import jieba
with open('lp.txt', 'r',encoding='utf-8') as f:
text = f.read()
cut_text = " ".join(jieba.cut(text))
color_mask = cv2.imread('python1.jpg')
cloud = WordCloud(
# 設置字體,不指定就會出現亂碼
font_path=" C:\\Windows\\Fonts\\STXINGKA.TTF",
# font_path=path.join(d,'simsun.ttc'),
# 設置背景色
background_color='white',
# 詞雲形狀
mask=color_mask,
# 允許最大詞匯
max_words=10000,
# 最大號字體
max_font_size=100
)
wCloud = cloud.generate(cut_text)
wCloud.to_file('cloud.png')
import matplotlib.pyplot as plt
plt.imshow(wCloud, interpolation='bilinear')
plt.axis('off')
plt.show()


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved