引言
我们都知道学习一门语言的最好方法就是实战,今天来用python做一个爬虫实战一下。
什么是爬虫?这里我不做过多解释,大家可以百度搜索一下,自己了解了解。
要想爬取一个网站的资源,我们要做的第一步就是向网站请求数据,大多数网站都有反爬措施所以我们要模拟浏览器向网站发起请求。
以下是微软IE浏览器下的操作
我们先登录一个求职网站按Fn+F12打开网页调试窗口,查看复制你的用户代理
1 网页数据获取
例(1)网页数据获取
在给出代码之前我们需要用python导入几个爬虫相关的 库,我的pycharm默认是不带的需要自己安装。
具体安装方法我推荐一个人的博客(他写得很详细)有关PyCharm库的安装
# 导入相关库
import requests
import re
import xlwt
# 获取网站源码
def get_content(page): # page是要爬去的页码
# 由于page是数字要想和字符串拼接必须将数字转为字符串,所以使用'+str(page)+'
url = 'https://search.51job.com/list/200200,000000,0000,00,9,99,%2B,2,'+str(page)+'.html'# 网址拼接
headers ={ #模拟用户代理
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134"
}
req = requests.get(url,headers=headers) # 开始发送请求数据
req.encoding = 'gbk' #网站的编码格式为gbk
html = req.text # 将返回的数据保存在html中
return html
print(get_content(1)) # 之后爬取时将这条语句删掉
运行效果,我们可以看到控制台已经将网站的源码全部打印出来了。
接下来源码拿到手了我们要做的就是筛选出对我们有用的信息
2 数据筛选
筛选原则是按照正则表达式进行筛选,那么什么是正则表达式,其实我也不太懂,下去我也百度好好理解理解。程序的话我就直接套用了。首先来观察一下这个网站。
我们需要的信息无非就是5个 职位名,公司名,工作地点,薪资,发布时间。
然后就是对已有的数据进行匹配筛选出我们需要的信息。
例(2)数据筛选
# 筛选数据
def get(html):
# 按照正则表达式的原则进行匹配数据
reg = re.compile(r'class="t1">.*?<a target="_blank" title="(.*?)".*?<span class="t2"><a target="_blank" title="(.*?)".*?<span class="t3">(.*?)</span>.*?<span class="t4">(.*?)</span>.*?<span class="t5"(.*?)</span>.*?',re.S)
items = re.findall(reg,html) # 将匹配到的数据保存在items里
return items
namelist=[]#定义一个空列表用来保存数据
def save_data_to_namelist(): #将数据保存在namelist中
for i in range(1,4): #爬取前三页内容
print('正在爬取第'+str(i)+'的信息...')
html = get_content(i)
for j in get(html):
data = []
for i in range(0,5): #每页都有5个数据
data.append(j[i])
namelist.append(data)
return
save_data_to_namelist() # 调用该函数爬取并保存网页内容
print(namelist) #将保存的内容打印出来
运行结果
3 将数据存入Excel表格中
def save_data_to_excel(savezone): #新建一个表格
book = xlwt.Workbook(encoding='utf-8',style_compression=0) #表格的相关操作
sheet = book.add_sheet('51job',cell_overwrite_ok=True) # 也属于表格的相关操作
new_tuple = ('职位','公司','地址','薪资','发布日期') # 新建一个元组(元组元素不可改变)
for i in range (0,5):
sheet.write(0,i,new_tuple[i]) # 将元组的的数据写入表格的第0行第i列中
for i in range (0,len(namelist)):
data = namelist[i] #将列表中每个数据拿出来
for j in range(0,5) : #有5个数据
sheet.write(i+1,j,data[j]) #因为第一行写了项目名称,所以内容从i+1行开始写。
book.save(savezone) # 保存数据savezone为参数文件名
#数剧保存
save_data_to_namelist() #将数据保存在namelist中
save_data_to_excel('51job.xls') # 将namelist的数据写在excel中
到这里就基本全部完成,除了保存在excel里还可以保存到txt里。
最后给出整个代码,但代码中出了一点小问题,由于涉及面广我没及时了解,但不影响。
整个代码
# 导入相关库
import requests
import re
import xlwt
# 获取网站源码
def get_content(page): # page是要爬去的页码
# 由于page是数字要想和字符串拼接必须将数字转为字符串,所以使用'+str(page)+'
url = 'https://search.51job.com/list/200200,000000,0000,00,9,99,%2B,2,'+str(page)+'.html'# 网址拼接
headers ={ #模拟用户代理
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134"
}
req = requests.get(url,headers=headers) # 开始发送请求数据
req.encoding = 'gbk' #网站的编码格式为gbk
html = req.text # 将返回的数据保存在html中
return html
#print(get_content(1))
# 筛选数据
def get(html):
# 按照正则表达式的原则进行匹配数据
reg = re.compile(r'class="t1">.*?<a target="_blank" title="(.*?)".*?<span class="t2"><a target="_blank" title="(.*?)".*?<span class="t3">(.*?)</span>.*?<span class="t4">(.*?)</span>.*?<span class="t5"(.*?)</span>.*?',re.S)
items = re.findall(reg,html) # 将匹配到的数据保存在items里
return items
namelist=[]#定义一个空列表用来保存数据
def save_data_to_namelist(): #将数据保存在namelist中
for i in range(1,30): #爬取内容
print('正在爬取第'+str(i)+'的信息...')
html = get_content(i)
for j in get(html):
data = []
for i in range(0,5): #每页都有5个数据
data.append(j[i])
namelist.append(data)
return
# 将数据存入Excel表格中。
def save_data_to_excel(savezone): #新建一个表格
book = xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet = book.add_sheet('51job',cell_overwrite_ok=True)
new_tuple = ('职位','公司','地址','薪资','发布日期')# 新建一个元组(元组元素不可改变)
for i in range (0,5):
sheet.write(0,i,new_tuple[i])# 将元组的的数据写入表格的第0行第i列中
for i in range (0,len(namelist)):
data = namelist[i] #将列表中每个数据拿出来
for j in range(0,5) :#有5个数据
sheet.write(i+1,j,data[j])
book.save(savezone)# 保存数据savezone为参数文件名
#数剧保存
save_data_to_namelist()#将数据保存在namelist中
save_data_to_excel('51job.xls')# 将namelist的数据写在excel中
程序运行前
程序运行后,新增一个表格
我们打开表格,这就是我们需要的信息内容。
总结
到目前位置爬虫的基本原理已经差不多了,但需要提高的是正则表达式的匹配
如果正则表达式匹配出问题,那么爬取并保留下来的数据也会出问题。所以也要额外学习正则表达式,这个有利于之后的信息存储。