我们以腾讯社招页面来做示例:http://hr.tencent.com/position.php?&start=0#a

如上图,使用BeautifulSoup4解析器,将图1中229页,每页10个招聘信息,共2289个招聘信息中的职位名称、职位类别、招聘人数、工作地点、工作职责、工作要求、详情链接等信息存储在本地磁盘(如下图)。

  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. __author__ = 'mayi'
  4.  
  5. """
  6. 案例:使用BeautifulSoup4爬取腾讯招聘页面的数据
  7. url:http://hr.tencent.com/position.php?&start=10#a
  8. 使用BeautifulSoup4解析器,爬取每个招聘详情页面里面的:
  9. 职位名称、工作地点、职位类别、招聘人数、工作职责、工作要求、url链接
  10. """
  11.  
  12. from bs4 import BeautifulSoup
  13. import urllib.request
  14. import json
  15.  
  16. # 创建一个爬虫类
  17. class TencentSpider(object):
  18. """
  19. 一个爬虫类:爬取腾讯招聘页面信息
  20. """
  21. def __init__(self):
  22. """
  23. 初始化函数
  24. :return:
  25. """
  26. # User-Agent头
  27. self.header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}
  28. self.url = "http://hr.tencent.com/"
  29. self.file_name = open("tencent.txt", "w", encoding = "utf-8")
  30.  
  31. # 爬虫开始工作
  32. self.run()
  33.  
  34. def run(self):
  35. """
  36. 爬虫开始工作
  37. :return:
  38. """
  39. # 首页
  40. start_page = 1
  41. # 尾页
  42. end_page = self.getLastPage(self.url + "position.php?&start=0#a")
  43. # 循环处理每一页
  44. for page in range(start_page, end_page + 1):
  45. print("正在处理第" + str(page) + "页")
  46. # 每一页有10个招聘信息
  47. pn = (page - 1) * 10
  48. # 接接成完整的url地址
  49. full_url = self.url + "position.php?&start=" + str(pn) + "#a"
  50. # 获取招聘详情链接:l square
  51. link_list = self.getPositons(full_url)
  52. for link in link_list:
  53. # 拼接成完整的链接
  54. full_link = self.url + link
  55. # 获取招聘信息页面里的所需爬取的信息
  56. self.getPositionInfo(full_link)
  57.  
  58. # 关闭文件
  59. self.file_name.close()
  60.  
  61. def getLastPage(self, url):
  62. """
  63. 获取尾页的page值
  64. :param url: 首页的url地址
  65. :return: 尾页的page值
  66. """
  67. # 获取url页面的内容:bytes
  68. html = self.loadPage(url)
  69. # bytes转utf-8
  70. html = html.decode("utf-8")
  71. # 创建 Beautiful Soup 对象,指定lxml解析器
  72. soup = BeautifulSoup(html, "lxml")
  73. page_nav = soup.select('div[class="pagenav"]')[0]
  74. page = page_nav.find_all('a')[-2].get_text()
  75.  
  76. return int(page)
  77.  
  78. def loadPage(self, url):
  79. """
  80. 获取url页面的内容
  81. :param url: 需要获取内容的url地址
  82. :return: url页面的内容
  83. """
  84. # url 连同 headers,一起构造Request请求,这个请求将附带 chrome 浏览器的User-Agent
  85. request = urllib.request.Request(url, headers = self.header)
  86. # 向服务器发送这个请求
  87. response = urllib.request.urlopen(request)
  88. # time.sleep(3)
  89. # 获取网页内容:bytes
  90. html = response.read()
  91.  
  92. return html
  93.  
  94. def getPositons(self, url):
  95. """
  96. 获取url页面内的招聘详情链接
  97. :param url:
  98. :return:
  99. """
  100. # 获取url页面的内容:bytes
  101. html = self.loadPage(url)
  102. # bytes转utf-8
  103. html = html.decode("utf-8")
  104. # 创建 Beautiful Soup 对象,指定lxml解析器
  105. soup = BeautifulSoup(html, "lxml")
  106.  
  107. item_list = soup.select('td[class="l square"]')
  108. link_list = []
  109. for item in item_list:
  110. item = item.select('a')[0].attrs['href']
  111. link_list.append(item)
  112.  
  113. return link_list
  114.  
  115. def getPositionInfo(self, url):
  116. """
  117. 获取我们需爬取的信息
  118. :param url: 招聘详情页面
  119. :return: None
  120. """
  121. # 获取url页面的内容:bytes
  122. html = self.loadPage(url)
  123. # bytes转utf-8
  124. html = html.decode("utf-8")
  125. # 创建 Beautiful Soup 对象,指定lxml解析器
  126. soup = BeautifulSoup(html, "lxml")
  127. # 用于存储所爬取信息的字典
  128. item = {}
  129. try:
  130. # 职位名称
  131. position_name = soup.find_all(id="sharetitle")[0].get_text()
  132. # 工作地点、职位类型、招聘人数
  133. bottomline = soup.select('tr[class="c bottomline"] td')
  134. # 工作地点
  135. working_place = bottomline[0].get_text()[5:]
  136. # 职位类别
  137. position_category = bottomline[1].get_text()[5:]
  138. # 招聘人数
  139. numbers = bottomline[2].get_text()[5:]
  140. # 工作职责
  141. operating_duty_list = soup.select('ul[class="squareli"]')[0].select('li')
  142. operating_duty = ""
  143. for duty in operating_duty_list:
  144. operating_duty += duty.get_text().strip() + "\n"
  145. # 工作要求
  146. requirements_list = soup.select('ul[class="squareli"]')[1].select('li')
  147. requirements = ""
  148. for requ in requirements_list:
  149. requirements += requ.get_text().strip() + "\n"
  150. # url链接
  151. url_links = url
  152. # 职位名称、工作地点、职位类别、招聘人数、工作职责、工作要求、url链接
  153. item["职位名称"] = position_name
  154. item["工作地点"] = working_place
  155. item["职位类别"] = position_category
  156. item["招聘人数"] = numbers
  157. item["工作职责"] = operating_duty
  158. item["工作要求"] = requirements
  159. item["url链接"] = url_links
  160. except:
  161. # 若异常、则舍弃这条信息
  162. pass
  163. # 保存这条记录
  164. if item:
  165. line = json.dumps(item, ensure_ascii = False) + "\n"
  166. self.file_name.write(line)
  167.  
  168. # 主函数
  169. if __name__ == '__main__':
  170. my_spider = TencentSpider()

爬虫——使用BeautifulSoup4的爬虫的更多相关文章

  1. python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容

    python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...

  2. Python 爬虫3——第一个爬虫脚本的创建

    在进行真正的爬虫工程创建之前,我们先要明确我们所要操作的对象是什么?完成所有操作之后要获取到的数据或信息是什么? 首先是第一个问题:操作对象,爬虫全称是网络爬虫,顾名思义,它所操作的对象当然就是网页, ...

  3. 放养的小爬虫--豆瓣电影入门级爬虫(mongodb使用教程~)

    放养的小爬虫--豆瓣电影入门级爬虫(mongodb使用教程~) 笔者声明:只用于学习交流,不用于其他途径.源代码已上传github.githu地址:https://github.com/Erma-Wa ...

  4. 爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider)

    爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔... Day 1小莫想要某站上所有的电影,写了标准的爬虫(基于HttpCli ...

  5. Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  6. python3编写网络爬虫23-分布式爬虫

    一.分布式爬虫 前面我们了解Scrapy爬虫框架的基本用法 这些框架都是在同一台主机运行的 爬取效率有限 如果多台主机协同爬取 爬取效率必然成倍增长这就是分布式爬虫的优势 1. 分布式爬虫基本原理 1 ...

  7. python爬虫随笔(2)—启动爬虫与xpath

    启动爬虫 在上一节中,我们已经创建好了我们的scrapy项目,看着这一大堆文件,想必很多人都会一脸懵逼,我们应该怎么启动这个爬虫呢? 既然我们采用cmd命令创建了scrapy爬虫,那就得有始有终有逼格 ...

  8. 【网络爬虫入门03】爬虫解析利器beautifulSoup模块的基本应用

    [网络爬虫入门03]爬虫解析利器beautifulSoup模块的基本应用   1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.B ...

  9. python爬虫-基础入门-python爬虫突破封锁

    python爬虫-基础入门-python爬虫突破封锁 >> 相关概念 >> request概念:是从客户端向服务器发出请求,包括用户提交的信息及客户端的一些信息.客户端可通过H ...

随机推荐

  1. POJO对象

    POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 使用POJO名称是为了避免和 EJB混淆起来, 而且简 ...

  2. Java入门到精通——调错篇之EasyUI+SpringMVC Form表单提交到Contorller中文字出现乱码

    一.错误现象. 界面Post提交到Contorller的时候在Contorller中出现乱码. 二.问题解决. 在Web.xml下加入以下代码就可以解决. <filter> <fil ...

  3. 栈帧示意图:stack pointer、frame pointer

    更多参考:http://www.embeddedrelated.com/usenet/embedded/show/31646-1.php 一: The calling convention descr ...

  4. Siebel计划和实施

    1.计划: 自上而下计划配置项目 1)首先,确定UI和应用产品功能 2)然后,确定为实现UI功能而需要在业务层所做的更改 3)最后,确定为实现业务层更改而需要在数据层所做的更改---尽可能少做更改 如 ...

  5. 面向切面编程-AOP的介绍

    AOP简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象 ...

  6. 【Spring实战】—— 2 构造注入

    本文讲解了构造注入以及spring的基本使用方式,通过一个杂技演员的例子,讲述了依赖注入属性或者对象的使用方法. 如果想要使用spring来实现依赖注入,需要几个重要的步骤: 1 定义主要的类和需要分 ...

  7. Jmeter入门19 保存测试结果(或从文件读取结果)

    以聚合报告为例,其他监听器有write results to file的类似. 首先 为了避免每次保存的测试报告被覆盖,我们在testplan下添加两个参数:项目名和当前时间(毫秒级) 其次 添加聚合 ...

  8. [转]Ubuntu 小企鹅输入法fcitx 支持 五笔拼音

    之前在Ubuntu下使用ibus五笔输入法,用了一段时间发现五笔输入法不能输入词组,并且五笔不支持拼音的功能,从网上找到可以使用fcitx替换掉ibus,因此自已尝试了一把,安装步骤如下: 1. 安装 ...

  9. Redux概念简述

    react可以写出一些比较简单的一些项目,但是只能写出很简单的一些项目,原因是什么呢,原因是react是一个非常轻量级的是视图层框架,打开官网可以看到大大的一行字,A JavaScript libra ...

  10. sql 查询表的字段数量

    select COUNT(a.name) from sys.all_columns a,sys.tables bwhere a.object_id=b.object_id and b.name='ta ...