当前位置:   article > 正文

python抓取招聘信息_sojob

sojob

selenium应用中的坑

  1. selenium库的使用能够很好的让你绕过反爬机制,应为程序在运行的过程中完全符合浏览器的行为,既然是完全符合历览器的行为那么也就不会被轻易的挡在外面,但是在应用过程中还是存在问题的。
  2. spider在获取数据的时候,就是它能看到的,然后是你指定的数据,只要程序员爸爸给了合适的定位操作,spider就能通过定位拿到数据,但是前端的大佬们,往往在写页面的时候,有时候标签的使用会变化,也就让我们的定位无法准确的定位,这时候,你的spider就会出现宕机的危机。
  3. 解决方法:
    1. 在开始编写代码之前,事先打开网页,进行查看,主要观察的地方是,你所获取内容在页面上的展示方式和地方。
    2. 异常处理,利用异常处理来保证你的spider不会死亡,而且通过异常的抛出你也能够进行发先,定位标记的错误,及时进行代码的优化。
    3. 访问时适当的加入等待机制,合适的等待机制,爬取的效率虽然会稍微的降低,但是稳定的数据获取,能够减少你的返工次数。

应用实例:

猎聘网的有关ptython的职位信息的获取(仅用于练习和代码测试

利用chrome的自动控制,进行数据的获取

主要获取的字段为,公司名称、职位名称、薪资、应聘要求。

最后将数据存放到数据库中。

  1. import pymysql
  2. import sys
  3. def save(table):
  4. print('------------------------------')
  5. global conn
  6. conn = pymysql.connect(host='127.0.0.1',
  7. user='root',
  8. passwd='XXX',
  9. port=8080,
  10. charset='utf8')
  11. global cur
  12. cur = conn.cursor()
  13. print('获取游标')
  14. try:
  15. cur.execute("create database lp character set utf8;")
  16. except Exception as e:
  17. print(e)
  18. cur.execute('use lp;')
  19. try:
  20. cur.execute("create table "+table+"(id int,company char(100),job char(200),\
  21. address char(100),salary char(100),ask varchar(5000))character set utf8;"
  22. )
  23. except Exception as e:
  24. print(e)
  25. print('创建表完成')
  26. def inser_data(table,id,company,job,address,salary,ask):
  27. sql_insert = 'insert into '+table+'(id,company,job,address,salary,ask) values (%s,%s,%s,%s,%s,%s);'
  28. try:
  29. cur.execute(sql_insert,[id,company,job,address,salary,ask])
  30. except Exception as e:
  31. print(e)
  32. conn.commit()
  33. def my_txt(table,ask):
  34. f = open(table+'.txt','a+',encoding='utf-8')
  35. f.write(ask)
  36. f.close()
  1. '''
  2. 职位要求得数据全部存储在本地txt文档制作词云
  3. 公司名称,职位名称和薪资字段全部存放于数据库
  4. 由于薪资字段得数据显示方式为“XX-XX”的范围所以全部以字符串的形式进行存放
  5. '''
  6. from selenium import webdriver
  7. from time import sleep
  8. import random
  9. import re
  10. from lp_spider import save_data
  11. # from lp_spider import py_cloud
  12. start_url = 'https://www.liepin.com/zhaopin/'
  13. def open_url():
  14. global driver
  15. driver = webdriver.Chrome()
  16. driver.get(start_url)
  17. driver.maximize_window()
  18. def get_page(type):
  19. #隐形等待,网页完全打开
  20. driver.implicitly_wait(20)
  21. #输入需要查找的类型
  22. driver.find_element_by_xpath('//*[@id="sojob"]/div[1]/form/div[1]/div/div/div[1]/input').send_keys(type)
  23. #点击进行查找
  24. driver.find_element_by_xpath('//*[@id="sojob"]/div[1]/form/div[1]/div/div/div[1]/button').click()
  25. # 滑动滑块
  26. driver.execute_script('window.scrollBy(0, 500)')
  27. def get_info(table):
  28. global id # 标号
  29. id = 0
  30. for j in range(1,101):
  31. for i in range(1,41):
  32. global company # 公司名称
  33. global job # 职位名称
  34. global salary # 薪资
  35. global Ask # 职位要求
  36. try:
  37. ty = driver.find_element_by_xpath('//*[@id="sojob"]/div[2]/div/div[1]/div[1]/ul/li['+str(i)+']/i/b').text
  38. except:
  39. ty = '无'
  40. print(ty)
  41. if ty == '企':
  42. #sleep(random.choice(range(5, 15)))
  43. #打开对应页面
  44. try:
  45. #打开对应的页面
  46. driver.find_element_by_xpath('//*[@id="sojob"]/div[2]/div/div[1]/div[1]/ul/li['+str(i)+']/div/div[1]/h3/a').click()
  47. #print(i)
  48. #跳转
  49. print('站点地址:',end=' ')
  50. print(driver.current_url)
  51. handles = driver.window_handles
  52. driver.switch_to.window(handles[len(handles)-1])
  53. #print(driver.current_url)
  54. driver.implicitly_wait(20)
  55. #开始进行获取信息
  56. try:
  57. company = driver.find_element_by_xpath(
  58. '//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[1]/h3/a[@title]').text
  59. except Exception as e:
  60. print(e)
  61. try:
  62. company = driver.find_element_by_xpath(
  63. '//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[1]/h3').text
  64. except Exception as e:
  65. print(e)
  66. company = driver.find_element_by_xpath(
  67. '//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[1]/h1[@title]').text
  68. #print(company)
  69. try:
  70. job = driver.find_element_by_xpath('//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[1]/h1').text
  71. except Exception as e:
  72. print(e)
  73. job = driver.find_element_by_xpath('//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[1]/h1[@title]').text
  74. #print(job)
  75. #sleep(random.choice(range(1,5)))
  76. try:
  77. 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
  78. salary_m = re.findall('[\u4e00-\u9fa5]+',salary)
  79. if (salary_m[0] == '面议'):
  80. salary = ['面议']
  81. else:
  82. salary = driver.find_element_by_xpath(
  83. '//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/p[1]').text
  84. if (len(salary)<8):
  85. salary = [salary]
  86. else:
  87. salary = re.findall('[0-9]*.[0-9]*.[\u4e00-\u9fa5]+', salary)
  88. except Exception as e:
  89. print(e)
  90. salary = driver.find_element_by_xpath(
  91. '//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[2]/div/div/p[1]').text
  92. if (len(salary) < 8):
  93. salary = [salary]
  94. else:
  95. salary = re.findall('[0-9]*.[0-9]*.[\u4e00-\u9fa5]+', salary)
  96. #print(salary)#!salary经过处理后变成字典形式
  97. try:
  98. 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
  99. except Exception as e:
  100. print(e)
  101. try:
  102. 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
  103. except Exception as e:
  104. print(e)
  105. try:
  106. 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
  107. except Exception as e:
  108. print(e)
  109. 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
  110. #print(address)
  111. #移动滑动条
  112. driver.execute_script('window.scrollBy(0,400)')
  113. #sleep(10)
  114. try:
  115. Ask= driver.find_element_by_xpath('//*[@id="job-view-enterprise"]/div[1]/div[1]/div[1]/div[1]/div[3]/div').text
  116. except Exception as e:
  117. Ask = driver.find_element_by_xpath('//*[@id="job-hunter"]/div[1]/div[1]/div[1]/div[1]/div/div[3]/div').text
  118. #Ask = Ask.replace("\n",'')
  119. try:
  120. Ask = Ask.replace("任职要求:", "")
  121. except:
  122. #print(Ask)
  123. pass
  124. try:
  125. Ask = Ask.replace("岗位职责:", "")
  126. except:
  127. #print(Ask)
  128. pass
  129. try:
  130. Ask = Ask.replace("职位描述:", "")
  131. except:
  132. #print(Ask)
  133. pass
  134. try:
  135. Ask = Ask.replace("岗位要求:", "")
  136. except:
  137. #print(Ask)
  138. pass
  139. try:
  140. Ask = Ask.replace("职责描述:", "")
  141. except:
  142. #print(Ask)
  143. pass
  144. try:
  145. Ask = Ask.replace("任职资格:", "")
  146. except:
  147. #print(Ask)
  148. pass
  149. # print(Ask)
  150. driver.close()
  151. handles = driver.window_handles
  152. sleep(random.choice(range(1, 5)))
  153. driver.switch_to.window(handles[len(handles)-2])
  154. # #滑动滑块
  155. # driver.execute_script('window.scrollBy(0, 145)')
  156. print(j, end='.')
  157. print(i)
  158. #print('————————————————————————————————————————————————————————————————————————' * 10)
  159. save_data.inser_data(table,str(id), company, job, address, salary[0], Ask)
  160. save_data.my_txt(table,Ask)
  161. id = id + 1
  162. except:
  163. pass
  164. else:
  165. print(j, end='.')
  166. print(i,end='完成')
  167. #print('————————————————————————————————————————————————————————————————————————'*10)
  168. if i<40:
  169. if ty == '企':
  170. # 滑动滑块
  171. driver.execute_script('window.scrollBy(0, 145)')
  172. if ty == '猎':
  173. driver.execute_script('window.scrollBy(0,141)')
  174. if ty == '直':
  175. driver.execute_script('window.scrollBy(0,145)')
  176. if ty == '无':
  177. driver.execute_script('window.scrollBy(0,137)')
  178. if ty == '优':
  179. driver.execute_script('window.scrollBy(0,139)')
  180. try:
  181. driver.find_element_by_xpath('//*[@id="sojob"]/div[2]/div/div[1]/div[1]/div/div/a[8]').click()
  182. except:
  183. driver.execute_script('window.scrollTo(0,0)')#返回到页面首位
  184. driver.execute_script('window.scrollBy(0,{})'.format(145 * 42))
  185. driver.find_element_by_xpath('//*[@id="sojob"]/div[2]/div/div[1]/div[1]/div/div/a[8]').click()
  186. sleep(random.choice(range(3,5)))
  187. driver.execute_script('window.scrollBy(0, 500)')
  188. save_data.cur.close()
  189. save_data.conn.close()
  190. if __name__ == '__main__':
  191. while(1):
  192. print('输入爬取职位类别名称,输入后按回车继续-->',end='')
  193. ty = input()
  194. save_data.save(ty)
  195. open_url()
  196. get_page(ty)
  197. get_info(ty)
  198. #py_cloud.make_cloud('python')
  199. print('爬取结束')
  1. # 词云
  2. from wordcloud import WordCloud
  3. import cv2
  4. import jieba
  5. with open('lp.txt', 'r',encoding='utf-8') as f:
  6. text = f.read()
  7. cut_text = " ".join(jieba.cut(text))
  8. color_mask = cv2.imread('python1.jpg')
  9. cloud = WordCloud(
  10. # 设置字体,不指定就会出现乱码
  11. font_path=" C:\\Windows\\Fonts\\STXINGKA.TTF",
  12. # font_path=path.join(d,'simsun.ttc'),
  13. # 设置背景色
  14. background_color='white',
  15. # 词云形状
  16. mask=color_mask,
  17. # 允许最大词汇
  18. max_words=10000,
  19. # 最大号字体
  20. max_font_size=100
  21. )
  22. wCloud = cloud.generate(cut_text)
  23. wCloud.to_file('cloud.png')
  24. import matplotlib.pyplot as plt
  25. plt.imshow(wCloud, interpolation='bilinear')
  26. plt.axis('off')
  27. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/939927
推荐阅读
相关标签
  

闽ICP备14008679号