3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

Irene181 等级 1651 1 0

1. 为"你"而写


这篇文章,是专门为那些 "刚学习" Python爬虫的朋友,而专门准备的文章。希望你看过这篇文章后,能够清晰的知道整个 "爬虫流程"。从而能够 "独立自主" 的去完成,某个简单网站的数据爬取。

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

好了,咱们就开始整个 “爬虫教学” 之旅吧!

2. 页面分析

① 你要爬取的网站是什么?

首先,我们应该清楚你要爬去的网站是什么?

由于这里我们想要爬取的是 “实习网” 中的数据,因此我们可以打开这个网站看看(如图所示)。

网站链接: https://www.shixi.com/search/index?

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

由于我们想要爬取 “数据分析” 岗位的数据。因此,直接在输入框输入数据分析即可。

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

这里是我们要的最终页面链接。👇👇待爬取链接:

https://www.shixi.com/search/index?key=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90

观察下图,可以清楚看到有哪些数据,下面还有页面信息。我们需要了解这些: 一个页面中共有多少条数据。这个很重要,后面可以帮你检查,是否爬取到了每个页面的所有信息。

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

图中显示的是 “一级页面” 中的信息,点击任意一个 “岗位名”,会自动跳转到 “二级页面”。以点击 “数据分析实习生” 为例,原来二级页面是这样的。

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

② 你要爬取页面上的哪些信息?

这里我们获取的不仅有一级页面中的信息,还有二级页面中的信息。

在一级页面中(如图所示),我们获取到的有 “公司名”“岗位名”“公司地址”“学历”“薪资”

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

在二级页面中(如图所示),我们获取到的有 “岗位需求”“公司类型”“公司规模”

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

好了,这里一共有8个数据,是我们要获取的数据,这就是我们的 “爬虫目的”

③ 页面是 “静态网页”,还是“动态网页”?

如果你请求某个网页,网页的信息是一次性给你的,那么它就是 “静态网页”

如果你请求某个网页,网页中的信息,随着你鼠标往下滑动,而慢慢展现出来,那么它就是 “动态网页”,即 “Ajax技术”

那么它们的区别就在于: 静态网页中的数据,是一次性给你。动态网页中的数据,是随着页面一步步加载出来,而逐步呈现的,也就是你用静态网页的爬虫技术,无法获取到里面所有的数据。

这里有一个很好 “检验” 是静态网页还是动态网页的方法,我给大家介绍一下 。

点击 “鼠标右键”,点击 “查看网页源代码”

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

最终效果如下(部分截图):

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

这其实就是你请求这个网页,最终返回给你的信息。你要爬取的数据,如果在里面都能找到,大致可以判断是 “静态网页”,如果找不到,大致可以考虑是 “动态网页”

怎么查找呢?

在上述页面,可以点击 “ctrl + f”,调出搜索框(如图所示),你将网页中的数据,粘贴进来,看看能否都能被搜索到。

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

当然,今天这堂课是小白教程,肯定教你的是一个 “静态网页”。但是没关系呀,这些知识你都知道了。

3. 如何定位数据

在正式写代码之前,你肯定要知道,你想要用哪种方式,来帮你解析数据。常见的Python爬虫解析数据的方法有:re正则表达式、xpath、beautifulsoup、pyquery等。

本文黄同学采用的将会是xpath解析法。

好了,我们接着就来定位数据吧!

点击 “鼠标右键”,再点击 “审查元素”。【或者直接按电脑上的F12键】

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

此时,会出现如下页面。

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

这其实是一个 “桥梁”,帮助我们建立起 “网页”“源代码” 之间的关系定位。

那么,应该怎么使用它呢?(观察下图三个步骤)

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

首先,单击①处。接着,光标指向你要定位的数据(②)。此时,在③处,他回自动跳转到你想要定位的数据,在源码中的位置。

这个对于我们写代码超极有帮助,也是最基本的操作。

关于怎么解析数据,我就不在详细说明。因为,这也不是今天这篇文章能够讲清楚的。

今天我就是想让你掌握 “爬虫技术” 的流程。因此,接下来我会为大家讲述整个代码的爬虫思路。

4. 爬虫代码讲解

这里我将会分步为大家讲解整个爬虫流程,这种文章只写这一篇,刚学Python的朋友,一定要看哦!

① 导入相关库

import pandas as pd # 用于数据存储  
import requests # 用于请求网页  
import chardet # 用于修改编码  
import re # 用于提取数据  
from lxml import etree # 解析数据的库  
import time # 可以粗糙模拟人为请求网页的速度  
import warnings # 忽略代码运行时候的警告信息  
warnings.filterwarnings("ignore")

② 请求一级页面的网页源代码

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库可以帮你自动检测网页源码的编码(不懂得再下去研究一下这个库)。

③ 解析一级页面网页中的信息

# 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)

记住:二级页面也是页面呀,你要想获取到其中的消息,就必须再次请求该网页。因此,你可以看到①②③处的代码,和上面写的代码,就是一模一样的。

⑤ 翻页操作



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)

    # ② 获取一级页面中的信息:一共有ⅠⅡⅢⅣⅤⅥ个信息。
    # Ⅰ 公司名
    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]

    # Ⅵ 获取二级页面的url
    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')

最终爬取到的数据如下:

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

好了,本文就讲述到这里。其实对于一个爬虫小白来说内容已经够多了,好好下去消化。

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/MjFwYZ-TUF_H25pEJcyl4g,如有侵权,请联系删除。

收藏
评论区

相关推荐

商业数据分析从入门到入职(9)Python网络数据获取
@toc 前言本文主要讲Python最常见的应用之一——网络数据获取,即爬虫:先介绍了网页和网络的基础知识,为从网页中获取数据打好基础;接下来以两个案例介绍从网络中获取数据和处理数据的不同方式,以进一步认识Python爬虫和数据处理。 一、网络和网页基础知识 1.数据来源数据源有很多,可以从数据库中获取,可以从文件中获取,也可以从
Python网络爬虫与信息提取
title: Python网络爬虫与信息提取date: 20201210 01:00:23tags: Pythoncategories: 学习笔记 写在前面 不知道写啥其实说实话[TOC] 网络爬虫之规则 安装requests库cmd 命令行打开输入pip3 install requests,等待即可简单测试,爬一下bkjwpythonimport requ
手把手教你使用Python网络爬虫获取B站视频选集内容(附源码)
大家好,我是Python进阶者。 前言前几天雪球兄在Python交流群里分享了一个获取B站视频选集的Python代码,小编觉得非常奈斯,这里整理成一篇小文章,分享给大家学习。关于雪球兄,大家应该都熟悉了,之前他写过Python实战文章,好评如潮,没来得及看的小伙伴,可以戳这里了:之前也有给大家分享B站的一些文章,感兴趣的话可以看看这个文章,Python网络爬
50 行代码教你爬取猫眼电影 TOP100 榜所有信息
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫架构中的HTML下载器、HTML解析器、数据存储器三大模块: HTML下载器:利用requests模块下载HTML网页; HTML解析器:利用re正则表达
Python Scrapy 实战
Python Scrapy ============= 什么是爬虫? ------ 网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。 Python 爬虫 --------- 在爬虫领域,Python几乎是霸主地位,将网络一切数据作为资源,通过自动化程序进行有针对性
Python 使用selenium抓取网页文本和下载音频
Python 使用selenium抓取网页文本和下载音频 #!\usr\bin\env python # -*- coding: utf-8 -*- '一个自动从https://podcast.duolingo.com/spanish中下载音频并且爬取文本的程序' '需要配置下载以下所需库,并且配置好webdriv
Python 爬虫:把廖雪峰的教程转换成 PDF 电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 Python 教程 爬下来做成 PDF 电子书方便大家离线阅读。 开始写爬虫前,我们先来分析一下该网站[1](https://www.oschina.net/
Python3 网络爬虫:下载小说的正确姿势
点击上方“ **Python爬虫与数据挖掘** ”,进行关注 回复“**书籍**”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 少年心事当拂云。 ![](https://oscimg.oschina.net/oscnet/09902b71501b9e8c3cb656b5dfbbb0552e0.jpg) 1 **
Python实现王者荣耀小助手(一)
简单来说网络爬虫,是指抓取万维网信息的程序或者脚本,Python在网络爬虫有很大优势,今天我们用Python实现获取王者荣耀相关数据,做一个小助手: 前期准备,环境搭建: Python2.7 sys模块提供了许多函数和变量来处理 Python 运行时环境的不同部分; urllib模块提供了一系列用于操作URL的功能,爬虫所需要的功能,基本上在urll
Python爬取暴走漫画动态图
最近再之乎上看到比较好的Python爬虫教程,看过之后对爬虫有了大概的了解,随后自己写了个爬取[暴走漫画](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fbaozoumanhua.com%2Fcatalogs%2Fgif)动图的爬虫练练手,另外附上[Python爬虫教程](https://w
Python爬取网易云歌单
#### 基本配置: * Python版本:3.7 #### 相关模块: from urllib import parsefrom lxml import etreefrom urllib3 import disable_warningsimport requests #### 案例关键点: 使用单线程爬取,未登录,爬取网易云
Python爬虫
Python爬虫-xpath ============== * Python爬虫-xpath * 说明 * 再说明 * 插件推荐 * 语法讲述 * 举栗子 * 代码里使用 * 实战句子迷 * 需要的总结: 说明 -- 关于Python爬虫请求数据方面的知
Python爬虫:一些常用的爬虫技巧总结
  用python也差不多一年多了,python应用最多的场景还是web快速开发、爬虫、自动化运维:写过简单网站、写过自动发帖脚本、写过收发邮件脚本、写过简单验证码识别脚本。 爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情。 1、基本抓取网页 ======== get方法 ----- import urllib2
Scrapy框架
\[TOC\] 1\. Scrapy介绍 ============ 1.1. Scrapy框架 ------------- Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 ![](http://ccszt.com.cn/python/%E7%88%AC%E8%99%AB/file/images/
python访问百度关键词和链接
前几天在Python交流群有个同学分享了一份Python网络爬虫代码,用来获取某度关键词和链接的。其实这个需求之前我也写过代码,不过网页结构变化之后,之前的提取器已经失效了,所以代码就作废了。今天这里给再给大家分享一个使用python获取某度关键词的实践。由于某度也是设置反爬安全策略的,所有同一IP下程序运行次数多了也是会被封IP的,所有在访问过程中我们需要