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

这一次的抓包数据提取算是完成了,喜欢的小伙伴可以持续关注,后面为大家带来数据如何保存!
https://blog.csdn.net/qq_31848185/article/details/88990196

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值