需要用到的技术:ajax请求,mysql,excel
网址:https://www.lagou.com/
当在搜索框输入python后,网址发生改变,此网址即是我们要的。
右键查看源码,在network标签可以看到request的url为Request URL: https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=
想要获得此链接,需要在搜索框输入python,network会刷新,然后才会出现此链接。
https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false
方法是post。
到这里我们知道了从哪里请求数据,从哪里获取结果。但是 result 列表中只有第一页 15 条数据,其他页面数据怎么获取呢?
kd 就是我们搜索的关键词,pn 就是当前页码。first 默认就行了,不用管它。剩下的事情就是构造请求,来下载 30 个页面的数据了。
PHP把中文生成%E4%B8%8A%E6%B5%B7,爬虫时可以写中文。
当输入python进行搜索后,再选择对应的城市,即会获得要下载内容的链接。
点击左侧的:
positionAjax.json?px=default&city=%E4%B8%8A%E6%B5%B7&needAddtionalResult=false
右边可以看到:
https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E4%B8%8A%E6%B5%B7&needAddtionalResult=false
# 模型浏览器
header = {
'User-Agent': 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0',
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
'Accept': 'application/json, text/javascript, */*; q=0.01'
}
urls = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
s = requests.Session()
# 获取搜索页的cookies
s.get(urls, headers=header, timeout=3)
# 为此次获取的cookies
cookie = s.cookies
payload = {
'first': 'true',
'pn': '2', # 搜索出来的一个页面
'kd': 'python' # 搜索的keyword
}
url='https://www.lagou.com/jobs/positionAjax.json?city=广州&needAddtionalResult=false'
# 获取此次文本
response = s.post(url, data=payload, headers=header, cookies=cookie, timeout=5).json()
print(type(response))
print(response)
"""
{'success': True, 'msg': None, 'code': 0, 'content': {'showId': '5e738ce8eaca469080e4d2d049cb711a', 'hrInfoMap': {'6578596': {'userId': 7339435, 'portrait': 'i/image2/M01/83/66/CgoB5luFTlmAbUdBAAAWVK2XbLY113.jpg', 'realName': '酷狗招聘', 'positionName': '招聘主管', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '6582692': {'userId': 15550697, 'portrait': 'i/image2/M01/0E/8C/CgoB5lyhgdiAN-4AAACeGEp-ay0931.png', 'realName': '廖小姐', 'positionName': '人力资源经理', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7685943': {'userId': 11763841, 'portrait': 'i/image2/M01/71/6A/CgoB5l1JhbCAeYMVAABmUR8PEmM496.png', 'realName': 'susan', 'positionName': 'HRBP总监', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7600437': {'userId': 1351513, 'portrait': 'i/image/M00/36/F2/CgpFT1lIeM2Ac-ikAAD6cIqX6gk251.jpg', 'realName': 'hr', 'positionName': None, 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '6727278': {'userId': 7406615, 'portrait': 'i/image2/M01/0E/AC/CgotOVyhgdWACcZgAABtgMsGk64396.png', 'realName': '龚文滢', 'positionName': '招聘经理', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7552538': {'userId': 14964085, 'portrait': 'i/image2/M01/7F/54/CgoB5l1l_OiAAmP1AADg8xYvd-I381.png', 'realName': '吴小姐', 'positionName': '人事', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7571322': {'userId': 6213860, 'portrait': 'i/image2/M01/B7/AF/CgoB5lwQrh6AboxXAAAeoek5COc924.png', 'realName': '郑植青', 'positionName': '高级招聘专员', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7685848': {'userId': 8733402, 'portrait': 'i/image3/M01/08/E0/Ciqah16G26qAbTjTAAGR852KedA512.png', 'realName': 'Hayley', 'positionName': '人事主管', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7703835': {'userId': 18835015, 'portrait': 'i/image2/M01/0E/AC/CgotOVyhgdWACcZgAABtgMsGk64396.png', 'realName': '简女士', 'positionName': '人事专员', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7660903': {'userId': 6766999, 'portrait': 'i/image/M00/10/ED/CgqCHl7LYqSAafgZAAAFpGQNC20708.jpg', 'realName': '钟小姐', 'positionName': 'HR', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '4445175': {'userId': 10573054, 'portrait': 'i/image3/M01/77/EC/Cgq2xl5zEhaALplJAAAXrIUlUwI009.png', 'realName': '吴小姐', 'positionName': 'HR', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7659233': {'userId': 15024490, 'portrait': 'i/image/M00/4C/AA/CgqCHl9YbfaANpELAAAN8YZrl34699.jpg', 'realName': '谢先生', 'positionName': 'HR', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7636013': {'userId': 12307769, 'portrait': 'i/image2/M01/0E/AC/CgotOVyhgdKAWLwZAACHltqNgkc507.png', 'realName': '张瑞婷', 'positionName': '招聘专员', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '7683241': {'userId': 2139289, 'portrait': 'i/image/M00/0B/04/CgqCHl6_ao2AF0mBAADw8_UZfCY074.png', 'realName': '汪航行', 'positionName': 'CEO', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}, '6818007': {'userId': 12035286, 'portrait': 'i/image2/M01/E1/76/CgoB5lxuJb2AY4xUAAAt6fuwzro921.jpg', 'realName': '悦谦HR', 'positionName': 'HR', 'phone': None, 'receiveEmail': None, 'userLevel': 'G1', 'canTalk': True}}, 'pageNo': 2, 'positionResult': {'resultSize': 15, 'result': [{'positionId': 7600437, 'positionName': 'python爬虫实习生', 'companyId': 59065, 'companyFullName': '深圳道乐科技有限公司', 'companyShortName': '深圳道乐', 'companyLogo': 'i/image/M00/2B/09/Cgp3O1cz3XCALv3nAAAPSe2ZDB4093.png', 'companySize': '150-500人', 'industryField': '移动互联网,金融', 'financeStage': '未融资', 'companyLabelList': ['年终奖励', '成长空间', '扁平管理', '美女多'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python'], 'positionLables': ['Python'], 'industryLables': [], 'createTime': '2020-09-14 10:19:54', 'formatCreateTime': '10:19发布', 'city': '广州', 'district': '海珠区', 'businessZones': None, 'salary': '2k-3k', 'salaryMonth': '0', 'workYear': '应届毕业生', 'jobNature': '实习', 'education': '本科', 'positionAdvantage': '拥抱互联网金融大平台,接触一线券商企业客户', 'imState': 'disabled', 'lastLogin': '2020-09-14 15:11:20', 'publisherId': 1351513, 'approve': 1, 'subwayline': '3号线', 'stationname': '客村', 'linestaion': '3号线_大塘;3号线_客村;8号线_客村', 'latitude': '23.083801', 'longitude': '113.317388', 'distance': None, 'hitags': None, 'resumeProcessRate': 100, 'resumeProcessDay': 1, 'score': 7, 'newScore': 0.0, 'matchScore': 1.8469921, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 1, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 7685848, 'positionName': 'Python后端开发工程师', 'companyId': 210273, 'companyFullName': '广州市咪佰信息科技有限公司', 'companyShortName': '咪佰科技', 'companyLogo': 'i/image2/M01/7F/9F/CgoB5l1mQY-AF34gAABSPUGRNvI981.png', 'companySize': '少于15人', 'industryField': '移动互联网,广告营销', 'financeStage': '未融资', 'companyLabelList': ['年度旅游', '节日礼物', '领导好', '扁平管理'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['游戏开发', 'Python', '数据采集'], 'positionLables': ['游戏开发', 'Python', '数据采集'], 'industryLables': [], 'createTime': '2020-09-14 09:36:29', 'formatCreateTime': '09:36发布', 'city': '广州', 'district': '番禺区', 'businessZones': None, 'salary': '8k-12k', 'salaryMonth': '13', 'workYear': '应届毕业生', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '双休 下午茶 扁平化管理', 'imState': 'today', 'lastLogin': '2020-09-14 14:10:39', 'publisherId': 8733402, 'approve': 1, 'subwayline': '4号线', 'stationname': '大学城北', 'linestaion': '4号线_大学城北', 'latitude': '23.057243', 'longitude': '113.387294', 'distance': None, 'hitags': None, 'resumeProcessRate': 6, 'resumeProcessDay': 1, 'score': 6, 'newScore': 0.0, 'matchScore': 1.7977986, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 1, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 6818007, 'positionName': 'Python开发工程师', 'companyId': 475744, 'companyFullName': '广州悦谦科技有限公司', 'companyShortName': '悦谦科技', 'companyLogo': 'i/image2/M01/AB/79/CgotOVvtOj-AFKj9AAAt6fuwzro591.jpg', 'companySize': '50-150人', 'industryField': '移动互联网', 'financeStage': '不需要融资', 'companyLabelList': ['绩效奖金', '股票期权', '定期体检', '带薪年假'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python'], 'positionLables': ['移动互联网', '互联网金融', 'Python'], 'industryLables': ['移动互联网', '互联网金融', 'Python'], 'createTime': '2020-09-11 15:50:15', 'formatCreateTime': '3天前发布', 'city': '广州', 'district': '海珠区', 'businessZones': ['客村', '新港', '赤岗'], 'salary': '15k-30k', 'salaryMonth': '0', 'workYear': '3-5年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '双休 扁平化管理 发展平台好 团队氛围好', 'imState': 'today', 'lastLogin': '2020-09-14 14:51:25', 'publisherId': 12035286, 'approve': 1, 'subwayline': '3号线', 'stationname': '赤岗', 'linestaion': '3号线_客村;3号线_广州塔;8号线_客村;8号线_赤岗', 'latitude': '23.093925', 'longitude': '113.323383', 'distance': None, 'hitags': None, 'resumeProcessRate': 69, 'resumeProcessDay': 1, 'score': 2, 'newScore': 0.0, 'matchScore': 1.0956733, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 7703835, 'positionName': 'python', 'companyId': 120956340, 'companyFullName': '链乎(广州)科技有限公司', 'companyShortName': '链乎科技', 'companyLogo': 'i/image/M00/49/9A/CgqCHl9PXYCAXShTAAHfO5yhd7c192.jpg', 'companySize': '少于15人', 'industryField': '软件开发', 'financeStage': '未融资', 'companyLabelList': ['领导好', '弹性工作', '技能培训', '管理规范'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python', '后端'], 'positionLables': ['后端'], 'industryLables': [], 'createTime': '2020-09-11 11:15:19', 'formatCreateTime': '3天前发布', 'city': '广州', 'district': '天河区', 'businessZones': ['珠江新城'], 'salary': '10k-15k', 'salaryMonth': '0', 'workYear': '3-5年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '办公氛围轻松、同事好相处、年轻团队', 'imState': 'today', 'lastLogin': '2020-09-14 15:42:06', 'publisherId': 18835015, 'approve': 1, 'subwayline': '3号线', 'stationname': '岗顶', 'linestaion': '3号线_石牌桥;3号线_岗顶;5号线_猎德;5号线_潭村', 'latitude': '23.124555', 'longitude': '113.339788', 'distance': None, 'hitags': None, 'resumeProcessRate': 72, 'resumeProcessDay': 1, 'score': 1, 'newScore': 0.0, 'matchScore': 1.0397716, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 6578596, 'positionName': 'PTBU-后端开发工程师(python)', 'companyId': 336, 'companyFullName': '广州酷狗计算机科技有限公司', 'companyShortName': '酷狗音乐', 'companyLogo': 'i/image/M00/30/0E/CgpFT1k5D_yADEvSAAAWVK2XbLY366.jpg', 'companySize': '500-2000人', 'industryField': '文娱丨内容', 'financeStage': '上市公司', 'companyLabelList': ['技能培训', '节日礼物', '年底双薪', '带薪年假'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': [], 'positionLables': ['音乐', '直播'], 'industryLables': ['音乐', '直播'], 'createTime': '2020-09-12 15:02:47', 'formatCreateTime': '2天前发布', 'city': '广州', 'district': '天河区', 'businessZones': ['棠下', '天园', '车陂'], 'salary': '20k-35k', 'salaryMonth': '0', 'workYear': '3-5年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '年终奖金、五险一金、三餐补贴、周末双休', 'imState': 'disabled', 'lastLogin': '2020-09-14 15:00:24', 'publisherId': 7339435, 'approve': 1, 'subwayline': '5号线', 'stationname': '车陂南', 'linestaion': '4号线_车陂;4号线_车陂南;5号线_科韵路;5号线_车陂南', 'latitude': '23.118109', 'longitude': '113.38321', 'distance': None, 'hitags': None, 'resumeProcessRate': 36, 'resumeProcessDay': 1, 'score': 1, 'newScore': 0.0, 'matchScore': 0.6104466, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': True, 'detailRecall': False}, {'positionId': 7552538, 'positionName': 'python开发', 'companyId': 209072, 'companyFullName': '广州德惟科技有限公司', 'companyShortName': '德惟科技', 'companyLogo': 'i/image3/M00/06/7E/CgpOIFpgBeKASr9NAAAeG2k-uYc489.jpg', 'companySize': '150-500人', 'industryField': '金融,移动互联网', 'financeStage': '不需要融资', 'companyLabelList': [], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python', '数据库'], 'positionLables': ['Python', '数据库'], 'industryLables': [], 'createTime': '2020-09-09 16:36:33', 'formatCreateTime': '2020-09-09', 'city': '广州', 'district': '天河区', 'businessZones': None, 'salary': '9k-15k', 'salaryMonth': '0', 'workYear': '1-3年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '包餐,团队大型,技术牛人多,金融行业标杆', 'imState': 'today', 'lastLogin': '2020-09-14 14:52:27', 'publisherId': 14964085, 'approve': 1, 'subwayline': '3号线', 'stationname': '妇儿中心', 'linestaion': '1号线_体育西路;1号线_体育中心;3号线_珠江新城;3号线_体育西路;3号线_石牌桥;3号线(北延段)_体育西路;5号线_五羊邨;5号线_珠江新城;5号线_猎德;APM线_海心沙;APM线_大剧院;APM线_花城大道;APM线_妇儿中心;APM线_黄埔大道;APM线_天河南;APM线_体育中心南', 'latitude': '23.123985', 'longitude': '113.326318', 'distance': None, 'hitags': None, 'resumeProcessRate': 0, 'resumeProcessDay': 0, 'score': 1, 'newScore': 0.0, 'matchScore': 0.75467294, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 7685943, 'positionName': 'python开发工程师', 'companyId': 35745, 'companyFullName': '京信通信系统(中国)有限公司', 'companyShortName': '京信通信', 'companyLogo': 'image1/M00/00/55/Cgo8PFTUXR-AMKqQAAA4J7rdHkY651.png', 'companySize': '2000人以上', 'industryField': '企业服务', 'financeStage': '上市公司', 'companyLabelList': ['节日礼物', '绩效奖金', '岗位晋升', '年度旅游'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python'], 'positionLables': ['Python'], 'industryLables': [], 'createTime': '2020-09-08 12:15:27', 'formatCreateTime': '2020-09-08', 'city': '广州', 'district': '黄埔区', 'businessZones': None, 'salary': '10k-13k', 'salaryMonth': '0', 'workYear': '1-3年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '来这里,点亮人生,绽放你的精彩', 'imState': 'today', 'lastLogin': '2020-09-14 10:19:30', 'publisherId': 11763841, 'approve': 1, 'subwayline': None, 'stationname': None, 'linestaion': None, 'latitude': '23.17004', 'longitude': '113.432959', 'distance': None, 'hitags': None, 'resumeProcessRate': 11, 'resumeProcessDay': 1, 'score': 1, 'newScore': 0.0, 'matchScore': 0.6708204, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 4445175, 'positionName': 'Python高级开发工程师', 'companyId': 364753, 'companyFullName': '青岛英联艺术传媒有限公司', 'companyShortName': 'Arts Alliance Media(中国)', 'companyLogo': 'i/image/M00/88/0D/CgpFT1rXHeuAP-Z9AABKonw2ZR0980.png', 'companySize': '50-150人', 'industryField': '数据服务', 'financeStage': '未融资', 'companyLabelList': [], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': '其他后端开发', 'skillLables': ['Python'], 'positionLables': ['Python'], 'industryLables': [], 'createTime': '2020-09-11 18:01:55', 'formatCreateTime': '3天前发布', 'city': '广州', 'district': '荔湾区', 'businessZones': None, 'salary': '15k-26k', 'salaryMonth': '0', 'workYear': '3-5年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '高效团队', 'imState': 'today', 'lastLogin': '2020-09-14 14:09:23', 'publisherId': 10573054, 'approve': 1, 'subwayline': '1号线', 'stationname': '文化公园', 'linestaion': '1号线_芳村;6号线_文化公园', 'latitude': '23.097062', 'longitude': '113.244207', 'distance': None, 'hitags': None, 'resumeProcessRate': 43, 'resumeProcessDay': 2, 'score': 0, 'newScore': 0.0, 'matchScore': 0.45168573, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 7660903, 'positionName': 'python开发工程师', 'companyId': 177718, 'companyFullName': '深圳市冰芒果科技有限公司', 'companyShortName': '冰芒果', 'companyLogo': 'i/image/M00/5B/14/CgpFT1mNoXeAaXDFAAAwQNlRT6A411.png', 'companySize': '150-500人', 'industryField': '移动互联网,金融', 'financeStage': '天使轮', 'companyLabelList': ['绩效奖金', '弹性工作', '五险一金', '股票期权'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python'], 'positionLables': ['Python'], 'industryLables': [], 'createTime': '2020-09-05 17:51:22', 'formatCreateTime': '2020-09-05', 'city': '广州', 'district': '番禺区', 'businessZones': None, 'salary': '8k-13k', 'salaryMonth': '0', 'workYear': '1-3年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '弹性工作制 六险一金', 'imState': 'disabled', 'lastLogin': '2020-09-14 13:54:29', 'publisherId': 6766999, 'approve': 1, 'subwayline': None, 'stationname': None, 'linestaion': None, 'latitude': '22.936378', 'longitude': '113.369721', 'distance': None, 'hitags': None, 'resumeProcessRate': 1, 'resumeProcessDay': 1, 'score': 0, 'newScore': 0.0, 'matchScore': 0.59255797, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 7683241, 'positionName': 'python开发工程师', 'companyId': 278440, 'companyFullName': '广州小米加步枪网络科技有限公司', 'companyShortName': '小米加步枪', 'companyLogo': 'i/image3/M00/31/BA/Cgq2xlqjcdyAYOtDAAFBxcuCqcs545.jpg', 'companySize': '15-50人', 'industryField': '金融,游戏', 'financeStage': '天使轮', 'companyLabelList': ['绩效奖金', '股票期权', '弹性工作', '领导好'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['分布式', 'Python', '后端', 'Shell'], 'positionLables': ['分布式', 'Python', '后端', 'Shell'], 'industryLables': [], 'createTime': '2020-09-08 11:12:23', 'formatCreateTime': '2020-09-08', 'city': '广州', 'district': '天河区', 'businessZones': ['天河北'], 'salary': '10k-18k', 'salaryMonth': '0', 'workYear': '3-5年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '双月最多可以拿到120%的绩效奖金', 'imState': 'today', 'lastLogin': '2020-09-14 14:11:54', 'publisherId': 2139289, 'approve': 1, 'subwayline': '3号线', 'stationname': '华师', 'linestaion': '3号线_岗顶;3号线_华师', 'latitude': '23.140602', 'longitude': '113.344488', 'distance': None, 'hitags': None, 'resumeProcessRate': 6, 'resumeProcessDay': 1, 'score': 0, 'newScore': 0.0, 'matchScore': 0.6708204, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 6582692, 'positionName': 'Python开发工程师', 'companyId': 158991, 'companyFullName': '广州市云润大数据服务有限公司', 'companyShortName': '广州市云润大数据', 'companyLogo': 'i/image/M00/75/90/CgqKkVgz-VWAYMAWAAAMxSzTkzA423.png', 'companySize': '150-500人', 'industryField': '数据服务,移动互联网', 'financeStage': 'A轮', 'companyLabelList': [], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python', 'Hadoop', 'docker', 'Linux/Unix'], 'positionLables': ['云计算', '大数据', 'Python', 'Hadoop', 'docker', 'Linux/Unix'], 'industryLables': ['云计算', '大数据', 'Python', 'Hadoop', 'docker', 'Linux/Unix'], 'createTime': '2020-09-10 15:39:27', 'formatCreateTime': '2020-09-10', 'city': '广州', 'district': '天河区', 'businessZones': ['棠下'], 'salary': '8k-15k', 'salaryMonth': '0', 'workYear': '3-5年', 'jobNature': '全职', 'education': '大专', 'positionAdvantage': '周末双休 五险一金 专业培训', 'imState': 'sevenDays', 'lastLogin': '2020-09-10 14:55:54', 'publisherId': 15550697, 'approve': 1, 'subwayline': '5号线', 'stationname': '车陂南', 'linestaion': '4号线_车陂;4号线_车陂南;5号线_科韵路;5号线_车陂南', 'latitude': '23.125946', 'longitude': '113.388807', 'distance': None, 'hitags': None, 'resumeProcessRate': 0, 'resumeProcessDay': 0, 'score': 0, 'newScore': 0.0, 'matchScore': 0.8720665, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 7659233, 'positionName': 'Python开发工程师', 'companyId': 125922, 'companyFullName': '广东紫晶信息存储技术股份有限公司', 'companyShortName': '广东紫晶', 'companyLogo': 'i/image/M00/39/2E/Ciqc1F8ffnyAQJRPAAANyRcklQ8336.jpg', 'companySize': '150-500人', 'industryField': '数据服务,其他', 'financeStage': '未融资', 'companyLabelList': ['五险一金', '工龄工资', '上市公司'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['C++', 'Java'], 'positionLables': ['C++', 'Java'], 'industryLables': [], 'createTime': '2020-09-02 15:21:11', 'formatCreateTime': '2020-09-02', 'city': '广州', 'district': '番禺区', 'businessZones': None, 'salary': '9k-14k', 'salaryMonth': '0', 'workYear': '1-3年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '上市公司&五险一金&周末双休', 'imState': 'today', 'lastLogin': '2020-09-14 14:50:11', 'publisherId': 15024490, 'approve': 1, 'subwayline': None, 'stationname': None, 'linestaion': None, 'latitude': '22.978368', 'longitude': '113.370829', 'distance': None, 'hitags': None, 'resumeProcessRate': 38, 'resumeProcessDay': 1, 'score': 0, 'newScore': 0.0, 'matchScore': 0.57019734, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}, {'positionId': 6727278, 'positionName': 'python开发工程师', 'companyId': 329, 'companyFullName': '网易(杭州)网络有限公司', 'companyShortName': '网易', 'companyLogo': 'i/image3/M01/6A/43/Cgq2xl5UxfqAF56ZAABL2r1NdMU394.png', 'companySize': '2000人以上', 'industryField': '电商', 'financeStage': '上市公司', 'companyLabelList': ['节日礼物', '技能培训', '免费班车', '带薪年假'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python'], 'positionLables': ['Python'], 'industryLables': [], 'createTime': '2020-09-09 10:54:35', 'formatCreateTime': '2020-09-09', 'city': '广州', 'district': '天河区', 'businessZones': None, 'salary': '15k-30k', 'salaryMonth': '0', 'workYear': '不限', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '6险1金,带薪年假,免费猪厂食堂,16薪', 'imState': 'sevenDays', 'lastLogin': '2020-09-10 15:05:21', 'publisherId': 7406615, 'approve': 1, 'subwayline': '5号线', 'stationname': '科韵路', 'linestaion': '5号线_科韵路', 'latitude': '23.126291', 'longitude': '113.37322', 'distance': None, 'hitags': None, 'resumeProcessRate': 48, 'resumeProcessDay': 1, 'score': 0, 'newScore': 0.0, 'matchScore': 0.7323122, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': True, 'detailRecall': False}, {'positionId': 7571322, 'positionName': 'python开发工程师', 'companyId': 329, 'companyFullName': '网易(杭州)网络有限公司', 'companyShortName': '网易', 'companyLogo': 'i/image3/M01/6A/43/Cgq2xl5UxfqAF56ZAABL2r1NdMU394.png', 'companySize': '2000人以上', 'industryField': '电商', 'financeStage': '上市公司', 'companyLabelList': ['节日礼物', '技能培训', '免费班车', '带薪年假'], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python'], 'positionLables': ['Python'], 'industryLables': [], 'createTime': '2020-08-27 19:21:59', 'formatCreateTime': '2020-08-27', 'city': '广州', 'district': '天河区', 'businessZones': None, 'salary': '15k-25k', 'salaryMonth': '16', 'workYear': '1-3年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '16薪,平台大,大牛多', 'imState': 'today', 'lastLogin': '2020-09-14 15:16:12', 'publisherId': 6213860, 'approve': 1, 'subwayline': '5号线', 'stationname': '科韵路', 'linestaion': '5号线_科韵路', 'latitude': '23.126291', 'longitude': '113.37322', 'distance': None, 'hitags': None, 'resumeProcessRate': 100, 'resumeProcessDay': 1, 'score': 0, 'newScore': 0.0, 'matchScore': 0.559017, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': True, 'detailRecall': False}, {'positionId': 7636013, 'positionName': 'python开发工程师', 'companyId': 117504394, 'companyFullName': '健康互联(广州)信息科技股份有限公司', 'companyShortName': '健康互联', 'companyLogo': 'i/image3/M01/5B/70/CgpOIF4EahWAa_DzAAAUbVXU9vU336.png', 'companySize': '15-50人', 'industryField': '医疗丨健康,软件开发', 'financeStage': '不需要融资', 'companyLabelList': [], 'firstType': '开发|测试|运维类', 'secondType': '后端开发', 'thirdType': 'Python', 'skillLables': ['Python'], 'positionLables': ['大数据', 'Python'], 'industryLables': ['大数据', 'Python'], 'createTime': '2020-08-28 11:31:38', 'formatCreateTime': '2020-08-28', 'city': '广州', 'district': '天河区', 'businessZones': None, 'salary': '10k-15k', 'salaryMonth': '0', 'workYear': '1-3年', 'jobNature': '全职', 'education': '本科', 'positionAdvantage': '专业大数据团队', 'imState': 'today', 'lastLogin': '2020-09-14 10:20:04', 'publisherId': 12307769, 'approve': 1, 'subwayline': '3号线', 'stationname': '杨箕', 'linestaion': '1号线_杨箕;1号线_体育西路;1号线_体育中心;3号线_珠江新城;3号线_体育西路;3号线_石牌桥;3号线(北延段)_体育西路;5号线_杨箕;5号线_五羊邨;5号线_珠江新城;5号线_猎德;APM线_大剧院;APM线_花城大道;APM线_妇儿中心;APM线_黄埔大道;APM线_天河南;APM线_体育中心南', 'latitude': '23.125234', 'longitude': '113.321916', 'distance': None, 'hitags': None, 'resumeProcessRate': 0, 'resumeProcessDay': 0, 'score': 0, 'newScore': 0.0, 'matchScore': 0.559017, 'matchScoreExplain': None, 'query': None, 'explain': None, 'isSchoolJob': 0, 'adWord': 0, 'plus': None, 'pcShow': 0, 'appShow': 0, 'deliver': 0, 'gradeDescription': None, 'promotionScoreExplain': None, 'isHotHire': 0, 'count': 0, 'aggregatePositionIds': [], 'promotionType': None, 'famousCompany': False, 'detailRecall': False}], 'locationInfo': {'city': '广州', 'district': None, 'businessZone': None, 'isAllhotBusinessZone': False, 'locationCode': None, 'queryByGisCode': False}, 'queryAnalysisInfo': {'positionName': 'python', 'companyName': None, 'industryName': None, 'usefulCompany': False, 'jobNature': None}, 'strategyProperty': {'name': 'dm-csearch-personalPositionLayeredStrategyNew', 'id': 0}, 'hotLabels': None, 'hiTags': None, 'benefitTags': None, 'industryField': None, 'companySize': None, 'positionName': None, 'totalCount': 69, 'triggerOrSearch': False, 'categoryTypeAndName': {'3': 'Python'}}, 'pageSize': 15}, 'resubmitToken': None, 'requestId': None}
"""
list_con = response['content']['positionResult']['result']
info_list = []
for i in list_con:
info = []
info.append(i.get('companyShortName', '无')) # 公司名
info.append(i.get('companyFullName', '无'))
info.append(i.get('industryField', '无')) # 行业领域
info.append(i.get('companySize', '无')) # 公司规模
info.append(i.get('salary', '无')) # 薪资
info.append(i.get('city', '无'))
info.append(i.get('education', '无')) # 学历
info_list.append(info)
print(info_list)
"""
[['深圳道乐', '深圳道乐科技有限公司', '移动互联网,金融', '150-500人', '2k-3k', '广州', '本科'], ['咪佰科技', '广州市咪佰信息科技有限公司', '移动互联网,广告营销', '少于15人', '8k-12k', '广州', '本科'], ['悦谦科技', '广州悦谦科技有限公司', '移动互联网', '50-150人', '15k-30k', '广州', '本科'], ['链乎科技', '链乎(广州)科技有限公司', '软件开发', '少于15人', '10k-15k', '广州', '本科'], ['酷狗音乐', '广州酷狗计算机科技有限公司', '文娱丨内容', '500-2000人', '20k-35k', '广州', '本科'], ['德惟科技', '广州德惟科技有限公司', '金融,移动互联网', '150-500人', '9k-15k', '广州', '本科'], ['京信通信', '京信通信系统(中国)有限公司', '企业服务', '2000人以上', '10k-13k', '广州', '本科'], ['Arts Alliance Media(中国)', '青岛英联艺术传媒有限公司', '数据服务', '50-150人', '15k-26k', '广州', '本科'], ['冰芒果', '深圳市冰芒果科技有限公司', '移动互联网,金融', '150-500人', '8k-13k', '广州', '本科'], ['小米加步枪', '广州小米加步枪网络科技有限公司', '金融,游戏', '15-50人', '10k-18k', '广州', '本科'], ['广州市云润大数据', '广州市云润大数据服务有限公司', '数据服务,移动互联网', '150-500人', '8k-15k', '广州', '大专'], ['广东紫晶', '广东紫晶信息存储技术股份有限公司', '数据服务,其他', '150-500人', '9k-14k', '广州', '本科'], ['网易', '网易(杭州)网络有限公司', '电商', '2000人以上', '15k-30k', '广州', '本科'], ['网易', '网易(杭州)网络有限公司', '电商', '2000人以上', '15k-25k', '广州', '本科'], ['健康互联', '健康互联(广州)信息科技股份有限公司', '医疗丨健康,软件开发', '15-50人', '10k-15k', '广州', '本科']]
"""
import random
import time
import requests
from openpyxl import Workbook
import pymysql.cursors
"""
lagou网爬取
"""
def get_conn():
'''建立数据库连接'''
conn = pymysql.connect(host='localhost', user='root', password='123456', db='python_job',
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
return conn
def insert(conn, info):
'''数据写入数据库'''
with conn.cursor() as cursor:
sql = "INSERT INTO python_jobs (shortname, fullname, industryfield, companySize, salary, city, education) VALUES (%s, %s, %s, %s, %s, %s, %s)"
cursor.execute(sql, info)
conn.commit()
header = {
'User-Agent': 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0',
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
'Accept': 'application/json, text/javascript, */*; q=0.01'
}
def get_json(url, page, lang_name, s, cookie):
'''返回当前页面的信息列表'''
data = {
'first': 'false', 'pn': page, 'kd': lang_name}
json = s.post(url, data=data, headers=header, cookies=cookie, timeout=5).json()
print(json)
list_con = json['content']['positionResult']['result']
info_list = []
for i in list_con:
info = []
info.append(i.get('companyShortName', '无')) # 公司名
info.append(i.get('companyFullName', '无'))
info.append(i.get('industryField', '无')) # 行业领域
info.append(i.get('companySize', '无')) # 公司规模
info.append(i.get('salary', '无')) # 薪资
info.append(i.get('city', '无'))
info.append(i.get('education', '无')) # 学历
info_list.append(info)
return info_list # 返回列表
def main():
# 要爬取的语言
lang_name = 'python'
# 数据的保存
wb = Workbook() # 打开 excel 工作簿
conn = get_conn() # 建立数据库连接 不存数据库 注释此行
# --------------------
# 获得cookies
urls = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
s = requests.Session()
# 获取搜索页的cookies
s.get(urls, headers=header, timeout=3)
# 为此次获取的cookies
cookie = s.cookies
# excel的使用
ws1 = wb.active
ws1.title = lang_name
# 要爬取的网址
url = 'https://www.lagou.com/jobs/positionAjax.json?city=广州&needAddtionalResult=false'
page = 1
while page < 31: # 每个城市30页信息
print('url', url)
# exit(0)
info = get_json(url, page, lang_name, s, cookie)
page += 1
# 调节爬虫间隔
time.sleep(random.randint(10, 20))
# 把数据保存到数据库和excel中
for row in info:
insert(conn, tuple(row)) # 插入数据库,若不想存入 注释此行
ws1.append(row)
conn.close() # 关闭数据库连接,不存数据库 注释此行
wb.save('{}职位信息.xlsx'.format(lang_name)) # 保存excel
if __name__ == '__main__':
main()
sudo service mysql start
mysql -u root -p
数据库:
CREATE DATABASE python_job;
use python_job;
CREATE TABLE python_jobs(shortname text(2000),fullname text(2000),industryfield text(2000),companySize text(2000),salary text(2000),city text(2000),education text(2000));
“INSERT INTO python_jobs (shortname, fullname, industryfield, companySize, salary, city, education) VALUES (%s, %s, %s, %s, %s, %s, %s)”
pymysql.err.InternalError: (1366, “Incorrect string value: ‘\xE7\x9C\x81\xE7\x9C\x81…’ for column ‘shortname’ at row 1”)
解决方法:运行命令 mysql> alter table 表名 convert to character set utf8mb4;
https://mp.weixin.qq.com/s/8wAHBPnQMbcrP9La7WZiJA