Python学习笔记,数据分析(51job)
学习python已经有段时间了,现在整理整理自己学习的知识
本次分析的是51job中python岗位的初步分析
明确思路:
1.利用爬虫,获取数据
2.利用pandas,numpy进行数据清洗
3.利用pandas,numpy,matplotlib,jieba等库进行分析
爬虫篇:
1.爬虫编写:
思路:1.进行浏览器模拟;
2.连接数据库;
3.分析url,利用for循环构造出url;
4.分析网页信息,提取出数据;
5.存入数据库,并关闭数据库;
先上代码,是个小白,希望大家见谅,哈哈哈哈
import pymysql
import requests
import urllib.request
from lxml import etree
from bs4 import BeautifulSoup
#浏览器模拟
headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0;win64;x64;rv62.0) Gecko/20100101 Firefox/62.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
#连接数据库
conn = pymysql.connect(host="127.0.0.1",user="root",passwd="lxw19961230",db="51job")
cursor = conn.cursor()
#构造网页
for i in range(0,805):
url = "http://search.51job.com/list/000000,000000,0000,00,9,99,python,2,"+str(i)+".html"
data = urllib.request.urlopen(url).read().decode("gbk").encode("utf-8")
res=requests.get(url)
res.encoding='gbk'
#定义一个节点树的根
data1=etree.HTML(res.text)
bs = BeautifulSoup(data,"html.parser")
#提取数据
money = []
cons = bs.find_all('div',{'class':'el'})
for con in cons:
con1 = con.find_all('span',{'class':'t4'})
if con1 == []:
continue
mon = con1[0].string
if mon is None:
mon = "Null"
if len(mon) == 2:
continue
money.append(mon)
title = data1.xpath('//div[@class="el"]/p[@class="t1 "]/span/a/@title')
adress = data1.xpath('//div[@class="el"]/span[@class="t3"]/text()')
company = data1.xpath('//div[@class="el"]/span[@class="t2"]/a/@title')
link = data1.xpath('//div[@class="el"]/span[@class="t2"]/a/@href')
#money = data1.xpath('//div[@class="el"]/span[@class="t4"]/text()')
datetime = data1.xpath('//div[@class="el"]/span[@class="t5"]/text()')
#写入数据库
for j in range(0,len(title)):
sql = "insert into python_1 (title,adress,company,link,money,datetime) values('"+title[j]+"','"+adress[j]+"','"+company[j]+"','"+link[j]+"','"+money[j]+"','"+datetime[j]+"')"
cursor.execute(sql)
conn.commit()
print(title[j])
print(adress[j])
print(company[j])
print(link[j])
print(money[j])
print(datetime[j])
conn.close()
此次爬虫编写用的是requests+lxml,其实数据量还是比较大的,有4万+,效率有点低,大约要两小时。可以考虑用scrapy框架或者自己写一个多线程,提高一下效率。
代码分析:
data = urllib.request.urlopen(url).read().decode("gbk").encode("utf-8")
51job有编码问题,会出现乱码。以上代码可以解决问题。
bs = BeautifulSoup(data,"html.parser")
#提取数据
money = []
cons = bs.find_all('div',{'class':'el'})
for con in cons:
con1 = con.find_all('span',{'class':'t4'})
if con1 == []:
continue
mon = con1[0].string
if mon is None:
mon = "Null"
if len(mon) == 2:
continue
money.append(mon)
在爬的过程中,会停止(没有编写异常处理),分析了一下他的网页信息,发现工资有时候是没有的,所有在爬的时候,遇到没有工资时,就填入Null。由于这个页面数据爬下了是存在一个列表中,所以在爬的过程中,可以使用BeautifulSoup和for循环来判断是否有数据。其他数据,利用xpath就行了。