python爬虫 requests+lxml爬取前程无忧网之模拟浏览器登录

“前程无忧”(Nasdaq: JOBS) : 是国内一个集多种媒介资源优势的专业人力资源服务机构,创始人为甄荣辉。它集合了传统媒体、网络媒体及先进的信息技术,加上一支经验丰富的专业顾问队伍,提供包括招聘猎头、培训测评和人事外包在内的全方位专业人力资源服务,现在全国25个城市设有服务机构。2004年9月,前程无忧成为第一个在美国纳斯达克上市的中国人力资源服务企业,是中国最具影响力的人力资源服务供应商之一。经第三方监测机构iResearch 等调查,连续多年市场占有率第一。无忧工作网先后多次被CNNIC、Alexa 和Euromonitor评为“中国最具影响力的人才招聘网站”。

前程无忧官网https://www.51job.com/
时间: 2019/08/10
爬取内容: 职位名称,公司名称,工资,地点,发布时间。

操作环境: win10, python3.6, jupyter notebook,谷歌浏览器

技术实现思路:

1. 注册登录前程无忧
2. 分析网页
3. 请求网页
4. 提取数据
5. 保存数据
6. 全部源码

思路分步讲解

1. 注册登录前程无忧

打开前程无忧的官网,并不能直接搜索信息,它会提醒你先注册。登录成功后就不需要再次注册了,后来发现这台电脑的其他浏览器都不需要注册也可以直接搜索职位信息了。我在手机的浏览器打开前程无忧网,还是需要注册的。
在这里插入图片描述

2. 分析网页

2.1、现在登录成功了,搜索python,地点选择贵州,搜索

在这里插入图片描述

2.2、查看网页源代码(Ctrl+U)

查找(Ctrl+F)网页中的数据,最好选择公司名称这类不容易重复的内容,便于精确查找,如:广州欢创劳务派遣有限公司
在这里插入图片描述
结果: 在HTML源码中找到了需要的数据,说明我们可以从网页源码中提取信息

2.3、网页分析路径

HTML源码对应的URL就是浏览器导航栏的URL,把它复制下来就可以请求网页了。
在这里插入图片描述
本次搜索的关键词有两个页面,就需要对比它们的路径,实现页面跳转。通过对比测试,发现页面由它控制的。
在这里插入图片描述

3. 请求网页

3.1、查看网页的请求方式,它的请求方法是get

在这里插入图片描述

3.2、设置headers

haeders用来告诉服务器,这是一个浏览器发出的请求,达到反爬虫的目的,其中放Referer,Cookie,User-Agent等

  • Referer:反爬虫路径
  • Cookie:存放用户登录信息
  • User-Agent:浏览器的信息
3.3、网页使用gbk编码方式

在这里插入图片描述

扫描二维码关注公众号,回复: 8853415 查看本文章
3.4、发出请求获取html源码
import requests

url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='
#设置请求头
headers={
    'Cookie': 'uid=6120d9ad9342bd596063a1caa5e700c8; nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; _ujz=MTYxNTY1MjMxMA%3D%3D; ps=needv%3D0; adv=adsnew%3D0%26%7C%26adsnum%3D2199132%26%7C%26adsresume%3D1%26%7C%26adsfrom%3Dhttps%253A%252F%252Fwww.baidu.com%252Fbaidu.php%253Fsc.000000jk39biGWe9FCyuShty_aMNHEWD5_pNXOAJq5oBMfqtVdPak5nCc0CSoecJnK-czyQKCC745-ZJ0OVxI7zG83PuLrGEKFp9GiGH-j1bNMOrZrlcqbkfzay5GMMW0egdYl66KlxgR5qC8Shed0Qu_GDCTWt1UZp0fqrNfmzHgkNGgtkCMLZO5gAQlRdUO5moyBIhZe56aN5bX6.Db_NR2Ar5Od66CHnsGtVdXNdlc2D1n2xx81IZ76Y_u2qSSEWbl_4TUj5eOS8zZqOSFYOoYUlj5ZtSjtElZdq-SHe35SkbLY5dtxqTglS54pPO3e3et-LYxtjWOvrWqXhJzOqE66ObwxegYgOCNEOeZeIZV8OUSEUdeyPbPpUDSr1FIIbzgfLqhiex3GuzuQ8-5HvUO7i_nYQZA1__R0.U1Yk0ZDqPH7JUvc0TA-W5H00IjdJUvc0pyYqnW0Y0ATqTZFB0ZNG5yF9pywd0ZKGujYkn0KWpyfqnHD30AdY5HDsnHIxnH0krNtknjfYg1nvnjD0pvbqn0KzIjY4n100uy-b5HDYPW-xnWDsrH7xnWbdnWPxnWbdnWKxnWbsrH-xnWbdPW9xnW63n1IxnWbznWKxnWm1PHKxnWbYPWKxnWbvPj00mhbqnHRdg1Ddr7tznjf0UynqnH6zrHbsrj6zrNtknj0kg1Dsn-ts0Z7spyfqn0Kkmv-b5H00ThIYmyTqn0K9mWYsg100ugFM5H00TZ0qnWbLPH0snjn1P6K8IM0qna3snj0snj0sn0KVIZ0qn0KbuAqs5H00ThCqn0KbugmqTAn0uMfqn0KspjYs0Aq15H00mMTqnH00UMfqn0K1XWY0mgPxpywW5gK1QyPV0A-bm1dRfsKYIgnqnHc4nHRknjmdrHRLnWf4nW63nWn0ThNkIjYkPHmdn1R3P1fzrjn40ZPGujdhuhfYuHnLm10snAm4nHF-0AP1UHdAf1b4nWmLrjRznbNaP1wK0A7W5HD0TA3qn0KkUgfqn0KkUgnqn0KlIjYk0AdWgvuzUvYqn7tsg1DsPjuxn0Kbmy4dmhNxTAk9Uh-bT1Ysg1Kxn1n3Pjc4Pdts0ZK9I7qhUA7M5H00uAPGujYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KkUymqn0KhmLNY5H00XMK_Ignqn0K9uAu_myTqnfK_uhnqn0KEIjYs0AqzTZfqnanscznsc10WnansQW0snj0snansczns0APzm1Y1PjD1n6%2526word%253D51job%2526ck%253D4702.2.127.285.564.290.550.423%2526shh%253Dwww.baidu.com%2526us%253D1.0.1.0.0.0.0%2526bc%253D110101; slife=lowbrowser%3Dnot%26%7C%26lastlogindate%3D20190809%26%7C%26securetime%3DVWkANlk5A2ICY1NoWmlaOVNhBDY%253D; track=registertype%3D1; 51job=cuid%3D161565231%26%7C%26cusername%3Dphone_13124677419_201908097566%26%7C%26cpassword%3D%26%7C%26cname%3D%25D1%25EE%25D3%25D1%26%7C%26cemail%3Dayouleyang%2540qq.com%26%7C%26cemailstatus%3D0%26%7C%26cnickname%3D%26%7C%26ccry%3D.0z6DBWuU5bQc%26%7C%26cconfirmkey%3D%25241%2524Z.XBF.fe%2524p7gSHeS%252Fox4niAc8IxBDw0%26%7C%26cresumeids%3D.0ZJUV4DUrVTU%257C%26%7C%26cautologin%3D1%26%7C%26cenglish%3D0%26%7C%26sex%3D0%26%7C%26cnamekey%3D%25241%25249.n6uUi.%2524xZtxv4qHPoyz%252FYLZm734Z.%26%7C%26to%3D82c7f22825d5faf5a3b114afc23ff27f5d4d7adf%26%7C%26; search=jobarea%7E%60000000%7C%21ord_field%7E%600%7C%21recentSearch0%7E%601%A1%FB%A1%FA000000%2C00%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FApython%A1%FB%A1%FA2%A1%FB%A1%FA%A1%FB%A1%FA-1%A1%FB%A1%FA1565241481%A1%FB%A1%FA0%A1%FB%A1%FA%A1%FB%A1%FA%7C%21recentSearch1%7E%601%A1%FB%A1%FA260200%2C00%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FApython%A1%FB%A1%FA2%A1%FB%A1%FA%A1%FB%A1%FA-1%A1%FB%A1%FA1565362675%A1%FB%A1%FA0%A1%FB%A1%FA%A1%FB%A1%FA%7C%21',
    'Referer': 'https://search.51job.com/list/260200,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
res = requests.get(url,headers=headers)#发出请求
res.encoding = 'gbk'#这个网页使用gbk编码
print (res.text) #输出的内容和网页源码一样

4. 提取数据

4.1、使用etree解析网页
from lxml import etree
html = etree.HTML(res.text) #etree解析网页

输出结果:
<Element html at 0x2905f362408>
解析成功,当然,这不是拿给我们看的。

4.2、定位网页节点

在这里插入图片描述
通过检查,发现每条招聘信息都在<div class="el"> </div>中,先复制它的节点,再迭代查找出里面的内容。
在这里插入图片描述

//*[@id="resultList"]/div[4] #这指的是id 为resultList的第四个div

#应该改为
'//*[@id="resultList"]/div'
#因为要获取所有的resultList的所有div
4.3、提取数据
4.3.1、分别判断是否为空再爬取每条数据
for et in html.xpath('//*[@id="resultList"]/div'):
    jobName = et.xpath('./p/span/a/@title')
    if len(jobName) !=0:
        jobName = jobName[0]
    name = et.xpath('./span[1]/a/@title')      
    if len(name) !=0:
        name = name[0]
    city= et.xpath('./span[2]/text()')
    if len(city) !=0:
        city = city[0]
    
    salary = et.xpath('.//span[3]/text()')
    if len(salary) !=0:
        salary = salary[0]
    time = et.xpath('.//span[4]/text()')
    if len(time) !=0:
        time = time[0]    
    print (jobName,name,city,salary,time)

输出结果开头:
输出结果开头
输出结果结尾:
输出结果结尾
出现这种状况可能的原因:
(1)html属性同一,不能准确定位,也是注意原因
(2)html数据被隐藏,没有展示

4.3.2、爬取每条数据后一起判断是否为空
for et in html.xpath('//*[@id="resultList"]/div'):
    jobName = et.xpath('./p/span/a/@title')
    name = et.xpath('./span[1]/a/@title')
    city= et.xpath('./span[2]/text()')
    salary = et.xpath('.//span[3]/text()')
    time = et.xpath('.//span[4]/text()')
    if len(jobName)&len(name)&len(city)&len(salary)&len(time) !=0: #判断所有信息不为空再输出
        jobName = jobName[0] #[0]输出数组中的第一个值
        name = name[0]
        city = city[0]
        salary = salary[0]
        time = time[0] 
        print (jobName,name,city,salary,time)

输出结果:

Python 软件工程师 贵州爱水水务技术工程有限公司 贵阳 7-9千/月 08-09
Python开发工程师(证券) 东方财富信息股份有限公司 上海-徐汇区 1.5-2.5万/月 08-09
Python开发工程师 慧承(上海)供应链科技有限公司大连分公司 大连 0.6-1万/月 08-09
Python工程师 深圳市世纪恒程知识产权代理事务所 武汉-东湖新技... 6-8千/月 08-09
初级python/R 工程师 上海柯林布瑞信息技术有限公司 上海-徐汇区 0.5-1万/月 08-09
Python高级开发工程师 湖南合天智汇信息技术有限公司 长沙-岳麓区 0.8-1.4万/月 08-09
Python高级开发工程师 合肥市合趣网络科技有限公司 合肥 1.5-2万/月 08-09
Python开发工程师 南京新立讯科技股份有限公司 南京-雨花台区 1-1.5万/月 08-09
Python开发工程师(见习) 上海新帆实业股份有限公司 上海-浦东新区 6-8千/月 08-09
上位机Python软件工程师 深圳市泰达机器人有限公司 深圳-南山区 0.8-1万/月 08-09
Python 后台开发工程师 上海媒智科技有限公司 上海-徐汇区 1.1-2万/月 08-09
Python开发 上海汉图科技有限公司 上海-浦东新区 1.5-2.3万/月 08-09
教学老师(python和scratch) 杭州智一信息技术有限公司 杭州-西湖区 1-1.5万/月 08-09
Python开发工程师 上海飞络信息科技有限公司 上海 0.8-1万/月 08-09
Python开发工程师 亚信科技(成都)有限公司 南京-雨花台区 1.3-2.5万/月 08-09
Python开发工程师 重庆商盟科技有限公司 重庆-江北区 0.8-1.5万/月 08-09
Python讲师 带薪年假 湖南潭州教育网络科技有限公司成都分公司 成都-武侯区 0.8-1.2万/月 08-09
python 开发工程师 善诚科技发展(上海)有限公司 无锡-无锡新区 6-8千/月 08-09
Python开发工程师 北京联创众升科技有限公司 北京-海淀区 1-1.5万/月 08-09
Python高级开发工程师 河北燕雀信息科技有限公司 异地招聘 0.6-1.2万/月 08-09
PYTHON开发工程师 北京斐波科技有限公司 天津-津南区 1-2万/月 08-09
Python工程师(爬虫方向)+包住宿+周末双休+五险一金 深圳市中源航空服务有限公司 深圳 1.5-2.5万/月 08-09
Python开发工程师(实习生) 四川懿晟国际教育咨询有限公司 成都-高新区 3-4.5千/月 08-09
Python游戏服务端高级开发 湖南纳米娱乐网络科技有限公司 长沙-岳麓区 1-2万/月 08-09
Scratch/Python课程设计师 立乐教育科技(上海)有限公司 上海-普陀区 0.8-1.5万/月 08-09
Python运维工程师 桑田智能技术(上海)有限公司 上海-宝山区 1.8-2.5万/月 08-09
后台开发工程师(C++,Python,go) 深圳市云之梦科技有限公司 深圳-南山区 1-1.5万/月 08-09
高级软件工程师 (python/Java) 吉林省掌控物流科技有限公司 长春-净月经济... 0.8-1.5万/月 08-09
python开发工程师 郑州创恒实业有限公司 郑州-金水区 0.5-1万/月 08-09
Python高级开发工程师 广州回头车信息科技有限公司 广州-天河区 1.5-2.5万/月 08-09
软件助理(python) 深圳市嘉卉互联科技有限公司 深圳 4.5-5.5千/月 08-09
资深python工程师 上海展湾信息科技有限公司 上海-杨浦区 1-1.5万/月 08-09
自动化测试工程师python、c 上海迅元信息科技有限公司 上海-浦东新区 1-1.5万/月 08-09
Python开发工程师 深圳市紫川软件有限公司 上海-浦东新区 1-1.5万/月 08-09
Python开发工程师 小水滴科技 上海-浦东新区 1-1.5万/月 08-09
python开发助理 深圳市文言科技发展有限公司 深圳 6-8千/月 08-09
Python实习生 重庆且动科技有限公司 成都-青羊区 4.5-6千/月 08-09
Python爬虫工程师 成都领优文化传播有限公司 成都-高新区 0.8-1万/月 08-09
Python后台开发工程师 尤盛信息技术(上海)有限公司 上海-浦东新区 1.2-2.2万/月 08-09
Python高级开发工程师(代外企直招) 上海环籁网络科技有限公司 上海-浦东新区 1.5-3万/月 08-09
研发工程师(运维、python语言) 安美微客(北京)互联网科技有限公司 上海-普陀区 1-1.5万/月 08-09
Python开发工程师 深圳软通智能系统科技有限公司 深圳-龙岗区 5.5-7千/月 08-09
Python开发工程师 广州国交润万交通信息有限公司 广州 0.8-1.5万/月 08-09
Python开发工程师 武汉市星商电子商务有限公司 武汉-洪山区 1-1.5万/月 08-09
python开发(大数据方向) 赛速科技 西安-雁塔区 6-8千/月 08-09
Python ERP软件开发工程师 广州高博软件科技有限公司 广州-黄埔区 0.8-1.3万/月 08-09
高级python开发工程师(简单家APP) 易居(中国)企业管理集团有限公司 上海-静安区 1.8-2.3万/月 08-09
Python大数据及算法工程师 成都长益西联软件有限公司 成都-高新区 0.8-1.6万/月 08-09

5. 保存数据

把获取的信息写进csv文件,分为三个步骤:

  1. 打开csv文件
  2. 写入信息
  3. 关闭文件

如果乱码,可使用Excel表格,在数据>自文本>改Tab键为逗号>打开

6、全部源码

import requests,csv
from lxml import etree
#制作头部信息
headers={
    'Cookie': 'uid=6120d9ad9342bd596063a1caa5e700c8; nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; _ujz=MTYxNTY1MjMxMA%3D%3D; ps=needv%3D0; adv=adsnew%3D0%26%7C%26adsnum%3D2199132%26%7C%26adsresume%3D1%26%7C%26adsfrom%3Dhttps%253A%252F%252Fwww.baidu.com%252Fbaidu.php%253Fsc.000000jk39biGWe9FCyuShty_aMNHEWD5_pNXOAJq5oBMfqtVdPak5nCc0CSoecJnK-czyQKCC745-ZJ0OVxI7zG83PuLrGEKFp9GiGH-j1bNMOrZrlcqbkfzay5GMMW0egdYl66KlxgR5qC8Shed0Qu_GDCTWt1UZp0fqrNfmzHgkNGgtkCMLZO5gAQlRdUO5moyBIhZe56aN5bX6.Db_NR2Ar5Od66CHnsGtVdXNdlc2D1n2xx81IZ76Y_u2qSSEWbl_4TUj5eOS8zZqOSFYOoYUlj5ZtSjtElZdq-SHe35SkbLY5dtxqTglS54pPO3e3et-LYxtjWOvrWqXhJzOqE66ObwxegYgOCNEOeZeIZV8OUSEUdeyPbPpUDSr1FIIbzgfLqhiex3GuzuQ8-5HvUO7i_nYQZA1__R0.U1Yk0ZDqPH7JUvc0TA-W5H00IjdJUvc0pyYqnW0Y0ATqTZFB0ZNG5yF9pywd0ZKGujYkn0KWpyfqnHD30AdY5HDsnHIxnH0krNtknjfYg1nvnjD0pvbqn0KzIjY4n100uy-b5HDYPW-xnWDsrH7xnWbdnWPxnWbdnWKxnWbsrH-xnWbdPW9xnW63n1IxnWbznWKxnWm1PHKxnWbYPWKxnWbvPj00mhbqnHRdg1Ddr7tznjf0UynqnH6zrHbsrj6zrNtknj0kg1Dsn-ts0Z7spyfqn0Kkmv-b5H00ThIYmyTqn0K9mWYsg100ugFM5H00TZ0qnWbLPH0snjn1P6K8IM0qna3snj0snj0sn0KVIZ0qn0KbuAqs5H00ThCqn0KbugmqTAn0uMfqn0KspjYs0Aq15H00mMTqnH00UMfqn0K1XWY0mgPxpywW5gK1QyPV0A-bm1dRfsKYIgnqnHc4nHRknjmdrHRLnWf4nW63nWn0ThNkIjYkPHmdn1R3P1fzrjn40ZPGujdhuhfYuHnLm10snAm4nHF-0AP1UHdAf1b4nWmLrjRznbNaP1wK0A7W5HD0TA3qn0KkUgfqn0KkUgnqn0KlIjYk0AdWgvuzUvYqn7tsg1DsPjuxn0Kbmy4dmhNxTAk9Uh-bT1Ysg1Kxn1n3Pjc4Pdts0ZK9I7qhUA7M5H00uAPGujYs0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KkUymqn0KhmLNY5H00XMK_Ignqn0K9uAu_myTqnfK_uhnqn0KEIjYs0AqzTZfqnanscznsc10WnansQW0snj0snansczns0APzm1Y1PjD1n6%2526word%253D51job%2526ck%253D4702.2.127.285.564.290.550.423%2526shh%253Dwww.baidu.com%2526us%253D1.0.1.0.0.0.0%2526bc%253D110101; slife=lowbrowser%3Dnot%26%7C%26lastlogindate%3D20190809%26%7C%26securetime%3DVWkANlk5A2ICY1NoWmlaOVNhBDY%253D; track=registertype%3D1; 51job=cuid%3D161565231%26%7C%26cusername%3Dphone_13124677419_201908097566%26%7C%26cpassword%3D%26%7C%26cname%3D%25D1%25EE%25D3%25D1%26%7C%26cemail%3Dayouleyang%2540qq.com%26%7C%26cemailstatus%3D0%26%7C%26cnickname%3D%26%7C%26ccry%3D.0z6DBWuU5bQc%26%7C%26cconfirmkey%3D%25241%2524Z.XBF.fe%2524p7gSHeS%252Fox4niAc8IxBDw0%26%7C%26cresumeids%3D.0ZJUV4DUrVTU%257C%26%7C%26cautologin%3D1%26%7C%26cenglish%3D0%26%7C%26sex%3D0%26%7C%26cnamekey%3D%25241%25249.n6uUi.%2524xZtxv4qHPoyz%252FYLZm734Z.%26%7C%26to%3D82c7f22825d5faf5a3b114afc23ff27f5d4d7adf%26%7C%26; search=jobarea%7E%60000000%7C%21ord_field%7E%600%7C%21recentSearch0%7E%601%A1%FB%A1%FA000000%2C00%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FApython%A1%FB%A1%FA2%A1%FB%A1%FA%A1%FB%A1%FA-1%A1%FB%A1%FA1565241481%A1%FB%A1%FA0%A1%FB%A1%FA%A1%FB%A1%FA%7C%21recentSearch1%7E%601%A1%FB%A1%FA260200%2C00%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FApython%A1%FB%A1%FA2%A1%FB%A1%FA%A1%FB%A1%FA-1%A1%FB%A1%FA1565362675%A1%FB%A1%FA0%A1%FB%A1%FA%A1%FB%A1%FA%7C%21',
    'Referer': 'https://search.51job.com/list/260200,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
#创建CSV文件
fp = open('G:\51job.csv','a',newline='',encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(('职位名称','公司名称','地址','薪资','时间')) #csv头部
#网页跳转    
for i in range(2):
    url = f'https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,{i}.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='
    res = requests.get(url,headers=headers)
    res.encoding = 'gbk'
    html = etree.HTML(res.text) #etree解析网页
    #爬取数据
    for et in html.xpath('//*[@id="resultList"]/div'):
        jobName = et.xpath('./p/span/a/@title')
        name = et.xpath('./span[1]/a/@title')
        city= et.xpath('./span[2]/text()')
        salary = et.xpath('.//span[3]/text()')
        time = et.xpath('.//span[4]/text()')
        if len(jobName)&len(name)&len(city)&len(salary)&len(time) !=0:#判断所有信息不为空再输出
            jobName = jobName[0]#[0]输出数组中的第一个值
            name = name[0]
            city = city[0]
            salary = salary[0]
            time = time[0] 
            print (jobName,name,city,salary,time)
            writer.writerow((jobName,name,city,salary,time))#写入数据
    #关闭文件        
fp.close()

表格结果:
在这里插入图片描述

发布了62 篇原创文章 · 获赞 25 · 访问量 9331

猜你喜欢

转载自blog.csdn.net/ayouleyang/article/details/98996673