近暑假来临,好多小伙伴都在找暑期实习吧?前几天,朋友弟弟,想在暑假期间找个实习工作锻炼自己,可是面对网络上几千条实习招聘信息,简直让人头大。随后朋友向我发出了“请求帮助”的信息,我了解了大致情况后,立马用爬虫爬取了实习网的的信息,将数据结果发了过去,问题分分钟解决。这请我吃一顿饭不过分吧?
这篇爬虫实战教程,不仅适合新手练习爬虫,也适合需要找实习信息的朋友!
希望在看了这篇文章后,能够清晰地知道整个爬虫流程,并且能够独立自主地完成,其次,能够通过自己的爬虫实战,获取自己想要的信息。
好了,话不多说,咱们就开始吧!
内容主要分为两大部分:
一、目标页面分析
首先,我们应该要知道自己的爬虫目标是个什么东西吧?俗话说,知己知彼,百战不殆。我们已经知道自己要爬取的页面是“实习网”,所以,咱们首先得去实习网看看,都有些什么数据。
实习网址:https://www.shixi.com/search/index
页面如下:
例如我们要找的岗位是“品牌运营”岗位的数据。因此直接在网页的搜索框输入品牌运营就行了。你会发现url发生了变化!
注意:我们要爬取的页面就是这页:https://www.shixi.com/search/index?key=品牌运营
在我们的爬取页面中,我们需要观察有哪些数据,并且一个页面中有几条数据。这个非常重要,关系到后面的代码编写,以及可以帮你检查,是否爬取到了页面的所有信息。
此时,我们要注意的是,我们所在的页面是“一级页面”,在浏览过程中,我们 点击随意一个岗位进入后呈现的是“二级页面”,此时你也会发现url又发生了变化。
例如,我们点一个品牌运营实习,二级页面就会自动跳转成这样,产生一个新的链接。如图:
要爬取页面上的那些信息呢?
我们在分析过程中发现,有些信息是在一级页面中,有些是在二级页面中。
在一级页面中,我们可以获取那些信息呢?如图所示:
总共有五条有效数据:职位、公司名、学历、薪资、地址
在二级页面中,我们来看看可以获取什么有效数据,领域和规模,阶段如果你觉得重要的话,也可以纳入爬虫范围,但是我个人认为,这并不影响实习,毕竟不是找正式工作,影响不会很大,反而是招聘实习生的数量更为重要,这里并未显示招聘人数,无法在图片上呈现,后续可加上。
到这里,我们一共需要抓取7个数据,加上“人数”一共8个数据,这也就是我们爬虫的最终目标数据。
爬取“静态”网页
这里分析下什么叫静态网页,什么叫动态网页。静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了--除非你修改页面代码。而动态网页则不然,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。
它们的区别就在于:静态网页中的数据,是一劳永逸,也就是说一次性给你。动态网页中的数据,是随着页面一步步加载出来,而逐步呈现的,也就是你用静态网页的爬虫技术,无法获取到其中所有的数据。
值得强调的是,不要将动态网页和页面内容是否有动感混为一谈。这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术生成的网页都可以称为动态网页。
点击 “鼠标右键”,点击 “查看网页源代码”,最终效果如图(部分截图):
这就是,最终反馈给你的数据,如果你发现自己想要的数据都在这里面,那么就可以说是静态页面,如若不然,则考虑为“动态页面”。
今天这里的案例是静态网页。
大家知道,在写代码之前要先知道,我们要用哪些方式,哪些库,哪些模块去帮你解析数据。常见用来解析数据的方法有:re正则表达式、xpath、beatifulsoup、pyquery等。
我们需要用到的是xpath解析法来分析定位数据。
二、爬虫代码讲解
爬虫的第一步是要考虑好,爬虫过程中需要用到哪些库,要知道python是一个依赖于众多库的语言,没有库的Python是不完整的。
import pandas as pd # 用于数据存储
import requests # 用于请求网页
import chardet # 用于修改编码
import re # 用于提取数据
from lxml import etree # 解析数据的库
import time # 可以粗糙模拟人为请求网页的速度
import warnings # 忽略代码运行时候的警告信息
warnings.filterwarnings("ignore")
2、请求一级页面的网页源代码
url = 'https://www.shixi.com/search/index?key=品牌运营&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
rqg = requests.get(url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)['encoding'] ②
html = etree.HTML(rqg.text)
这里我们要注意①②两个地方。在①处,有两个参数,一个是headers一个是verify。其中headers是一种反反扒的措施,让浏览器认为爬虫不是爬虫,而是人在用浏览器去正常请求网页。verify是忽略安全证书提示,有的网页会被认为是一个不安全的网页,会提示你,这个参数你记住就行。
在②处,我们已经获取到了网页的源码。但是由于网页源代码的编码方式和你所在电脑的解析方式,有可能不一致,返回的结果会导致乱码。此时,你就需要修改编码方式,chardet库可以帮你自动检测网页源码的编码。(一个很好用的检测文档编码的三方库chardet)
3、解析一级页面网页中的信息
# 1. 公司名
company_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
# 2. 岗位名
job_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
# 3. 地址
address_list = html.xpath('//div[@class="job-pannel-two"]//a/text()')
# 4. 学历
degree_list = html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')
# 5. 薪资
salary_list = html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')
salary_list = [i.strip() for i in salary_list]
# 获取二级页面的链接
deep_url_list = html.xpath('//div[@class="job-pannel-list"]//dt/a/@href')
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
此时,你可以看到,我直接采用xpath一个个去解析一级页面中的数据分析。在代码末尾,可以看到:我们获取到了二级页面的链接,为我们后面爬取二级页面中的信息,做准备。
解析二级页面网页中的信息
demand_list = []
area_list = []
scale_list = []
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)['encoding'] ②
html = etree.HTML(rqg.text) ③
# 6. 招聘人数
demand = html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')
# 7. 公司领域
area = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')
# 8. 公司规模
scale = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
要注意的是,二级页面也是页面,在爬取其中的数据时,也需要请求页面。所以,①②③处的代码,都是一模一样的。
4、翻页操作
https://www.shixi.com/search/index?key=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page=1
https://www.shixi.com/search/index?key=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page=2
https://www.shixi.com/search/index?key=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page=3
随意复制几个不同页面的url,观察它们的区别。这里可以看到,也就page参数后面的数字不同,是第几页,数字就是几。
x = "https://www.shixi.com/search/index?key=数据分析&page="
url_list = [x + str(i) for i in range(1,61)]
由于我们爬取了60页 的数据,这里就构造出了60个url,他们都存在url_list这个列表中。
我们现在来看看整个代码吧,我就不再文字叙述了,直接在代码中写好了注释。
import pandas as pd
import requests
import chardet
import re
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")
def get_CI(url):
# 请求获取一级页面的源代码
url = 'https://www.shixi.com/search/index?key=品牌运营&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
rqg = requests.get(url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)['encoding']
html = etree.HTML(rqg.text)
# 获取一级页面中的信息:一共有5个信息。
# ①公司名
company_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
#②岗位名
job_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
#③地址
address_list = html.xpath('//div[@class="job-pannel-two"]//a/text()')
# ④ 学历
degree_list = html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')
# ⑤薪资
salary_list = html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')
salary_list = [i.strip() for i in salary_list]
# ⑥获取二级页面的内容
deep_url_list = html.xpath('//div[@class="job-pannel-list"]//dt/a/@href')
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
demand_list = []
area_list = []
scale_list = []
# 获取二级页面中的信息:
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)['encoding']
html = etree.HTML(rqg.text)
#① 需要几人
demand = html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')
# ②公司领域
area = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')
# ③公司规模
scale = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
# ④ 将每个页面获取到的所有数据,存储到DataFrame中。
data = pd.DataFrame({'公司名':company_list,'岗位名':job_list,'地址':address_list,"学历":degree_list,
'薪资':salary_list,'岗位需求量':demand_list,'公司领域':area_list,'公司规模':scale_list})
return(data)
x = "https://www.shixi.com/search/index?key=数据分析&page="
url_list = [x + str(i) for i in range(1,61)]
res = pd.DataFrame(columns=['公司名','岗位名','地址',"学历",'薪资','岗位需求量','公司领域','公司规模'])
# 这里进行“翻页”操作
for url in url_list:
res0 = get_CI(url)
res = pd.concat([res,res0])
time.sleep(3)
# 保存数据
res.to_csv('aliang.csv',encoding='utf_8_sig')
这样一套下来,爬虫的思路是不是瞬间清晰明了?眼睛:我会了!手:我还是不会。得多加练习啊。初学者不要急于求成,项目不在多,在精。踏踏实实吃透一个远比看会十个更有效。
想要获取源代码的小伙伴们,点赞+评论,私聊哦~
Bootstrap 是全球最受欢迎的前端组件库,用于开发响应式布局、移动设备优先的 WEB 项目。
Bootstrap4 目前是 Bootstrap 的最新版本,是一套用于 HTML、CSS 和 JS 开发的开源工具集。利用我们提供的 Sass 变量和大量 mixin、响应式栅格系统、可扩展的预制组件、基于 jQuery 的强大的插件系统,能够快速为你的想法开发出原型或者构建整个 app 。
谁适合阅读本教程?
只要您具备 HTML 和 CSS 的基础知识,您就可以阅读本教程,进而开发出自己的网站。在您学习完本教程后,您即可达到使用 Bootstrap 开发 Web 项目的中等水平。
阅读本教程前,您需要了解的知识:
在您开始阅读本教程之前,您必须具备 HTML 、 CSS 和 JavaScript 的基础知识。如果您还不了解这些概念,那么建议您先阅读我们的这些教程:
HTML 教程
CSS 教程
JavaScript 教程
Bootstrap4 实例
Boostrap4 与 Bootstrap3
Boostrap4 是 Bootstrap 的最新版本,与 Bootstrap3 相比拥有了更多的具体的类以及把一些有关的部分变成了相关的组件。同时 Bootstrap.min.css 的体积减少了40%以上。
Boostrap4 放弃了对 IE8 以及 iOS 6 的支持,现在仅仅支持 IE9 以上 以及 iOS 7 以上版本的浏览器。如果对于其中需要用到以前的浏览器,那么请使用 Bootstrap3。
我们可以通过以下两种方式来安装 Bootstrap4:
使用 Bootstrap 4 CDN。
从官网 getbootstrap.com 下载 Bootstrap 4。
Bootstrap 4 CDN
国内推荐使用 BootCDN 上的库:
Bootstrap4 CDN
<!-- 新 Bootstrap4 核心 CSS 文件 --><linkrel="stylesheet"href="https://cdn.bootcss.com/bootstrap/4.0.0-beta/css/bootstrap.min.css"><!-- jQuery文件。务必在bootstrap.min.js 之前引入 --><scriptsrc="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script><!-- popper.min.js 用于弹窗、提示、下拉菜单 --><scriptsrc="https://cdn.bootcss.com/popper.js/1.12.5/umd/popper.min.js"></script><!-- 最新的 Bootstrap4 核心 JavaScript 文件 --><scriptsrc="https://cdn.bootcss.com/bootstrap/4.0.0-beta/js/bootstrap.min.js"></script>
此外,你还可以使用以下的 CDN 服务:
国内推荐使用 : https://www.staticfile.org/
国际推荐使用:https://cdnjs.com/
下载 Bootstrap 4
你可以去官网 https://getbootstrap.com/ 下载 Bootstrap4 资源库。
注:此外你还可以通过包的管理工具 npm、 gem、 composer 等来安装:
npm install bootstrap@4.0.0-beta.2gem 'bootstrap', '~> 4.0.0.beta2'composer require twbs/bootstrap:4.0.0-beta.2
创建第一个 Bootstrap 4 页面
1、添加 HTML5 doctype
Bootstrap 要求使用 HTML5 文件类型,所以需要添加 HTML5 doctype 声明。
HTML5 doctype 在文档头部声明,并设置对应编码:
<!DOCTYPEhtml><html><head><metacharset="utf-8"></head></html>
移动设备优先
为了让 Bootstrap 开发的网站对移动设备友好,确保适当的绘制和触屏缩放,需要在网页的 head 之中添加 viewport meta 标签,如下所示:
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
width=device-width
表示宽度是设备屏幕的宽度。
initial-scale=1
表示初始的缩放比例。
shrink-to-fit=no 自动适应手机屏幕的宽度。
容器类
Bootstrap 4 需要一个容器元素来包裹网站的内容。
我们可以使用以下两个容器类:
.container 类用于固定宽度并支持响应式布局的容器。
.container-fluid 类用于 100% 宽度,占据全部视口(viewport)的容器。
两个 Bootstrap 4 页面
Bootstrap4 .container 实例
<divclass="container"><h1>我的第一个 Bootstrap 页面</h1><p>这是一些文本。</p></div>
尝试一下 »
`bootstrap`是一个最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。通俗的讲,`bootstrap`就是预先定义好了一套优美的`CSS`样式和一套`组件`,前端开发者可以直接拿来使用,加速开发效率,并且他是响应式布局的,所以写的一套代码可以在多种设备中进行使用。
要使用`bootstrap`很简单,只要[下载](https://github.com/twbs/bootstrap "")源代码,然后把`bootstrap.min.css`和`bootstrap.min.js`以及`jquery.min.js`导入到`html`文件中即可使用。或者是使用[bootcss](http://www.bootcss.com/ "")网站提供的`CDN`加速服务,把链接导入到`HTML`文件中即可,要注意的事情是,`jquery`必须放在`bootstrap.min.js`之前,因为`bootstrap.min.js`依赖`jquery`,那么以下将使用`CDN`的方式展示样例代码:
```html
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
```
`bootstrap`中最强大也是最核心的一个东西就是响应式,而响应式是通过一个叫做**栅格系统**的东西实现的。栅格系统把一个页面分成12列,bootstrap会根据媒体查询获取当前的浏览器的宽度,然后再把宽度平均分配给12列,html中一个盒子可以占用多列。要使用栅格系统,需要使用到`container/container-fluid`和`row`以及`col-xs-/col-sm-/col-md-/col-lg-`类。`container`相当于一个`table`盒子,装着许许多多的`row`,每个row里面装着许许多多的`col`,通过这样一种结构,构成了一个栅格系统,而`container`和`container-fluid`的唯一区别是,`container-fluid`是全屏的,而`container`不是全屏的,左右两边会有一个间距。
*
*请认真填写需求信息,我们会在24小时内与您取得联系。