近期公司开始着手大数据,python当然是一门必学语言,原来一直干的是Java,所以学python也不是太费力,看了大半天熟悉代码的语法和一些基本知识。当然我是崇尚实战的,不会多看这些理论,一般都是拿一个项目来写写,遇到问题对点解决,也能加快点步伐。当然就少不了爬虫了,python入门的一个练手级别项目,因此自己参考资料琢磨一个58的大数据职位分析,也就简单的几个方法。
实现起来并不会太复杂,如下就是步骤:
- 首先找到一个58的招聘网址,找到源码,然后寻找需要匹配的信息的HTML元素
- 编写正则,去匹配你需要获取信息的那部分代码
- 从匹配到的代码中筛选出你需要的信息
- 将信息加工,存到txt文件中
实际上实现一个爬虫无非就是这几个步骤,在我们编写的过程中需要用到urllib2,他有访问你要爬的网址的工具类,可以获取到你想要怕的网址的源代码,有了源代码以后,就要看你的正则水平了,最好把正则这块好好学习一下,否则你就有可能看着信息但是不知道匹配的正则怎么写。
也不多说了,直接上代码,这些代码都不难,若是你学了python(即使你只是学了两天也就够了),看懂这些幼儿园级别的代码应该不是问题,没有什么好解释的地方
import urllib2
import re
class Spider:
'''
58的 一个 爬虫类
'''
def __init__(self):
self.enable = True
self.page = 1 #当前要爬去第几页
def load_page(self, page):
'''
发送58url请求,得到html源码
'''
#爬虫要爬的页面链接
url="http://tj.58.com/job/pn"+str(page)+"/?key=大数据"
#request的headers中的user_agent属性
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
headers = {"User-Agent": user_agent}
req = urllib2.Request(url, headers = headers)
response = urllib2.urlopen(req)
html = response.read()
#增则表达式匹配所有需要的信息
#在正则中的所有(...)都会被识别并且会将这里面的匹配项给筛选出来,
#其中有好多需要作为一个整体的表达式时会用到(),所以筛选出来的元组元素会有空串
pattern = re.compile(r'<span(\s|\s*)class="address.*?".*?>(.*?)</span>.*?<span.*?class="name">(.*?)</span>.*?<i(\s|\s*)class="icons.*?im-chat".*?data-im=.*?></i>.*?<p(\s|\s*)class="job_salary">(.*?)<i(\s|\s*)class="unit">.*?(title="(.*?)")', re.S)
item_list = pattern.findall(html)
return item_list
def deal_one_page(self, item_list, page):
'''
处理一页的数据
'''
print "正在存储第%d 页大数据职位信息" %(page)
for item in item_list:
print "\n地址:"+item[1]+" \n职位:"+item[2]+"\n薪资:"+item[5]+"\n公司:"+item[7].replace("title=","").replace("\"","")
str_=str("\n地址:"+item[1]+" \n职位:"+item[2]+"\n薪资:"+item[5]+"\n公司:"+item[7].replace("title=","").replace("\"",""))
self.write_to_file(str_)
print "第%d 页大数据职位信息存储完毕.." %(page)
def write_to_file(self, txt):
f = open('./myStory.txt', 'a')
f.write(txt)
f.write('\n-----------------------------------------------\n')
f.close()
return
def do_work(self):
'''
提供跟用于交互的过程
让爬虫去工作
'''
while self.enable:
print "按回车继续"
print "输出quit退出"
command = raw_input()
#输入quit退出,或者大于三页退出,因为不知道他有几页,我们就先爬三页
if (command == "quit"):
self.enable = False
break;
if self.page>3:
self.enable = False
break;
item_list = self.load_page(self.page)
self.deal_one_page(item_list, self.page)
self.page += 1
#main
if __name__ == "__main__":
#创建一个spider对象
mySpider = Spider()
mySpider.do_work()
人生苦短,我用Python