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

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

#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi' """
案例:使用BeautifulSoup4爬取腾讯招聘页面的数据
url:http://hr.tencent.com/position.php?&start=10#a
使用BeautifulSoup4解析器,爬取每个招聘详情页面里面的:
职位名称、工作地点、职位类别、招聘人数、工作职责、工作要求、url链接
""" from bs4 import BeautifulSoup
import urllib.request
import json # 创建一个爬虫类
class TencentSpider(object):
"""
一个爬虫类:爬取腾讯招聘页面信息
"""
def __init__(self):
"""
初始化函数
:return:
"""
# User-Agent头
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'}
self.url = "http://hr.tencent.com/"
self.file_name = open("tencent.txt", "w", encoding = "utf-8") # 爬虫开始工作
self.run() def run(self):
"""
爬虫开始工作
:return:
"""
# 首页
start_page = 1
# 尾页
end_page = self.getLastPage(self.url + "position.php?&start=0#a")
# 循环处理每一页
for page in range(start_page, end_page + 1):
print("正在处理第" + str(page) + "页")
# 每一页有10个招聘信息
pn = (page - 1) * 10
# 接接成完整的url地址
full_url = self.url + "position.php?&start=" + str(pn) + "#a"
# 获取招聘详情链接:l square
link_list = self.getPositons(full_url)
for link in link_list:
# 拼接成完整的链接
full_link = self.url + link
# 获取招聘信息页面里的所需爬取的信息
self.getPositionInfo(full_link) # 关闭文件
self.file_name.close() def getLastPage(self, url):
"""
获取尾页的page值
:param url: 首页的url地址
:return: 尾页的page值
"""
# 获取url页面的内容:bytes
html = self.loadPage(url)
# bytes转utf-8
html = html.decode("utf-8")
# 创建 Beautiful Soup 对象,指定lxml解析器
soup = BeautifulSoup(html, "lxml")
page_nav = soup.select('div[class="pagenav"]')[0]
page = page_nav.find_all('a')[-2].get_text() return int(page) def loadPage(self, url):
"""
获取url页面的内容
:param url: 需要获取内容的url地址
:return: url页面的内容
"""
# url 连同 headers,一起构造Request请求,这个请求将附带 chrome 浏览器的User-Agent
request = urllib.request.Request(url, headers = self.header)
# 向服务器发送这个请求
response = urllib.request.urlopen(request)
# time.sleep(3)
# 获取网页内容:bytes
html = response.read() return html def getPositons(self, url):
"""
获取url页面内的招聘详情链接
:param url:
:return:
"""
# 获取url页面的内容:bytes
html = self.loadPage(url)
# bytes转utf-8
html = html.decode("utf-8")
# 创建 Beautiful Soup 对象,指定lxml解析器
soup = BeautifulSoup(html, "lxml") item_list = soup.select('td[class="l square"]')
link_list = []
for item in item_list:
item = item.select('a')[0].attrs['href']
link_list.append(item) return link_list def getPositionInfo(self, url):
"""
获取我们需爬取的信息
:param url: 招聘详情页面
:return: None
"""
# 获取url页面的内容:bytes
html = self.loadPage(url)
# bytes转utf-8
html = html.decode("utf-8")
# 创建 Beautiful Soup 对象,指定lxml解析器
soup = BeautifulSoup(html, "lxml")
# 用于存储所爬取信息的字典
item = {}
try:
# 职位名称
position_name = soup.find_all(id="sharetitle")[0].get_text()
# 工作地点、职位类型、招聘人数
bottomline = soup.select('tr[class="c bottomline"] td')
# 工作地点
working_place = bottomline[0].get_text()[5:]
# 职位类别
position_category = bottomline[1].get_text()[5:]
# 招聘人数
numbers = bottomline[2].get_text()[5:]
# 工作职责
operating_duty_list = soup.select('ul[class="squareli"]')[0].select('li')
operating_duty = ""
for duty in operating_duty_list:
operating_duty += duty.get_text().strip() + "\n"
# 工作要求
requirements_list = soup.select('ul[class="squareli"]')[1].select('li')
requirements = ""
for requ in requirements_list:
requirements += requ.get_text().strip() + "\n"
# url链接
url_links = url
# 职位名称、工作地点、职位类别、招聘人数、工作职责、工作要求、url链接
item["职位名称"] = position_name
item["工作地点"] = working_place
item["职位类别"] = position_category
item["招聘人数"] = numbers
item["工作职责"] = operating_duty
item["工作要求"] = requirements
item["url链接"] = url_links
except:
# 若异常、则舍弃这条信息
pass
# 保存这条记录
if item:
line = json.dumps(item, ensure_ascii = False) + "\n"
self.file_name.write(line) # 主函数
if __name__ == '__main__':
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. 解决iframe IE8透明不兼容

    要使 ie8 的 iframe 的透明,需要设置两点: 设置 iframe 的 allowTransparency 属性值为 true: <iframe allowtransparency=&q ...

  2. 从零开始的全栈工程师——underscore

    underscore 是js封装的一个js库 库和框架是有区别的 mvc框架就是backbone就是依赖这个库underscore就是定义了一个_( 下划线对象 ); 函数库的所有的方法都归属于这个对 ...

  3. cf375D. Tree and Queries(莫队)

    题意 题目链接 给出一棵 n 个结点的树,每个结点有一个颜色 c i . 询问 q 次,每次询问以 v 结点为根的子树中,出现次数 ≥k 的颜色有多少种.树的根节点是1. Sol 想到了主席树和启发式 ...

  4. sass继承

    @extend sass中,选择器继承可以让选择器继承另一个选择器的所有样式,并联合声明.使用选择器的继承,要使用关键词@extend,后面紧跟需要继承的选择器. scss.style css.sty ...

  5. ES6新增的math,Number方法

    ES6新增的math,Number方法,下面总结了一些我觉得有用的 Nunber.isInteger()判断是否为整数,需要注意的是1,和1.0都会被认为是整数 console.log(Number. ...

  6. Git 基本知识与常用指令

    一.Git代码状态转换图 其中: 未被Git跟踪的状态为unstage状态: 已被Git跟踪的状态为stage状态(stage:阶段),因此包括staging状态和staged状态. untrack ...

  7. C/S与B/S架构的区别和优缺点

    C/S 架构的概念 C/S是Client/Server,即客户端/服务器端架构,一种典型的两层架构. 客户端包含一个或多个在用户的电脑上运行的程序 服务器端有两种,一种是数据库服务器端,客户端通过数据 ...

  8. 免费的SSL证书,你值得拥有!Let's Encrypt 试用体验记录

    早上收到 Let’s Encrypt 的邮件,说偶之前申请的已经通过了,于是马上开始试用.Let’s Encrypt 是一个新的数字证书认证机构,它通过自动化的过程消除创建和安装证书的复杂性,为网站提 ...

  9. STM32-F429ZIT6-关于驱动安装

    第一步:下载驱动 1.个人百度云链接:http://pan.baidu.com/s/1dE8vxy5 密码:yow0 2.网站下载:这个还是直接百度吧. 第二步:驱动安装 注意:安装之前要先关闭安全监 ...

  10. IOS AFN请求 总结

    一.2大管理对象 1.AFHTTPRequestOperationManager* 对NSURLConnection的封装 2.AFHTTPSessionManager* 对NSURLSession的 ...