作为一名学gis的小白,初学Python总想爬点与gis相关的数据,梦想将gis与Python完美结合,成为一名会编程的giser,然后走上人生巅峰,一夜暴富,嫁给高富帅…奈何理想很丰满,现实很骨感,看到师兄师姐有转行的,有继续深造的,还有没找到工作的,内心慌得不行,于是就想爬一下gis招聘岗位,了解一下行情,废话不多说,进入正题。
寻找目标网站
这次找的是前程无忧网站,看了好几个网站,这个网站的gis招聘岗位最多了,其他网站gis岗位都比较少,数据少就没有说服力啊,拉勾网gis岗位倒是不少,但是人家反爬措施做的太到位了,我这个Python小白破解不了啊,还是老老实实找个好爬一点的网站吧,网站链接如下:
前程无忧gis全国招聘岗位
链接稍微有点长,但是没关系,很多参数我们不用关心。F12键打开浏览器开发者工具,可以看到使用的是get请求,而且XHR中没有内容,证明不是Ajax加载的,研究了一下,这个网站也没有啥反爬措施,所以只需要解析页面,常规爬取就可以了
解析网页
先简单看一下,每个页面有50条数据,一共有99页,数据量还算不错,但是我们要爬取的数据并不是在这一页,而是点开招聘岗位,进入详情页。
这里面有我们需要的数据,这次我爬取的是岗位名称,所述公司,工作地点,月薪,也就是页面左上方这一块,所以我们爬取的时候要先获取详情页的url,然后再解析详情页,获得数据。
由于一共有99页,所以要做翻页处理,这就需要观察一下不同页面URL的变化了
https://search.51job.com/list/000000,000000,0000,00,9,99,gis,2,1.html 第一页
https://search.51job.com/list/000000,000000,0000,00,9,99,gis,2,2.html 第二页
https://search.51job.com/list/000000,000000,0000,00,9,99,gis,2,3.html 第三页
这里我只截取了url的前面部分,因为后面参数是不变化的,所以不用考虑,这个网站翻页做的也比较简单,只看一眼,就知道咋回事了,只是变化了html前面的一个字符串,就完成了翻页效果。
接下来需要看一下HTML源代码,找到详情页的url链接,每一条岗位信息都在class=‘el’的div标签中,url链接在子标签a的href属性中,解析完页面,就可以撸代码了。
撸代码
大概流程:使用request获取html页面,然后用xpath解析网页,并将数据保存到Excel表中
import requests
from lxml import etree #使用xpath解析网页
from xlrd import open_workbook #将数据存储到Excel中
from xlutils.copy import copy
#向网页发起get请求,得到response响应,获取源网页,以下代码可作为通用代码
def getHTMLext(url):
try:
kv = {'user-agent':'Mozilla/5.0'}
r=requests.get(url,headers = kv) #这里网页没有设置反爬,所以不需要使用代理ip或者cookies,直接提交就行了
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return '产生异常'
#获取每条招聘信息的url链接,然后解析详情页,爬取数据
def getAllUrl(html):
try:
selec= etree.HTML(html)
url = selec.xpath('//div[@class ="el"]/p[1]/span/a/@href') #获取url链接
list =[]
for u in url:
r= getHTMLext(u) #调用getHTMLext()函数返回详情页html
selector = etree.HTML(r) #使用xpath解析网页
position = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/h1/@title')
company = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[1]/a[1]/@title')
salary = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/strong/text()')
adress = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/@title')
list.append([str(position),str(company),str(salary),str(adress)]) #将岗位名称、公司、薪水等数据保存在list列表中
print('正在写入Excel中......')
path = r'E:\pachong result\gis.xls' #以下部分将爬取数据保存到Excel中
rexcel = open_workbook(path) # 用wlrd提供的方法读取一个excel文件
rows = rexcel.sheets()[0].nrows # 用wlrd提供的方法获得现在已有的行数
excel = copy(rexcel) # 用xlutils提供的copy方法将xlrd的对象转化为xlwt的对象
table = excel.get_sheet(0) # 用xlwt对象的方法获得要操作的sheet
row = rows
for product in list:
table.write(row, 0, product[0].replace('[', '').replace(']', '').replace("'", ''))
table.write(row, 1, product[1].replace('[', '').replace(']', '').replace("'", ''))
table.write(row, 2, product[2].replace('[', '').replace(']', '').replace("'", ''))
table.write(row, 3, product[3].replace('[', '').replace(']', '').replace('\\xa0\\xa0', '').replace("'", ''))
row += 1
excel.save(path)
except Exception as e:
print(e)
#定义主函数
def main():
for i in range(1,100): #一共99页,这里使用for循环,达到翻页效果
print('正在获取第' + str(i) + '页url.....')
start_url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,gis,2,'
last_url = '.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=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='
all_url = start_url + str(i) + last_url
html = getHTMLext(all_url) #调用getHTMLext(all_url)函数获取每个岗位的详情链接
getAllUrl(html) #调用 getAllUrl( html ) 解析详情页,获取数据,保存至Excel中
print('第'+str(i)+'页''写入excel成功')
main()
虽然中间经历了诸多坎坷,最终还是把数据给爬下来了,太不容易了…
保存到Excel中的数据就长这样子,接下来就要进行数据清洗了,比如去除重复数据(爬取过程中可能会出错),整理数据等等,这部分用Python也能完成,但是本人学艺不精,而且爬下来的数据量也不是太大,所以就直接在Excel中处理了,处理过程很简单,毕竟Excel功能也很强大,处理过后一共有4351条数据,至此,数据爬取部分已全部完成。