自己捣鼓了几天写的代码,基本上把51job的岗位相关的数据都爬下来了,可以视要求自行增减,代码虽然有些简陋,不过我爬取的时候没报什么错。代码适合初学者学习使用,废话不多说,代码如下:

from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
from time import sleep
import pymysql
import reclass Crawler:def __init__(self):self.wd = webdriver.Chrome()self.wd.implicitly_wait(20)self.DBHOST = "localhost"self.DBUSER = "root"self.DBPASS = "123456"self.DBNAME = "51job"# 获取当前页面的数据def getData(self, len_Css):rows = []for i in range(1, len_Css):# 岗位名称job_name = self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) span.jname.at'.format(i)).text# 公司名称company_name = self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) a.cname.at'.format(i)).text# 城市 工作经验 学历 招聘人数al = self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) span.d.at'.format(i)).text.split('|')# 分别对应不同情况,有的岗位缺少学历,有的缺少工作经验if len(al) == 4:city = al[0]experience = al[1]education = al[2]recruits_Number = al[3]elif len(al) == 3:city = al[0]experience = al[1]education = Nonerecruits_Number = al[2]elif len(al) == 2:city = al[0]experience = Noneeducation = Nonerecruits_Number = al[1]else:city = Noneexperience = Noneeducation = Nonerecruits_Number = None# 发布日期release_Date = self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) span.time'.format(i)).text# 公司福利# 有的岗位不能定位到福利元素,通过自定义NoExists方法判断能否定位到元素# if self.NoExists('div.j_joblist > div:nth-child({0}) p.tags'.format(i)):#     welfare = self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) p.tags'.format(i)).get_attribute("title")# else:#     welfare = None# 薪水# 有的岗位薪水能定位到元素,但是是空串,防止报错if bool(self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) span.sal'.format(i)).text):salary = self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) span.sal'.format(i)).textelse:salary = None# 公司类型company_type = self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) p.int.at'.format(i)).text# 招聘详情urljob_ex_url = self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) a.el[target=_blank]'.format(i)).get_attribute("href")# 公司urlcompany_url = self.wd.find_element(By.CSS_SELECTOR, 'div.j_joblist > div:nth-child({0}) a.cname.at'.format(i)).get_attribute("href")rows.append([job_name, company_name, city, experience, education, recruits_Number, release_Date, salary, company_type, job_ex_url, company_url])return rows# 将爬取的数据存进数据库def saveData(self, rows):db = pymysql.connect(host=self.DBHOST, user=self.DBUSER, password=self.DBPASS, database=self.DBNAME)cur = db.cursor()sql = "INSERT INTO ods_51job_job(job_name, company_name, job_city, job_experience, job_education, recruits_Number, release_Date, salary, company_type, job_ex_url, company_url) " \"VALUE (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"try:for row in rows:cur.execute(sql, row)db.commit()except pymysql.Error as e:print(e)finally:cur.close()db.close()# 一次爬取存储一页数据,自动递增直到爬完def scrapingData(self, City, keyWord, start_Page):wait = WebDriverWait(self.wd, 20, 0.5)# 得出总页数isNextpage = self.wd.find_element(By.CSS_SELECTOR,'body > div:nth-child(4) > div.j_result > div > div.leftbox > div:nth-child(4) > div.j_page > div > div > div > span:nth-child(1)').textresult = re.findall(r'\d+', isNextpage)condition = int(result[0])sleep(2)print('城市编号:%s  关键词:%s  总页数:%d' % (City, keyWord, condition))while start_Page <= condition:# 当前页面总共有多少条招聘岗位(一般是50条)pubCss = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'body > div:nth-child(4) > div.j_result > div > div.leftbox > div:nth-child(4) > div.j_joblist > div.e')))# 获取当前页面数据并存进数据库rows1 = self.getData(len(pubCss)+1)self.saveData(rows1)print('\t已爬取第%d页;' % start_Page)# 判断是否最后一页if start_Page < condition:nextpage = self.wd.find_element(By.CSS_SELECTOR, 'li.next a[style="cursor: pointer;"]')nextpage.click()self.wd.refresh()start_Page += 1else:print('已爬取完当前城市关键词!')breaksleep(2)def NoExists(self, Css):try:self.wd.find_element(By.CSS_SELECTOR, Css)return Trueexcept NoSuchElementException:return False# 自动循环遍历城市和关键词def getUrl(self, workCity, startPage, keywords):# 爬取中断后需要更改i,j的下标初始位置和start_page重新继续爬取for i in range(0, len(workCity)):for j in range(0, len(keywords)):suffix = str(startPage) + '.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='url = 'https://search.51job.com/list/' + str(workCity[i]) + ',000000,0000,00,9,99,' + keywords[j] + ',2,' + suffixself.wd.get(url)self.scrapingData(workCity[i], keywords[j], startPage)# 更改start_page后会从start_page页开始爬,爬到下一个关键词再把start_page重置成1从第一页开始爬if startPage > 1:startPage = 1
# 热门城市编码
# {"北京", "010000"}, {"上海", "020000"}, {"广州", "030200"}, {"深圳", "040000"}, {"武汉", "180200"},
# {"西安", "200200"}, {"杭州", "080200"}, {"南京", "070200"}, {"成都", "090200"}, {"重庆", "060000"},
# {"东莞", "030800"}, {"大连", "230300"}, {"沈阳", "230200"}, {"苏州", "070300"}, {"昆明", "250200"},
# {"长沙", "190200"}, {"合肥", "150200"}, {"宁波", "080300"}, {"郑州", "170200"}, {"天津", "050000"},
# {"青岛", "120300"}, {"哈尔滨", "220200"}, {"长春", "240200"}, {"福州", "110200"}, {"珠三角", "01"};if __name__ == '__main__':# 将需要爬取的城市编号和关键词放进数组,start_page为从第几页开始爬cities = ['040000', '080200', '070200', '190200', '090200', '180200']keyword = ['大数据', 'python', '爬虫', 'Hadoop', '数据分析师', 'Hadoop']start_page = 1a = Crawler()a.getUrl(cities, start_page, keyword)

上面的代码里公司福利的数据我注释掉了,因为基本每页都有几条没有公司福利的岗位数据,处理错误耗时太久,爬取大量数据的时候太煎熬了,干脆不要了。还有就是css路径我都是直接复制的,好多都还可以再删减优化,不过我比较懒,也可以换成xpath路径,可以更精简。最后就是数据库需要自己建表,连接的时候注意改下代码里的参数还有sql里的字段名称就行,还是比较简单的。

我自己运行代码的时候出错一般都是爬了很久后报timeout错误,可以把等待时间稍微加长点,不过估计爬多了也还会报错,毕竟51job虽然很随便但爬多了也会反爬,只是不像boss直聘爬了几千条数据就封ip两天那么狠(表示被封过好几次

python:使用selenium爬取51job(前程无忧)并将爬取数据存储到MySql数据库中的代码实例相关推荐

  1. 爬取知网博硕士文献及中国专利存到mysql数据库中的代码及其注意事项

    今天因为需要做了一个爬取知网博硕士论文及中国专利的爬虫,在制作的过程中遇到了不少坑,在网上查资料时都是很老的资源,在现在知网的反爬虫下不起作用,所以我来写这篇文章来供大家参考.(这篇文章主要介绍通过改 ...

  2. 猫眼电影票房爬取到MySQL中_猫眼电影爬取(一):requests+正则,并将数据存储到mysql数据库...

    前面讲了如何通过pymysql操作数据库,这次写一个爬虫来提取信息,并将数据存储到mysql数据库 1.爬取目标 爬取猫眼电影TOP100榜单 要提取的信息包括:电影排名.电影名称.上映时间.分数 2 ...

  3. 《Python网络爬虫——从入门到实践》第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法)

    <Python网络爬虫--从入门到实践>第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法) 作为刚开始入门python的小白,对大数据,网络爬虫比较感兴趣.完全是自我修炼 ...

  4. python爬取豆瓣电影top250_利用python爬取豆瓣电影Top250,并把数据放入MySQL数据库...

    在学习了python基础后,一心想着快速入门爬虫,因为我就是为爬虫而学的python,所以就找了这个豆瓣电影来爬取.好了,废话不多说,进入正题 1.找到网页并分析网页结构 首先进入豆瓣电影Top250 ...

  5. python sql逐行读取数据库数据,使用python读取数据库中的内容 把爬虫爬到的内容,存储在mysql数据库中...

    安装pymsql库 以管理员身份打开cmd,输入pip Install pymysql import pymysql #连接数据库 conn = pymysql.connect(hoost='loca ...

  6. 利用Python爬虫网站数据直接导入mysql数据库中

    说明: 可能经常出现要爬取某个网站的数据,这时候需要利用爬虫技术来完成,这块主要使用Python来实现. 如何搭建Python环境我上节文章有详细描述:使用Python3.7实现爬虫技术,获取自己想要 ...

  7. PYTHON——数据存储:MySQL数据库

    Python3 MySQL 数据库连接 - PyMySQL 驱动 本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL ...

  8. python爬取玉米、小麦、水稻信息数据到本地为网页形式和mysql数据库中

    1.创建Scrapy项目 scrapy startproject ExGrain 2.进入项目目录,使用命令genspider创建Spider scrapy genspider exgrain ex- ...

  9. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储(转)

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

最新文章

  1. 【怎样写代码】函数式编程 -- Lambda表达式(一):引出
  2. Matlab数据的可视化 -- 柱形立体图
  3. WebView加载HTML时禁止超链接跳转
  4. GNN 笔记1 图的概念
  5. java对象流定义_Java 对象流的用法,将自定义类数组写入文件中
  6. AI从业几年还不具备提出新模型的技术能力?看这个就够了!
  7. Linux shell创建空文件(0字节大小)文件方法
  8. 编程相关离线文档下载方式推荐
  9. 洛谷2149 Elaxia的路线(dp+最短路)
  10. Angular提示文件不是一个有效的模块
  11. 使用python将数据存入SQLite3数据库
  12. 17张程序员壁纸推荐,是否有一张你喜欢的?
  13. 瀚高数据库分页SQL写法
  14. 李宏毅svm_CAA | 【智能自动化学科前沿讲习班第1期】国立台湾大学(位于中国台北)李宏毅教授:Anime Face Generation...
  15. Matlab中的plotyy用法总结
  16. linux安装程序企鹅,在Linux上安装小企鹅输入法
  17. java pow_Java pow()方法
  18. 文本检测之-craft检测算法
  19. 什么是绝对URL、相对URL
  20. VMware解决:未能将管道连接到虚拟机: 所有的管道范例都在使用中。

热门文章

  1. 超全面!UI设计师如何适配2018新款iPhone
  2. 华为鸿蒙OS5摄概念机,华为Mate50Pro概念机:后置五摄,预装鸿蒙OS
  3. 网络安全-数字签名技术框图(SZ)
  4. 【Web】Bootstrap框架实现简单旅游网站页面
  5. 求二维函数Z=g(X,Y)型,用卷积公式求概率密度,积分区域如何确定(中)
  6. CSDN修改昵称和博客标题
  7. matlab 直流电源突变,鑫诺尔科技:直流电源案例分析及经验分享
  8. (zz)DotA的爱情哲理
  9. Android短信中的Contacts类
  10. hive中的 lateral view