博主信息
Laical
博文
3
粉丝
0
评论
0
访问量
648
积分:0
P豆:130

python爬虫通过Selenium采集招聘信息

2021年05月28日 16:11:04阅读数:223博客 / Laical

由于互联网的发展,网络上出现了各种招聘平台,以前大学生求职都是到别人公司去面试等等,现在由于计算机网络技术的发展进步,出现了各种招聘平台,现在网络招聘成了大学生求职和公司老板招聘发布的重要渠道之一。例如boss直聘,老板不仅可以在boss直聘平台上发布招聘信息,求职者用户也可以在Boss直聘平台上发出求职信息。这样双方都不会去花太多的时间去找工作,信息发布后让系统去匹配告知,但是一个一个招聘信息去看,还不如把所需要找的信息就采集下来,做好统计清理,然后查询自己所需要的求职工作,这样方便许多。
大家在爬取BOSS直聘的时一定要注意会出现的问题:
1、容易出现验证码
2、封禁IP地址
这些问题简单来说就是就是网站反爬了。如果出现IP被限制的情况,就需要更换代理IP,让更多的代理IP去采集。如果使用了代理IP去采集招聘信息数据,采集久了还是会出现验证码,就需要控制好访问频率了。boss直聘访问频率太快也会出现验证码。boss直聘最大的问题,就是需要登录才能采集,不登采集招聘信息数据,一会都会被限制,爬虫可以采用模拟真实浏览器的方式去访问,可以采用selenium模拟真实浏览器进行对boss直聘的的数据采集,这样不仅能解决登陆问题,而且数据采集也会更加稳定,也可以参考以下爬虫程序方案:
` import os
import time
import zipfile

  1. from selenium import webdriver
  2. from selenium.common.exceptions import TimeoutException
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.support.ui import WebDriverWait
  6. class GenCookies(object):
  7. # 随机useragent
  8. USER_AGENT = open('useragents.txt').readlines()
  9. # 代理服务器(产品官网 www.16yun.cn)
  10. PROXY_HOST = 't.16yun.cn' # proxy or host
  11. PROXY_PORT = 31111 # port
  12. PROXY_USER = 'USERNAME' # username
  13. PROXY_PASS = 'PASSWORD' # password
  14. @classmethod
  15. def get_chromedriver(cls, use_proxy=False, user_agent=None):
  16. manifest_json = """
  17. {
  18. "version": "1.0.0",
  19. "manifest_version": 2,
  20. "name": "Chrome Proxy",
  21. "permissions": [
  22. "proxy",
  23. "tabs",
  24. "unlimitedStorage",
  25. "storage",
  26. "<all_urls>",
  27. "webRequest",
  28. "webRequestBlocking"
  29. ],
  30. "background": {
  31. "scripts": ["background.js"]
  32. },
  33. "minimum_chrome_version":"22.0.0"
  34. }
  35. """
  36. background_js = """
  37. var config = {
  38. mode: "fixed_servers",
  39. rules: {
  40. singleProxy: {
  41. scheme: "http",
  42. host: "%s",
  43. port: parseInt(%s)
  44. },
  45. bypassList: ["localhost"]
  46. }
  47. };
  48. chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
  49. function callbackFn(details) {
  50. return {
  51. authCredentials: {
  52. username: "%s",
  53. password: "%s"
  54. }
  55. };
  56. }
  57. chrome.webRequest.onAuthRequired.addListener(
  58. callbackFn,
  59. {urls: ["<all_urls>"]},
  60. ['blocking']
  61. );
  62. """ % (cls.PROXY_HOST, cls.PROXY_PORT, cls.PROXY_USER, cls.PROXY_PASS)
  63. path = os.path.dirname(os.path.abspath(__file__))
  64. chrome_options = webdriver.ChromeOptions()
  65. # 关闭webdriver的一些标志
  66. # chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
  67. if use_proxy:
  68. pluginfile = 'proxy_auth_plugin.zip'
  69. with zipfile.ZipFile(pluginfile, 'w') as zp:
  70. zp.writestr("manifest.json", manifest_json)
  71. zp.writestr("background.js", background_js)
  72. chrome_options.add_extension(pluginfile)
  73. if user_agent:
  74. chrome_options.add_argument('--user-agent=%s' % user_agent)
  75. driver = webdriver.Chrome(
  76. os.path.join(path, 'chromedriver'),
  77. chrome_options=chrome_options)
  78. # 修改webdriver get属性
  79. # script = '''
  80. # Object.defineProperty(navigator, 'webdriver', {
  81. # get: () => undefined
  82. # })
  83. # '''
  84. # driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script})
  85. return driver
  86. def __init__(self, username, password):
  87. # 登录example网站
  88. self.url = 'https://passport.example.cn/signin/login?entry=example&r=https://m.example.cn/'
  89. self.browser = self.get_chromedriver(use_proxy=True, user_agent=self.USER_AGENT)
  90. self.wait = WebDriverWait(self.browser, 20)
  91. self.username = username
  92. self.password = password
  93. def open(self):
  94. """
  95. 打开网页输入用户名密码并点击
  96. :return: None
  97. """
  98. self.browser.delete_all_cookies()
  99. self.browser.get(self.url)
  100. username = self.wait.until(EC.presence_of_element_located((By.ID, 'loginName')))
  101. password = self.wait.until(EC.presence_of_element_located((By.ID, 'loginPassword')))
  102. submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'loginAction')))
  103. username.send_keys(self.username)
  104. password.send_keys(self.password)
  105. time.sleep(1)
  106. submit.click()
  107. def password_error(self):
  108. """
  109. 判断是否密码错误
  110. :return:
  111. """
  112. try:
  113. return WebDriverWait(self.browser, 5).until(
  114. EC.text_to_be_present_in_element((By.ID, 'errorMsg'), '用户名或密码错误'))
  115. except TimeoutException:
  116. return False
  117. def get_cookies(self):
  118. """
  119. 获取Cookies
  120. :return:
  121. """
  122. return self.browser.get_cookies()
  123. def main(self):
  124. """
  125. 入口
  126. :return:
  127. """
  128. self.open()
  129. if self.password_error():
  130. return {
  131. 'status': 2,
  132. 'content': '用户名或密码错误'
  133. }
  134. cookies = self.get_cookies()
  135. return {
  136. 'status': 1,
  137. 'content': cookies
  138. }
  139. if __name__ == '__main__':
  140. result = GenCookies(
  141. username='180000000',
  142. password='16yun',
  143. ).main()
  144. print(result)`

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论