寒假降临,好多小伙伴都在找暑期实习吧?前几天,敌人弟弟,想在寒假期间找个实习工作锤炼本人,可是面对网络上几千条实习招聘信息,几乎让人头大。随后敌人向我收回了“申请帮忙”的信息,我理解了大抵状况后,立马用爬虫爬取了实习网的的信息,将数据后果发了过来,问题分分钟解决。这请我吃一顿饭不过分吧?
这篇爬虫实战教程,不仅适宜老手练习爬虫,也适宜须要找实习信息的敌人!
心愿在看了这篇文章后,可能清晰的晓得整个爬虫流程,并且可能独立自主的实现,其次,可能通过本人的爬虫实战,获取本人想要的信息。
好了,话不多说,咱们就开始吧!
内容次要分为三大部分:
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')
这样一套下来,爬虫的思路是不是霎时清晰明了?眼睛:我会了!手:我还是不会。得多加练习啊。初学者不要急于求成,我的项目不在多,在精。踏踏实实吃透一个远比看会十个更无效。
想要获取源代码的小火伴们,点赞 + 评论,私聊 哦~