关于python:保姆级爬虫教程利用python爬取实习网信息立马帮朋友找到合适的实习工作

2次阅读

共计 6964 个字符,预计需要花费 18 分钟才能阅读完成。

寒假降临,好多小伙伴都在找暑期实习吧?前几天,敌人弟弟,想在寒假期间找个实习工作锤炼本人,可是面对网络上几千条实习招聘信息,几乎让人头大。随后敌人向我收回了“申请帮忙”的信息,我理解了大抵状况后,立马用爬虫爬取了实习网的的信息,将数据后果发了过来,问题分分钟解决。这请我吃一顿饭不过分吧?

这篇爬虫实战教程,不仅适宜老手练习爬虫,也适宜须要找实习信息的敌人!
心愿在看了这篇文章后,可能清晰的晓得整个爬虫流程,并且可能独立自主的实现,其次,可能通过本人的爬虫实战,获取本人想要的信息。

好了,话不多说,咱们就开始吧!
内容次要分为三大部分:
1、页面剖析
2、爬虫步骤详解

一、指标页面剖析

首先,咱们应该要晓得本人的爬虫指标是个什么货色吧?俗话说,知己知彼,百战不殆。咱们曾经晓得本人要爬取的页面是“实习网”,所以,咱们首先得去实习网看看,都有些什么数据。
实习网址:https://www.shixi.com/search/…
页面如下:

例如咱们要找的岗位是“品牌经营”岗位的数据。因而间接在网页的搜寻框输出品牌经营就行了。你会发现 url 产生了变动!

留神:咱们要爬取的页面就是这页:https://www.shixi.com/search/… 品牌经营
在咱们的爬取页面中,咱们须要察看有哪些数据,并且一个页面中有几条数据。这个十分重要,关系到前面的代码编写,以及能够帮你查看,是否爬取到了页面的所有信息。

此时,咱们要留神的是,咱们所在的页面是“一级页面”,在浏览过程中,咱们 点击随便一个岗位进入后出现的是“二级页面”,此时你也会发现 url 又产生了变动。
例如,咱们点一个品牌经营实习,二级页面就会主动跳转成这样,产生一个新的链接。如图:

要爬取页面上的那些信息呢?

咱们在剖析过程中发现,有些信息是在一级页面中,有些是在二级页面中。
在一级页面中,咱们能够获取那些信息呢?如图所示:

总共有五条无效数据:职位、公司名、学历、薪资、地址

在二级页面中,咱们来看看能够获取什么无效数据,畛域和规模,阶段如果你感觉重要的话,也能够纳入爬虫范畴,然而我集体认为,这并不影响实习,毕竟不是找正式工作,影响不会很大,反而是招聘实习生的数量更为重要,这里并未显示招聘人数,无奈在图片上出现,后续可加上。

到这里,咱们一共须要抓取 7 个数据,加上“人数”一共 8 个数据,这也就是咱们爬虫的最终目标数据。

爬取“动态”网页

这里剖析下什么叫动态网页,什么叫动静网页。动态网页,随着 html 代码的生成,页面的内容和显示成果就基本上不会发生变化了 – 除非你批改页面代码。而动静网页则不然,页面代码尽管没有变,然而显示的内容却是能够随着工夫、环境或者数据库操作的后果而产生扭转的。

它们的区别就在于:动态网页中的数据,是一劳永逸,也就是说一次性给你。动静网页中的数据,是随着页面一步步加载进去,而逐渐出现的,也就是你用动态网页的爬虫技术,无奈获取到其中所有的数据。

值得强调的是,不要将动静网页和页面内容是否有动感一概而论。这里说的动静网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有间接关系,动静网页也能够是纯文字内容的,也能够是蕴含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具备动态效果,只有是采纳了动静网站技术生成的网页都能够称为动静网页。

点击“鼠标右键”,点击“查看网页源代码”,最终成果如图(局部截图):

这就是,最终反馈给你的数据,如果你发现自己想要的数据都在这外面,那么就能够说是动态页面,如若不然,则思考为“动静页面”。
明天这里的案例是动态网页。

大家晓得,在写代码之前要先晓得,咱们要用哪些形式,哪些库,哪些模块去帮你解析数据。常见用来解析数据的办法有:re 正则表达式、xpath、beatifulsoup、pyquery 等。
咱们须要用到的是 xpath 解析法来剖析定位数据。

二、爬虫代码解说

1、导入相干库

爬虫的第一步是要思考好,爬虫过程中须要用到哪些库,要晓得 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]

4、获取二级页面的链接

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)

要留神的是,二级页面也是页面,在爬取其中的数据时,也须要申请页面。所以,①②③处的代码,都是截然不同的。

5、翻页操作

https://www.shixi.com/search/…
https://www.shixi.com/search/…
https://www.shixi.com/search/…

随便复制几个不同页面的 url,察看它们的区别。这里能够看到,也就 page 参数前面的数字不同,是第几页,数字就是几。

x = "https://www.shixi.com/search/index?key= 数据分析 &page="
url_list = [x + str(i) for i in range(1,21)] 

因为咱们爬取了 20 页 的数据,这里就结构出了 20 个 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')

这样一套下来,爬虫的思路是不是霎时清晰明了?眼睛:我会了!手:我还是不会。得多加练习啊。初学者不要急于求成,我的项目不在多,在精。踏踏实实吃透一个远比看会十个更无效。
想要获取源代码的小火伴们,点赞 + 评论,私聊 哦~

正文完
 0