c爬虫抓取网页数据(这请我吃一顿饭不过分吧?这篇爬虫实战教程,不仅适合新手练习爬虫)

优采云 发布时间: 2022-01-01 12:21

  c爬虫抓取网页数据(这请我吃一顿饭不过分吧?这篇爬虫实战教程,不仅适合新手练习爬虫)

  暑假已经开始很久了,但是还有很多朋友没有找到暑期实习?前几天,我朋友的弟弟想在暑假找一份实习来锻炼自己,但面对网上成千上万的实习招聘信息,简直让人望而生畏。然后我的朋友给我发了一条“帮助”信息。了解了大致情况后,我立即用爬虫爬取了实习网的信息,并贴出了数据结果。问题在几分钟内得到解决。请我吃饭会不会过分?

  

  本爬虫实战教程不仅适合新手练习爬虫,也适合需要找实习信息的朋友!

  希望看完这篇文章后,能够清楚的了解整个爬虫流程,能够独立完成。其次,可以通过自己的爬虫实战获取自己想要的信息。

  好了,话不多说,开始吧!

  内容主要分为三部分:

  1、页面分析

  2、爬虫步骤详解

  一、目标页面分析

  首先我们要知道我们的爬虫目标是什么?俗话说,知己知彼,百战不殆。我们已经知道我们要爬取的页面是“实习网”,所以我们首先要去实习网看看里面有什么数据。

  实习网址:

  页面如下:

  

  比如我们要找的职位是“品牌运营”职位的数据。因此,直接在网页的搜索框中输入品牌操作即可。你会发现url变了!

  

  注意:我们要抓取的页面是这个页面:品牌运营

  在我们的抓取页面中,我们需要观察有哪些数据,一个页面中有几条数据。这一点很重要,关系到后续的代码编写,可以帮助你检查页面上的信息是否全部被抓取。

  此时需要注意的是,我们所在的页面是“一级页面”。在浏览过程中,我们点击任意一个帖子进入,就会显示“二级页面”。这时候你也会发现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是一种反乱码措施,使浏览器认为爬虫不是爬虫,而是人们在正常使用浏览器请求网页。验证是忽略安全证书提示。某些网页将被视为不安全并会提示您。记住这个参数就行了。

  在②处,我们已经获得了网页的源代码。但是由于网页源代码的编码方式和您电脑的解析方式,可能会出现不一致的情况,返回结果会造成乱码。此时需要修改编码方式,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对一级页面中的数据分析进行了分析。代码最后可以看到:我们已经获取到了二级页面的链接,为我们后续抓取二级页面的信息做准备。

  分析二级页面网页中的信息

  需求列表 = []

  area_list = []

  scale_list = []

  对于 deep_url_list 中的 deep_url:

  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、翻页操作

  随意复制几个不同页面的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 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线