Python+Selenium拉勾网数据采集

发表于:2017-12-11 11:55  作者:爱柚子的陈同学   来源:简书

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: 软件测试工具 Python Selenium 自动化测试工具

  关于拉勾网数据采集爬虫的文章,网上已经写烂了。这里简单记录一个之前帮助同事妹子写的小爬虫工具。
  某天,HR同事妹子接到一个任务,收集并分析拉勾网BAT三家公司所有招聘岗位的分类,要求,薪酬范围,人数等信息。
  人肉采集辛苦枯燥,随手写段代码搭救妹子。
  开始
  拉勾网页面可能改版,以下代码实现可能已失效,不考虑持续维护更新。
  拉勾网给每家注册公司分配一个数字,URL形式是:
  LAGOU_URL = r'https://www.lagou.com/gongsi/j%d.html'
  人肉筛选目标公司如下:
COMPANY = {
'腾讯': 451,
'阿里优酷': 1914,
'阿里高德': 91,
'阿里天猫': 52840,
'阿里UC': 2202,
'阿里神马搜索': 90948,
'百度': 1575,
'百度外卖': 104601
}
  每家公司子页面的实现,使用了较多复杂Javascript代码和框架,因此不采用抓包分析HTTP协议的方案。
  简单粗暴直接的组合: Selenium + WebDriver + Chrome。
  Selenium
  官网 http://www.seleniumhq.org/
  GitHub https://github.com/SeleniumHQ/selenium
  文档 http://selenium-python.readthedocs.io/
  ChromeDriver
  ChromeDriver - WebDriver for Chrome
  为什么不使用运行效率更高的 PhantomJS ?
  因为需要频繁调试代码和观察运行情况。稳定运行后可以随时修改一行代码参数,替换成 PhantomJS 。
  Chrome 59 beta 开始支持 Headless。 详见 Getting Started with Headless Chrome。所以以后应该也不再需要 PhantomJS 了。
  数据定义
  继续简单粗暴直接:(参数有点多,PyLint 报 Warning 了,无视吧。)
class JobInfo(object):
'''Job Info Object'''
def __init__(self, company, job_filter, title, salary_min, salary_max, exp, edu):
self.company = company
self.filter = job_filter
self.title = title
self.salary_min = salary_min
self.salary_max = salary_max
self.exp = exp
self.edu = edu
@staticmethod
def header():
'''csv file header'''
return ['公司', '类别', '职位', '薪酬区间低', '薪酬区间高', '经验要求', '学历要求']
def array(self):
'''object to array'''
return [self.company,
self.filter,
self.title,
self.salary_min,
self.salary_max,
self.exp,
self.edu]
  页面加载解析
  WebDriver API 方便好用强大。
  con_list_item = WebDriverWait(browser, SLEEPTIME).until(lambda x: x.find_elements_by_class_name('con_list_item'))
  执行点击翻页跳转
try:
pages = browser.find_element_by_class_name('pages')
spans = pages.find_elements_by_tag_name('span')
span = get_next_span(spans)
if span:
span.click()
time.sleep(SLEEPTIME)
except NoSuchElementException as _e:
print(_e)
  数据采集完成后写入csv文件,略。
  坑
WebDriver API 简单易用,但超时处理机制仍不完善。
browser = webdriver.Chrome()
browser.get(url)
browser.refresh()
browser.quit()
implicitly_wait()无法判断页面内部各种Ajax操作执行完成的时机。只好注释掉这一行代码。
browser.implicitly_wait(TIMEOUT)

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

【调查报告】你以为的测试行业现状,其实是这样的!

评 论

论坛新帖

顶部 底部


建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海瀛东律师事务所 张楠律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2019, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道