1、导入包
import requests #取数
from lxml import etree #用xpath解析
import pymysql #连接数据库
import chardet #自动获取编码
2、获取单页html
def get_one_page(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'}
response = requests.get(url, headers=headers) #习惯先把头部信息加上
response.encoding = chardet.detect(response.content)['encoding'] #用chardet.detect方法自动获取网页的编码,也可以自己手动在网页查
return response.text
3、解析html
def parse_one_page(html):
#对获取内容初始化,再用parse函数etree.HTML解析
result = etree.HTML(html)
item = {} #建立一个字典储存所有职位信息
item['t1'] = result.xpath('//div[@class="el"]/p/span/a/text()') #职位名称
item['t2'] = result.xpath('//div[@class="el"]/span[@class="t2"]/a/text()') #公司名称
item['t3'] = result.xpath('//div[@class="el"]/span[@class="t3"]/text()') #工作地点
t4 = result.xpath('//div[@class="el"]/span[@class="t4"]') #text无法获取空值(薪资数据可能为空),所以要用string方法获取
item['t4'] = []
for i in t4:
item['t4'].append(i.xpath('string(.)')) #遍历出来再用xpath解析,string(.)中间的点表示在当前目录
item['t5'] = result.xpath('//div[@class="el"]/span[@class="t5"]/text()') #发布时间
item['href'] = result.xpath('//div[@class="el"]/p/span/a/@href') #详细链接
4、数据清洗
上面第3步将数取出,存在字典里,接下来做数据清洗,这部分还是在parse_one_page函数体里。

# (1) 去掉每个职位名称前后空白
for i in range(len(item['t1'])): #有多少个职位就遍历多少遍
item['t1'][i] = item['t1'][i].strip() #strip只针对字符串
# (2) 薪资处理
# 定义列表,存储处理后的薪资数据
sal_low = [] #最低月薪
sal_height = [] #最高月薪
for sal in item['t4']: #取出的是字符串
if sal != "": #如果薪资不为空,则先截取
sal = sal.strip().split('-') #将薪资分成两部分
if len(sal) > 1: #若长度>1,则说明薪资是个区间,有最大最小值
#研究薪资结构,一般是万/月,千/月,万/年,其它的设为0值
if sal[1][-3] == '万' and sal[1][-1] == '月': #判断第二部分的构成
sal_low.append(float(sal[0])*10000) #float设置成浮点数
sal_height.append(float(sal[1][0:-3])*10000)
elif sal[1][-3] == '万' and sal[1][-1] == '年':
sal_low.append(round(float(sal[0])*10000/12,1)) #round保留一位小数,月薪=年薪/12
sal_height.append(round(float(sal[1][0:-3])*10000/12,1))
elif sal[1][-3] == '千' and sal[1][-1] == '月':
sal_low.append(float(sal[0])*1000)
sal_height.append(float(sal[1][0:-3])*1000)
else:
sal_low.append(0) #若存在其它情况则全部设为0
sal_height.append(0)
else:
#否则,薪资只有一个固定值
if sal[0][-3] == '元' and sal[0][-1] == '天':
sal_low.append(sal[0][0:-3]) #直接把数字填进去(日薪)
sal_height.append(sal[0][0:-3]) #因为只有一个值,所以最低最高薪资是相同的
else:
sal_low.append(0)
sal_height.append(0)
else: #若为空
sal_low.append(0)
sal_height.append(0)
# 将处理后的薪资存储在字典中
item['sal_low'] = sal_low
item['sal_height'] = sal_height

# (3) 时间数据处理
for i in range(len(item['t5'])):
item['t5'][i] = '2019-' + item['t5'][i] # 遍历出来把每个结果前面都加上年份

yield item
5、存储至mysql
def write_to_mysql(content):
# 建立连接
conn = pymysql.connect(host='localhost',user='root',passwd='vicky',db='test_db',charset='utf8')
cursor = conn.cursor()
for i in range(len(content['t1'])):
# 在这里只取了下面7个字段
jobname = content['t1'][i]
company = content['t2'][i]
workplace = content['t3'][i]
salary_low = content['sal_low'][i]
salary_height = content['sal_height'][i]
ptime = content['t5'][i]
href = content['href'][i]
# 在这一步的时候可以去Navicat创建一张表,字段可以多加一个id为主键自增
sql = "insert into wuyoujob values(null,%s,%s,%s,%s,%s,%s,%s)"
parm = (jobname,company,workplace,salary_low,salary_height,ptime,href)
cursor.execute(sql,parm)
conn.commit()
cursor.close()
conn.close(http://www.my516.com)
5、函数回调
函数写好了,实例化就行

def main(page):
url = 'https://search.51job.com/list/080200,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,'+str(page)+'.html?' #这里要注意,原地址中间?后面的内容都可以删掉,取前面就好,做个分页时注意要转成字符串格式才能拼接
html = get_one_page(url)
for i in parse_one_page(html): #遍历字典
print(i) #打印处理后的数据(字典)也可以不打印
write_to_mysql(i) #把字典的内容传给数据库
6、回调主函数,完成分页
if __name__ == '__main__':
for i in range(1,9): #这里看自己抓取的网页大概有多少页
main(i)
然后打开Navicat,刷新一下表,见证奇迹的时候到了!

Python3爬取前程无忧数据分析工作并存储到MySQL的更多相关文章

  1. Python爬取招聘信息,并且存储到MySQL数据库中

    前面一篇文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为前一天的,同时将爬取的内容保存到数据库中:这篇文章主要讲述如何将python文件压缩成exe可执行文件,供后面的操作. 这系列文章 ...

  2. 爬取豆瓣电影top250并存储到mysql数据库

    import requests from lxml import etree import re import pymysql import time conn= pymysql.connect(ho ...

  3. Python3爬取人人网(校内网)个人照片及朋友照片,并一键下载到本地~~~附源代码

    题记: 11月14日早晨8点,人人网发布公告,宣布人人公司将人人网社交平台业务相关资产以2000万美元的现金加4000万美元的股票对价出售予北京多牛传媒,自此,人人公司将专注于境内的二手车业务和在美国 ...

  4. python3爬取网页

    爬虫 python3爬取网页资源方式(1.最简单: import'http://www.baidu.com/'print2.通过request import'http://www.baidu.com' ...

  5. python3爬取女神图片,破解盗链问题

    title: python3爬取女神图片,破解盗链问题 date: 2018-04-22 08:26:00 tags: [python3,美女,图片抓取,爬虫, 盗链] comments: true ...

  6. Python3 爬取微信好友基本信息,并进行数据清洗

    Python3 爬取微信好友基本信息,并进行数据清洗 1,登录获取好友基础信息: 好友的获取方法为get_friends,将会返回完整的好友列表. 其中每个好友为一个字典 列表的第一项为本人的账号信息 ...

  7. python3爬取微博评论并存为xlsx

    python3爬取微博评论并存为xlsx**由于微博电脑端的网页版页面比较复杂,我们可以访问手机端的微博网站,网址为:https://m.weibo.cn/一.访问微博网站,找到热门推荐链接我们打开微 ...

  8. python3爬取全民K歌

    Python3爬取全民k歌 环境 python3.5 + requests 1.通过歌曲主页链接爬取 首先打开歌曲主页,打开开发者工具(F12). 选择Network,点击播放,会发现有一个请求返回的 ...

  9. Python3爬取猫眼电影信息

    Python3爬取猫眼电影信息 import json import requests from requests.exceptions import RequestException import ...

随机推荐

  1. 【剑指offer】斐波那契序列与跳台阶

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25337983 剑指offer上的第9题,简单题,在九度OJ上測试通过. 主要注意下面几点: ...

  2. 排列(permutation) 用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。

    #include <stdio.h> #include <math.h> // 算法竞赛的目标是编程对任意输入均得到正确的结果. // 请先独立完成,如果有困难可以翻阅本书代码 ...

  3. WPF-使用面板控制内容布局,比较Canvas,WrapPanel,StackPanel,Grid,ScrollViewer

    WPF-使用面板控制内容布局,比较Canvas,WrapPanel,StackPanel,Grid,ScrollViewer 分类: WPF2012-04-24 09:59 660人阅读 评论(0)  ...

  4. 【转】webview的几个问题

    我们在native与网页相结合开发的过程中,难免会遇到关于WebView一些共通的问题.就我目前开发过程中遇到的问题以及最后得到的优化方案都将在这里列举出来.有些是老生常谈,有些则是个人摸索得出解决方 ...

  5. git 命令 —— checkout

    git checkout 会重写工作区.check in 常常表示酒店入住,则 check out 就表示结账(检查)离开. 1. 基本用法 Git学习笔记04–git checkout git ch ...

  6. Spark 操作Hive 流程

    1.ubuntu 装mysql 2.进入mysql: 3.mysql>create database hive (这个将来是存 你在Hive中建的数据库以及表的信息的(也就是元数据))mysql ...

  7. php phppowerpoint

    今天早上从订阅的 Zend DevZone 看到篇很有意思的文章. Creating PowerPoint 2007 files using PHP. 试了一下. 果然很又意思, 分享给大家吧. 程序 ...

  8. 2017北京国庆刷题Day1 morning T2

    T2火柴棒 (stick) Time Limit:1000ms   Memory Limit:128MB 题目描述 众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出 ...

  9. [Swift通天遁地]五、高级扩展-(4)快速生成Invert、Mix、Tint、Shade颜色及调整饱和度阶

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. SpringBoot SpringDataJPA 动态查询、多条件查询

    Spring-data - JPA用的还是比较多的,之前在公司也一直在用,因为方便.下面我们来整理一下如何配置. pom.xml <?xml version="1.0" en ...