python数据爬虫——数据分析师岗位基本信息爬取(一)

爬取网址:www.51job.com

1.首先我们来分析需要爬取网站的情况

在51job中输入:数据分析师


2.把URL复制到一个text文本中,分析一下地址。随意的复制三页的地址,找到其中的规律。


对比分析:URL前面都是一样的,在“.html”前的数字不一样,这个数字就是对应的页面。“?”后面的一大串都是格式,对URL地址并没有影响。于是我们只需要截取“?”前的URL


3.这里使用的是谷歌浏览器,在返回结果的页面右键——检查或者使用快捷键Ctrl+shift+i。获取以下界面:


4.选择页面中的箭头按钮,快速定位需要数据的位置。


右键copy——copy xpath地址,多复制几列对比一下:

//*[@id="resultList"]/div[4]/p/span/a

//*[@id="resultList"]/div[5]/p/span/a

//*[@id="resultList"]/div[6]/p/span/a

//*[@id="resultList"]/div[7]/p/span/a


找到规律没?列表是从div[4]开始的。

5.做完准备工作,我们来测试下运行情况。现在开始写代码:

import requests

from lxml import etree

import time

url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,1.html'

data = requests.get(url).text

f = etree.HTML(html)

name = f.xpath('//*[@id="resultList"]/div[4]/p/span/a/@title')

print(name)

输出结果:

[‘Êý¾Ý·ÖÎöʦ’]

发现乱码了,应该中文输出格式的问题,每个网站使用的编码方式可能不一样,在出现乱码的时候多换几个编码方式尝试下。

我们这里添加上encode(‘ISO 8859-1’)进行转码试试。

url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,1.html'

data = requests.get(url).text

html=data.encode('ISO 8859-1')

f = etree.HTML(html)

name = f.xpath('//*[@id="resultList"]/div[4]/p/span/a/@title')

print(name)

运行结果:

[‘行业数据分析师’]

6.接着完善其公司名称、薪资等信息。

import requests

from lxml import etree

import time

url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,1.html'

data = requests.get(url).text

html=data.encode('ISO 8859-1')

f = etree.HTML(html)

name = f.xpath('//*[@id="resultList"]/div[4]/p/span/a/@title')

company = f.xpath('//*[@id="resultList"]/div[4]/span[1]/a/text()')

address = f.xpath('//*[@id="resultList"]/div[4]/span[2]/text()')

money = f.xpath('//*[@id="resultList"]/div[4]/span[3]/text()')

print(name,company,address,money)


运行结果:

[‘数据分析师(3776)’] [‘完美世界(北京)总部/完美时空’] [‘北京’] [‘1-1.5万/月’]

7.为了显示当前页所有的数据,我们根据前面xpath路径的对比,我们把路径修改一下试试。

//*[@id="resultList"]/div[4]/p/span/a/@title

//*[@id="resultList"]/div/p/span/a/@title

运行结果:

[‘行业数据分析师’, ‘金融数据分析师(出国进修)’, ‘数据分析师’, ‘数据分析师(环保方向)’, ‘数据分析师’, ‘急聘 数据分析师 无经验可培训’, ‘数据分析师’, ‘高级数据分析师’, ‘数据分析师’, ‘电商数据分析师’, ‘数据分析师’, ‘数据分析师(朝九晚五+双休)’, ‘数据分析师’, ‘金融数据分析师(非销售,室内工作,不加班)’, ‘数据分析师’, ‘数据分析师’, ‘高级数据分析师(新疆)’, ‘数据分析师’, ‘华为—数据分析师’, ‘仓库数据分析师’, ‘数据分析师’, ‘资深数据分析师’, ‘数据分析师’, ‘大数据分析师’, ‘数据分析师(西咸新区物流园区)’, ‘数据分析师(中国制造网)’, ‘数据分析师’, ‘数据挖掘工程师(数据分析师)’, ‘数据分析师’, ‘数据分析师’, ‘金融数据分析师(留学生优先+股票交易者优先)’, ‘数据分析师(商品) (MJ000834)’, ‘投资数据分析师助理(底薪4000+双休+奖金)五险一金’, ‘数据分析师’, ‘a(0经验可培养)金融数据分析师/助理’, ‘数据分析师/资深数据分析师(数据运营)’, ‘数据分析师’, ‘BI数据分析师’, ‘坐班无责底薪6000起+金融数据分析师/助理+五险双休’, ‘金融数据分析师助理(底薪4800+五险一金)’, ‘数据分析师’, ‘金融数据分析师助理(高薪6000+提成+五险)’, ‘数据分析师’, ‘数据分析师助理(底薪4.5K+奖金+双休)’, ‘投资数据分析师(双休+五险)’, ‘数据分析师(双休+五险)’, ‘数据分析师’, ‘数据分析师’, ‘高级BI数据分析师’, ‘数据分析师(大数据方向)’]

8.在提取公司名称、薪资和工作地点时,发现了以下情况:

//*[@id="resultList"]/div[4]/p/span/a/

//*[@id="resultList"]/div[4]/span[1]/a#公司名称

//*[@id="resultList"]/div[4]/span[2]#薪资

//*[@id="resultList"]/div[4]/span[3]#工作地址

8.这里我们可以看到div[4]都是一样的。根据前面的结果,我们把[4]都删掉,写个for循坏语句,让内容逐条输出:

import requests

from lxml import etree

import time

url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,1.html'

data = requests.get(url).text

html=data.encode('ISO 8859-1')

f = etree.HTML(html)

PATH = f.xpath('//*[@id="resultList"]/div')

for div in PATH:

    name = div.xpath('./p/span/a/@title')

    company = div.xpath('./span[1]/a/text()')

    address = div.xpath('./span[2]/text()')

    money = div.xpath('./span[3]/text()')

    print(name,company,address,money)

9.在输出的结果中,我们会发现在开始和结束中,发现很多空值。我们来重新检查一下网页。原来忽略了数据是从div[4]开始的,div[53]结束的。

我们来加上一段起止循环语句试试:

import requests

from lxml import etree

import time

url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,1.html'

data = requests.get(url).text

html=data.encode('ISO 8859-1')

f = etree.HTML(html)

for j in range(4,54):

    PATH = ('//*[@id="resultList"]/div[{}]').format(j) 

    PATH1 = f.xpath(PATH)

    for div in PATH1:

        name = div.xpath('./p/span/a/@title')

        company = div.xpath('./span[1]/a/text()')

        address = div.xpath('./span[2]/text()')

        money = div.xpath('./span[3]/text()')

        print(name,company,address,money)

        time.sleep(1)#时间间隔。防止被封IP

10.我们再把多页的内容进行输出,这里把前面分析出来的URL规律就能用上了。

for i in range(1,10):

    url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,'

    url1 = url+str(i)+str('.html')

我们原来URL尾部数值进行处理,使用for语句进行循环。range的数值,根据我们需要爬取的页数确认。这里设置的范围为1~10页的数据。

最终代码:

import requests

from lxml import etree

import time

for i in range(1,10):

    url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,'

    url1 = url+str(i)+str('.html')

    data = requests.get(url1).text

    html=data.encode('ISO 8859-1')

    f = etree.HTML(html)


    for j in range(4,54):

        PATH = ('//*[@id="resultList"]/div[{}]').format(j) 

        PATH1 = f.xpath(PATH)

        for div in PATH1:

            name = div.xpath('./p/span/a/@title')

            company = div.xpath('./span[1]/a/text()')

            address = div.xpath('./span[2]/text()')

            money = div.xpath('./span[3]/text()')

            print(name,company,address,money)

            time.sleep(1)#时间间隔。防止被封IP

这一次的抓包数据提取算是完成了,喜欢的小伙伴可以持续关注,后面为大家带来数据如何保存!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容