excel抓取多页网页数据(文章目录3.提取信息进行excel本地保存总结(组图))

优采云 发布时间: 2022-02-22 01:15

  excel抓取多页网页数据(文章目录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的详细使用

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线