IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【小白可学会系列三】爬虫框架Scrapy如何保存千万数据? -> 正文阅读

[Python知识库]【小白可学会系列三】爬虫框架Scrapy如何保存千万数据?

前言

📝书接上回,我们完成了Scrapy基础的学习,并成功爬取了数据,但是因为篇幅过多,而且针对小白,所以保存数据的内容就没写,今天就来看一看怎么保存数据,并且再次深入学习Scrapy框架

?一.项目描述

建立爬虫的第一步就是明确我们的爬取对象,今天我们这个项目的爬取对象是职友集。这个网站可以通过索引的方式,搜索到全国上百家招聘网站的最新职位。

?二.明确目标

进入页面后,可以看到页面上有地区企业排行榜,总共有包含有四个榜单:里面含有本月人气企业榜、最佳口碑雇主、最多粉丝企业榜和最多评论企业榜。
请添加图片描述

点击本月最佳人气榜中的【北京字节跳动科技有限公司】,会跳转到它的详情页面,再点击【招聘】,就能看到这家公司正在招聘的所有岗位信息。
在这里插入图片描述

在下方就能看到所以岗位的招聘信息
初步观察后,我们可以把爬取目标定为:先爬取地区企业排行榜中四个榜单里的公司,再接着爬取这些公司的招聘信息。
我们来把目标进一步细化:先爬取每个榜单中的10家公司,四个榜单一共就是40家公司。再跳转到这40家公司的招聘信息页面,爬取到公司名称、职位、工作地点和招聘要求等细节信息。


?三.分析过程

1.网址的获取

首先,要看企业排行榜里的公司信息藏在了哪里。我们先去寻找

现在就让我们献出杀器:按F12,点击Network,刷新页面。点开第0个请求company/,看Response,找一下有没有榜单的公司信息在里面。
在这里插入图片描述

果不其然,四个榜单的所有公司信息就在html里面,如果小伙伴没看见,按Ctrl+F随便搜索一个公司,然后就会跳转到该位置

1.现在再点击Elements,点亮光标,再把鼠标移到【字节公司上】,这时就会定位到含有这家公司信息的<a>标签上。

2.点击href="/company/10375749/",会跳转到字节这家公司的详情页面。详情页面的网址是:https://www.jobui.com/company/10375749/

3.然后,我们把这个网址和其他公司的网址相比较,可以总结出/company/+数字/应该是构成公司网址的结构。如此一来,公司详情页面的网址规律我们就得出来了:
http://www.jobui.com/company/数字/

那么,我们只要把<a>标签的href属性的值提取出来,就能构造出每家公司详情页面的网址。通过该网址获得详情页面里的招聘信息了。

在这里插入图片描述

仔细观察网页html的结构,你会发现,每个公司信息都藏在一个<li>标签里,而每5个<li>标签都从属与一个<ul>标签。这是一个层层嵌套的关系。
首先可以肯定的是,我们不能直接用find_all()抓取<a>标签。原因很简单:这个页面有太多的<a>标签,这样做会抓出来很多不需要的信息。

在这里我们首先抓取最外层的<ul>标签,再抓取<ul>标签里的<a>标签,最后提取到<a>标签href属性的值。就像俄罗斯套娃一样,一层接着一层。

🎉分析到这里,我们已经知道构成公司详情页面的网址规律,和如何提取<a>标签href属性的值。

2.信息的获取

我们打开【字节】的详情页面,点击【招聘】。会在页面的网址中看到比原来的网址多了一个jobs的后缀。
在这里插入图片描述
如果你多点击几家公司的详情页面,查看招聘信息,就会知道:公司招聘信息的网址也是有规律的:https://www.jobui.com/company/数字/jobs

我们再来看看该如何获取这些公司的招聘职位信息还是在阿里巴巴集团的招聘信息页面,右击打开“检查”工具,点击Network,刷新一下。我们点击第0个请求jobs/,查看Response,翻找看看里面有没有这家公司的招聘信息。
在这里插入图片描述
🎉成功找到!然后再获取招聘岗位的信息

公司名称藏在<a class="company-banner-name">标签的文本中。我们可以通过class属性,定位到<a>的这个标签,取出<div>标签的文本,就能拿到公司名称

在这里插入图片描述

你会发现:每个岗位的信息都藏在一个<class=“job-segmetation”>标签下
里面含有两个<class=“job-segmetation”>的标签。
第一个<class=“job-segmetation”>里面包含职位名称的信息。
第二个<class=“job-segmetation”>中的
第一个<span>包含工作地点
第二个<span>包含职位要求。

🎉这样分析下来,我们想要的招聘信息,包括公司名称、职位名称、工作地点和职位要求,都定位清楚了。

?四.代码实现

我们先来回顾一下如何使用Scrapy吧:

  1. 创建Scrapy项目
  2. 定义item
  3. 编写spiders
  4. 修改setting.py
  5. 运行Scrapy

第一步首先需要创建一个Scrapy项目,在目录终端输入:scrapy startproject stan,可以得到下面的文件
在这里插入图片描述

我们刚刚分析的时候,已经确定要爬取的数据是公司名称、职位名称、工作地点和招聘要求。

1.定义item

打开items.py文件写入下面的代码:

import scrapy



class StanItem(scrapy.Item):

    # 定义了一个继承自scrapy.Item的Class14Item类

    company = scrapy.Field()

    # 定义公司名称的数据属性

    position = scrapy.Field()

    # 定义职位名称的数据属性

    address = scrapy.Field()

    # 定义工作地点的数据属性

    detail = scrapy.Field()

    # 定义招聘要求的数据属性

创建和编写爬虫文件

2.创建和编写爬虫文件:网址

紧接着,我们要在spiders文件夹下创建爬虫文件,我们将它命名为Spider_GetJobInfo
代码如下:

import scrapy

import bs4

from ..items import StanItem


class Spider_GetJobInfo(scrapy.Spider):
    # 定义一个爬虫类Spider_GetJobInfo

    name = 'GetJobsInfo'

    # 定义爬虫的名字为GetJobsInfo

    allowed_domains = ['www.jobui.com']

    # 定义允许爬虫爬取网址的域名——职友集网站的域名

    start_urls = ['https://www.jobui.com/rank/company/']

    # 定义起始网址——职友集企业排行榜的网址

    def parse(self, response):

        # parse是默认处理response的方法

        bs = bs4.BeautifulSoup(response.text, 'html.parser')

        # 用BeautifulSoup解析response(企业排行榜的网页源代码)

        ul_list = bs.find_all('ul', class_="textList flsty cfix")

        # 用find_all提取<ul class_="textList flsty cfix">标签

        for ul in ul_list:

            # 遍历ul_list

            a_list = ul.find_all('a')

            # 用find_all提取出<ul class_="textList flsty cfix">标签里的所有<a>标签

            for a in a_list:
                # 再遍历a_list

                company_id = a['href']

                # 提取出所有<a>标签的href属性的值,也就是公司id标识

                url = 'https://www.jobui.com{id}jobs'.format(id=company_id)

                # 构造出包含公司名称和招聘信息的网址链接的list
                yield scrapy.Request(url, callback=self.parse_GetJobInfo)
                # 用yield语句把构造好的request对象传递给引擎。
                # 用scrapy.Request构造request对象。callback参数设置调用parse_GetJobInfo方法。


我们来简要的分析一下上面这段代码的含义:第5-12行代码:定义了爬虫类Spider_GetJobInfo、爬虫的名字GetJobsInfo、允许爬虫爬取的域名和起始网址。

剩下的代码很好理解:我们用默认的parse方法来处理response(企业排行榜的网页源代码);用BeautifulSoup来解析response;用find_all方法提取数据(公司id标识)。
在这里插入图片描述

想要获得公司详情页面的就必须有公司的id标识。想要抓取它,就得先抓到所有最外层的<ul class_="textList flsty cfix">标签,再从中抓取所有<a>标签。公司id标识就是<a>标签的href属性的值.

🎉所以这里用了两个for循环,把标签的href 属性的值提取了出来,并成功构造了公司招聘信息的网址。

3.创建和编写爬虫文件:信息

获取不同公司的招聘职位信息。从这里开始,就需要重新构造新的requests对象和定义新的方法处理response。

代码如下:

def parse_GetJobInfo(self, response):
        # 定义新的处理response的方法parse_GetJobInfo(方法的名字可以自己起)
        bs = bs4.BeautifulSoup(response.text, 'html.parser')
        # 用BeautifulSoup解析response(公司招聘信息的网页源代码)
        company = bs.find(class_="company-banner-name").text
        # 用find方法提取出公司名称
        datas = bs.find_all('div', class_="job-simple-content")
        # 用find_all提取<div class_="job-simple-content">标签,里面含有招聘信息的数据
        for data in datas:
            # 遍历datas
            item = StanItem()
            # 实例化StanItem这个类
            item['company'] = company
            # 把公司名称放回StanItem类的company属性里
            item['position'] = data.find_all('div', class_="job-segmetation")[0].find('h3').text
            # 提取出职位名称,并把这个数据放回Class14Item类的position属性里
            item['address'] = data.find_all('div', class_="job-segmetation")[1].find_all('span')[0].text
            # 提取出工作地点,并把这个数据放回Class14Item类的address属性里
            item['detail'] = data.find_all('div', class_="job-segmetation")[1].find_all('span')[1].text
            # 提取出招聘要求,并把这个数据放回Class14Item类的detail属性里
            yield item
            # 用yield语句把item传递给引擎

这段代码放在上一个方法下方

这里我讲一讲第一个yield哪一行代码的含义:scrapy.Request是构造requests对象的类。real_url是我们往requests对象里传入的每家公司招聘信息网址的参数。

callback的中文意思是回调。self.parse_GetJobInfo是我们新定义的parse_GetJobInfo方法。往requests对象里传入callback=self.parse_GetJobInfo这个参数后,引擎就能知道response要前往的下一站,是用parse_GetJobInfo()方法来解析传入的新参数。

def parse_GetJobInfo(self, response):这个方法是用来解析和提取公司招聘信息的数据。

对照一下我们上文对如何获取招聘信息的数据定位表格,你应该能比较好地理解代码。

数据HTML元素HTML属性
公司名称divid=”companyH1“
职位名称a
工作地点spanclass=”co180“
招聘要求spanclass=”col150“

最后,用yield语句把item传递给引擎。至此,爬虫部分的核心代码就写完啦~

?五.数据保存

数据的保存呢,有CSV和Excel等常用的方法,如果有小伙伴没学过,我可以再出一些关于python来进行Excel保存数据的教程(当然需要的人多的话,大家可以评论或私信(???))

Scrapy可以支持把数据存储成csv文件或者Excel文件,当然实现方式是不一样的。

1.CSV保存

我们先来看如何讲数据保存为csv文件。存储成csv文件的方法比较简单,只需在settings.py文件里,添加如下的代码即可。

FEED_URI='%(name)s.csv'
FEED_FORMAT='csv'
FEED_EXPORT_ENCODING='ansi'

1.FEED_URI:是导出文件的路径。’%(name)s.csv’,就是把CSV文件放到与settings.py文件同级文件夹内。

2.FEED_FORMAT: 是导出数据格式,写CSV就能得到CSV格式。

3.FEED_EXPORT_ENCODING: 是导出文件编码,ansi是一种在windows上的编码格式,你也可以把它变成utf-8用在mac电脑上。


2.Excel保存

Scrapy可以支持把数据存储成csv文件或者Excel文件,当然实现方式是不一样的。
我们需要先在setting.py里设置启用ITEM_PIPELINES,设置方法如下:

在这里插入图片描述

只要取消ITEM_PIPELINES的注释(删掉#)即可。

接着,我们就可以去编辑pipelines.py文件。这里要注意了,我们依旧要借助openpyxl来实现对爬取到的数据进行保存。

import openpyxl



class StanPipeline(object):

    # 定义一个StanPipeline类,负责处理item

    def __init__(self):

        # 初始化函数 当类实例化时这个方法会自启动

        self.wb = openpyxl.Workbook()

        # 创建工作薄

        self.ws = self.wb.active

        # 定位活动表

        self.ws.append(['公司', '职位', '地址', '招聘信息'])

        # 用append函数往表格添加表头



    def process_item(self, item, spider):

        # process_item是默认的处理item的方法,就像parse是默认处理response的方法

        line = [item['company'], item['position'], item['address'], item['detail']]

        # 把公司名称、职位名称、工作地点和招聘要求都写成列表的形式,赋值给line

        self.ws.append(line)

        # 用append函数把公司名称、职位名称、工作地点和招聘要求的数据都添加进表格

        return item

        # 将item丢回给引擎,如果后面还有这个item需要经过的itempipeline,引擎会自己调度



    def close_spider(self, spider):

        # close_spider是当爬虫结束运行时,这个方法就会执行

        self.wb.save('JobInfo.xlsx')

        # 保存文件

        self.wb.close()

        # 关闭文件

?六.修改设置

在启动爬虫之前,不要忘记在settings.py文件里添加请求头,以及把ROBOTSTXT_OBEY=True改成ROBOTSTXT_OBEY=False。
在这里插入图片描述
还有一处默认设置我们需要修改,代码如下:

# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
这里我们需要对#DOWNLOAD_DELAY = 3这行取消注释,同时对DOWNLOAD_DELAY这个参数的值进行修改。

DOWNLOAD_DELAY的意思是下载延迟,这个参数的作用是控制爬虫的速度。3秒对于这个项目来说太慢了,我们要把下载延迟的时间改成0.5秒。
在这里插入图片描述

如何运行,详细的教程,再另一篇文章这里简单说一下

创建main函数,如何输入代码:

from scrapy import cmdline
#导入cmdline模块,可以实现控制终端命令行
cmdline.execute(['scrapy','crawl','GetJobsInfo'])
#用execute()方法,输入运行scrapy的命令

最后保存在了excel中
这里提醒一下,爬取的所以数据不可作为商用,这里仅仅作为教学参考

在这里插入图片描述

📢没有看的朋友可以看看,上一篇Scrapy基础教学及实践:https://akastan.blog.csdn.net/article/details/119920323

结果是看客们茶余饭后的谈资
过程是亲历者经年留影的宝藏

?如果喜欢的话,给个关注和点赞吧?

对python感兴趣的朋友可以看看这些文章,相信我看完一定会有收获的:
【小白可学会系列一】用python做一个翻译软件。

【小白可学会系列二】用python爬虫框架Scrapy来完成一个小项目

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:19:16  更:2021-09-02 11:19:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 22:55:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计