excel抓取多页网页数据(文章目录3.提取信息进行excel本地保存总结(组图))
优采云 发布时间: 2022-02-22 01:15excel抓取多页网页数据(文章目录3.提取信息进行excel本地保存总结(组图))
文章目录
3.提取信息并保存在本地的excel中
总结
前言
本案例是爬取51job网站的job信息。如果有任何错误,请纠正我。转载请注明出处。
本次抓取网址:点此
温馨提示:以下为本文正文内容文章,以下案例供参考
一、模块使用
1.这次一共使用了四个模块
1import openpyxl
2import bs4
3import requests as r
4from selenium import webdriver
5
6
下面会列出具体模块的详细使用,有需要的可以自行了解:
详情页URL获取模块:selenium
HTML标签处理模块:bs4.beautifulsoup
Python详解——请求模块
openpyxl处理excel表格详解
二、数据抓取及url列表建立1.获取所有网页详情页面链接
这里使用 selenium 模块是因为可以获取动态加载页面的数据,比如 js 渲染后的代码,下拉轮获取的数据,框内的一些隐藏元素等。
调用selenium模块需要下载浏览器驱动:谷歌浏览器驱动下载地址,下载解压后放到python根目录下。注意:浏览器版本必须与驱动版本一致,否则无效。
如果还有安装不了selenium模块的朋友,请看这篇文章:selenium安装
1):首先观察我们要爬取的页面,定位到页面需要爬取的位置,我们发现他的父标签是“div”和“class="j_joblist”,
而详情页的链接在父标签下的div标签下的a标签中(这里有点绕,结合图片理解)
可以看出,我们首先要定位a标签,从中提取“href”标签中的地址,并将地址放入urllists列表中。第一步完成!
代码如下(示例):
1h = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0"} # 伪造浏览器信息,第二步会用到。
2def get_joburllist(): # 定义函数get_joburllist
3
4 urllists = [ ] # 一个列表变量,用于接收所有网页详情页链接
5 chrome_driver = r'C:\Users\Administrator\AppData\Local\Programs\Python\Python36\chromedriver.exe' #chromedriver的文件位置,r代表原始路径
6 wd = webdriver.Chrome(executable_path = chrome_driver) #创建浏览器,这里用谷歌浏览器,后接驱动器地址
7 wd.implicitly_wait(2) # 智能等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。
8 #访问51job网站
9 for i in range(1,34): # 这里两个参数,(1,34),1代表当前页,34代表总页数,可自行修改
10 wd.get("https://search.51job.com/list/010000,000000,0000,00,9,99,%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8,2,i.html") # 访问链接内的地址,i为第i页
11
12 joblists = wd.find_elements_by_xpath('//div[@class="j_joblist"]/div/a') # 查找所有div下class属性为"j_joblist"的子节点为div的子节点为a的标签
13 for urllist in joblists: # 循环获取所有详情页的href链接
14 href_list = urllist.get_attribute("href") # 获取href属性的内容
15 urllists.append(href_list)
16 wd.quit() # 关闭浏览器
17 #print(urllists)
18 return urllists
19
20
21
至此,网页详情页的链接就放在了urllists列表中。我们可以继续下一步
2.获取详情页的html源码,过滤我们需要的信息
思路:由于我们在第一步中已经获取到了各个详情页的url,我们可以使用requests返回html源码,使用浏览器查看,逐个找到需要信息的标签过滤掉,最后找到我们需要的文本信息,放入列表返回。
代码如下(示例):
1f get_html(url): # 这里的url指的是第一步获取的详情页的url
2 response = r.get(url,headers = h) # 伪造请求头信息
3 response.encoding = "gbk" # 更改编码为gbk
4 return response.text # 返回html源码
5
6def get_textinfo(html): # 进行源码筛选
7 jobname = [] # 以下为定义模块信息 , 工作名称
8 jobmoney = [] # 工资
9 comname = [] # 公司名称
10 jobjy = [] # 工作经验
11 jobyh = [] # 岗位福利
12 jobneed = [] # 岗位职责
13 cominfo = [] # 公司信息
14
15 soup = bs4.BeautifulSoup(html,"html.parser") # 两个参数,第一个参数为html源码,第二个参数为解析html文件,返回结果给soup
16 # Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象
17
18# 这里要做一下说明,因为获取到的详情页中,有一部分并没有按照规定模板来进行显示,
19# 而是直接跳转到公司官网,所以进行筛选时会报错,这里用if来做一个简单判断,
20# 如果获取的html源码中并不是按照规定模板来显示的,我们将pass掉这个信息
21
22 jn = soup.find("div",class_="cn")
23 strjn = str(jn) # 将类型转换为str,方便查找
24 jnfind = strjn.find("h1") # 查找“h1”字符,并将查找结果给jhfind
25 if jnfind == -1: # 如果返回结果为 -1 代表没有h1标签 (find没有找到时会返回-1)
26 #print ("no")
27 joblist = ["查看此招聘信息请点击链接:"] # 则返回空表
28
29 else: # 否则代表该源码符合规定模板,正常进行筛选
30 #print(jn.h1.text)
31 jobname.append(jn.h1.text) # 添加h1标签文本信息
32
33 jm = soup.find("div",class_="cn")
34 jobmoney.append(jm.strong.text) # 添加strong标签文本信息
35
36 cn = soup.find("a",class_="catn")
37 comname.append(cn.text) # 添加公司名称
38
39 jj = soup.find("p",class_="msg ltype")
40 jobjy.append(jj.text.replace("\xa0\xa0|\xa0\xa0"," ")) 添加工作经验文本信息,并将\xa0替换成空字符串,方便查看
41
42 jy = soup.findAll("span",class_="sp4") # 福利信息这里有点特殊,每个福利都是独立的,我们需要将他放在一个字符串里,并添加到福利信息列表。
43 jystr = "" # 建立空字符串
44 for i in jy: # 从jy(jy代表找到的所有符合条件的标签)中逐个调用并添加到jystr中,以空格隔开。
45 jystr += i.text + " "
46 jobyh.append(jystr) # 将完成的字符串添加到列表中
47
48 jn = soup.find("div",class_="bmsg job_msg inbox")
49 jnstr = ""
50 for i in jn.findAll("p"): # 跟上一个同理,findAll所有'p'标签 并放到一个空字符串中
51 jnstr += i.text + " "
52 jobneed.append(jnstr)
53
54 ci = soup.find("div",class_="tmsg inbox")
55 cominfo.append(ci.text) # 添加公司信息
56
57 joblist = jobname + jobmoney + comname + jobjy + jobyh + jobneed + cominfo # 将独立的列表信息合并到一起,成为一个大的列表。
58 return joblist
59
60
61
3.提取信息并保存在本地的excel中
思路:终于到了最后一步,这里也是调用整个代码执行的大致步骤。可以说上面写的函数都是在这里依次调用的。这次我们主要使用openpyxl来保存和调用前面两步。功能配合,代码废话不多说。
1
2def save_info():
3 wb = openpyxl.Workbook() # 获取工作簿 就是一个excle层面的对象,在获取工作簿的同时已经创建了一个默认的工作表
4 ws = wb.active # 获取当前工作表
5 titlelist = ["岗位名称","岗位薪资","公司名称","工作经验","岗位诱惑","岗位职责","公司信息","岗位网址"] # 先创建一个title,方便我们Excel表的查看。
6 ws.append(titlelist) # 添加titlelist到Excel表中
7 joburllist = get_joburllist() # 先调用第一步,获得所有详情页的url列表,并保存到"joburllist"中
8 for i in joburllist:
9 html = get_html(i) # 依次取出每一个详情页的url,并获取这个岗位的源码
10 jobinfolist = get_textinfo(html) # 对每个岗位扣取文字信息,并返回一个列表
11 jobinfolist.append(i) # 添加岗位网址信息
12 ws.append(jobinfolist) # 将扣取得文字信息,写入到excel的内存空间
13 wb.save("51jobplusmax.xlsx") # 保存
14
15if __name__ == "__main__": # 直接执行(F5)
16 save_info() # 执行save_info() 函数
17
18 # 这些是测试信息
19 #urllists = get_joburllist()
20 #html = get_html(urllists)
21 #get_textinfo(html)
22 #print(urllists)
23
24
在这里直接运行,我们可以爬取所有网络安全位置的信息。今天查询的时候一共1600多条,爬了1个小时(慢批)。
1.Excel结果展示
总结
这个案例,从学习新模块到实际应用,花了很长时间,找到了很多资料。我把它放在下面供大家学习和参考,希望能节省你的时间。
这是我的第一个爬虫案例分享。如果有任何错误,请纠正我。如果我能帮助你,那将是我的荣幸。
参考文章:
51job爬虫案例
硒笔记 1
硒 - 祖传爬行动物武器
selenium get_attribute 的几种用途
Selenium python中的等待方式
python中bs4.BeautifulSoup的基本用法
python脚本中selenium启动浏览器报错os.path.basename(self.path), self.start_error_message) mon.excep
openpyxl的详细使用