bs4爬取某招聘数据
一.更新pip在安装源:
1.打开文件资源管理器
2.地址栏上面输入%appdata%
3.在这个文件里面新建一个pip文件夹
4.在pip文件夹里面新建一个pip.ini文件,内容如下:
[global]
timeout=6000
index-url = https://mirrors.aliyun.com/pypi/simple
trusted-host = mirrors.aliyun.com # 这里安装的是阿里云的源
二.bs4的基础知识:
(1):生成对象
本地对象
soup=BeautifulSoup(open(‘test.html’,encoding=‘utf8’,‘lxml’)
转化为网络文件,lxml解析
soup = BeautifulSoup(‘字符串类型或者字节类型’,‘lxml’)
1.根据标签名查找
soup.a # 只能找到第一个符合要求的标签
2.获取属性
soup.a.attrs # 获取所有属性和值,返回一个字典
soup.a['href'] # 获取href属性
3.获取内容
soup.a.text
soup.a.string
soup.a.get_text()
# 如果标签里面还有标签,那么string获取的结果为None,而其它两个可以获取文本内容
4.find
# 举例
print(soup.find('a',alt='xxx')) # 获取a标签并且alt属性值为xxx的a
print(soup.find('a',class_='xxx')) # 获取a标签并且class属性值为xxx的a
5.find_all
# find_all和find类似
# 例子
print(soup.find_all('a')) # 获取所有的a标签的第一个,返回的是一个列表
print(soup.find_all(['a','b']) # 获取所有的a标签和所有的b标签的第一个,可以像find一样用
print(soup.find_all('a',limit=2) # 限制前两个
6.select
select是根据选择器来查找,但是一定要记住它返回的是一个列表(重点)
三.爬取代码:
from bs4 import BeautifulSoup
import urllib.request
import urllib.parse
import xlwt # 将爬取的数据写入到表格文件里面
class ZhiLianZhaoPin(object):
# 基本url
url = 'https://xiaoyuan.zhaopin.com/search/jn=4&jt=45,47,48,53,54,57,79,317,665,666,667,668,669,671,672,679,687,861,863,864,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,407,49,692,694,695,696,868,2063,2064,2065,316,552,556,670,689,841,41,51,55,59,315,388,389,551,678,690,698,699&city=489&'
def __init__(self, start_page, endpage):
self.start_page = start_page # 起始页码
self.end_page = end_page # 结束页码
self.zhaopin_data_list = [] # 存放字典数据
def handlerequest(self, page):
headers = {
'User-Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.54',
}
# 解析输入的参数,搜索框有中文时,可以直接用字典,再用urllib.parse.urlencode()进行解析,最后在拼接,
# 如果没有中文,地址可以直接拼接
data = {
'pg':page,
}
# 转换拼接的代码
query_url = self.url + urllib.parse.urlencode(data)
# 获取请求对象
request = urllib.request.Request(headers=headers,url=query_url)
# 获取响应对象
resp = urllib.request.urlopen(request)
return resp
# 获取相应属性的值
def parse_data(self,content):
soup = BeautifulSoup(content,'lxml')
presentation_item = soup.find_all('div',class_="presentation-item")
for data in presentation_item:
# 定义一个字典,存放相应的属性
zhaopin_data_dict = {}
# title为招聘的标题
zhaopin_data_dict['title'] = data.find('div',class_='fn-clear').select('.position')[0].text # select查到的的返回数据类型是列表对象
# type为招聘的类型
zhaopin_data_dict['type'] = data.find('div',class_='fn-clear').select('.source')[0].text
# company为招聘是哪一家公司
zhaopin_data_dict['company'] = data.find('div',class_='fn-clear').select('.company')[0].text
# city为招聘的城市
zhaopin_data_dict['city'] = data.select('p')[0].find('span',class_='city').text[4:]
# num为招聘的人数
zhaopin_data_dict['num'] = data.select('p')[0].find('span',class_='num').text[6:]
# time为什么时候发布的
zhaopin_data_dict['time'] = data.select('p')[0].find('span',class_='time').text[5:]
# 把每一个字典存入一个列表中到
self.zhaopin_data_list.append(zhaopin_data_dict)
def run(self):
# 得到每一页的数据
for pg in range(start_page, end_page+1):
resp = self.handlerequest(pg)
self.parse_data(resp.read().decode())
def write_xlxs(self):
work_book = xlwt.Workbook()
sheet = work_book.add_sheet('dd',cell_overwrite_ok=True)
m = 0
for dict_ in self.zhaopin_data_list:
i = 0
for d in dict_.values():
sheet.write(m,i,d) # 写到第m行i列的位置上,d为数据
i += 1
m += 1
work_book.save('data.xls') # 保存数据
if __name__ == '__main__':
start_page = int(input("请输入起始页:"))
end_page = int(input("请输入结尾页:"))
zhaopin = ZhiLianZhaoPin(start_page, end_page)
print("得到数据")
zhaopin.run()
print("写入文件")
zhaopin.write_xlxs()
print("结束写入")
知识点和心得:bs4是用来解析数据的,只有具备了基础知识,后面的一些小爬虫案列才能很容易写下来。