Python丨scrapy抓取招聘网络移动APP的发布信息

优采云 发布时间: 2020-08-08 02:52

  1简介

  我将在一段时间内开始寻找新工作,因此让我们抓取一些工作信息进行分析. 当前的主流招聘网站包括51job,直联,BOSS直接招聘,拉狗等. 我有一段时间没有抓取移动应用程序了. 这次,我将编写一个采集器来搜寻51job.com移动应用程序的工作信息. 其他招聘网站将在以后更新...

  使用的工具(技术):

  IDE: pycharm

  数据库: MySQL

  包裹捕获工具: Fiddler

  采集器框架: scrapy == 1.5.0

  信息捕获: 选择器内置scrapy

  Python学习资料或需要代码,视频和Python学习小组: 960410445

  2 APP捕获分析

  让我们第一次体验51job的应用. 当我们在首页上输入搜索关键字并单击搜索时,该应用程序将跳至新页面. 我们将此页面称为第一级页面. 第一级页面显示了我们正在寻找的所有职位的列表.

  

  当我们单击某个帖子信息时,APP将跳至新页面. 我称此页面为辅助页面. 第二页收录我们需要的所有作业信息,也是我们主页的当前采集页.

  

  分析页面后,您可以分析51job应用程序的请求和响应. 本文中使用的数据包捕获工具是Fiddler.

  本文的目的是捕获在51job应用上搜索某个关键字时返回的所有招聘信息. 本文以“ Python”为例. APP上的操作如下图所示. 输入“ Python”关键字后,单击“搜索”,然后Fiddler抓取4个数据包,如下所示:

  

  实际上,当我们看到第二和第四数据包的图标时,我们应该笑一个. 这两个图标分别表示以json和xml格式传输的数据,许多Web界面以这两种格式传输数据,并且未列出移动应用程序. 选择第二个数据包,然后在右侧的主窗口中检查,发现第二个数据包不收录我们想要的数据. 查看第四个数据包后,选择后可以在右侧窗口中看到以下内容:

  

  右下角的内容不只是您在手机上看到的工作信息吗?它仍然以XML格式传输. 我们复制此数据包的链接:

  keyword = Python&keywordtype = 2&jobarea = 000000&searchid =&famoustype =&pageno = 1&pagesize = 30&accountid =&key =&productname = 51job&partner = 8785419449a858b3314197b60d54d9c6&uuid = 6b21f77c7af3aa83a5c26369792>

  当我们爬网时,我们肯定不仅会爬网一页的信息. 我们在APP上向下滑动页面,以查看Fiddler将抓取哪些数据包. 看下面的图片:

  

  滑下电话屏幕后,Fiddler抓取了另外两个数据包,然后选择了第二个数据包,并再次发现它是APP上新刷新的招聘信息,然后复制此数据包的url链接: </p

ppageno = 2&pagesize = 30&accountid =&key =&productname = 51job&partner = 8785419449a858b3314197b60d54d9c6&uuid = 6b21f77c7af3aa83a5c636792ba087c2&version = 845&guid = bbb37e8f266b9de3e2a9/p

p接下来,让我们比较一下之前和之后的两个链接,以分析异同. 可以看出,除了属性“ pageno”外,其他所有内容都是相同的. 没错,以红色标记. 第一个数据包链接中的pageno值为1,第二个pageno值为2,因此翻页的规则一目了然./p

p现在我们已经找到了APP翻页的请求链接规则,我们可以通过采集器循环将pageno分配给pageno,以实现模拟翻页的功能./p

p让我们再次尝试更改搜索关键字,以查看链接中的变化,以“ java”作为关键字,捕获的数据包为:/p

pkeyword = java&keywordtype = 2&jobarea = 000000&searchid =&famoustype =&pageno = 1&pagesize = 30&accountid =&key =&productname = 51job&partner = 8785419449a858b3314197b60d54d9c6&uuid = 6b21f77c7af3aa83a5c26369845>

  经过比较,发现只有链接中的keyword值不同,并且该值是我们自己输入的关键字. 因此,在爬虫中,我们可以通过字符串拼接来完全实现输入关键字模拟,以采集不同类型的招聘信息. 同样,您可以搜索诸如工作地点之类的信息规则,而本文将不对其进行描述.

  解决翻页功能后,让我们探索数据包中XML的内容. 我们复制上面的第一个链接,然后在浏览器中将其打开. 打开后,屏幕如下:

  

  以这种方式观看要舒服得多. 通过仔细观察,我们会发现APP上的每个职位发布都对应一个标签,每个职位中都有一个标签,并且有一个ID来标识职位. 例如,上面的第一篇文章是109384390,第二篇文章是109381483. 请记住该ID,稍后再使用.

  实际上,接下来,我们单击第一个职位发布以进入第二页. 这时,Fiddler将采集APP刚发送的数据包,单击xml数据包,然后发现它是刚刚在APP上刷新的页面信息. 我们复制数据包的url链接:

  jobid = 109384390&accountid =&key =&from = searchjoblist&jobtype = 0100&productname = 51job&partner = 8785419449a858b3314197b60d54d9c6&uuid = 6b21f77c7af3aa83a5c636792ba087c2&version = 0845&guid = 9bf37e8f

  根据该方法,在第一级页面上的列表中单击第二个作业,然后从Fiddler复制相应数据包的url链接:

  jobid = 109381483&accountid =&key =&from = searchjoblist&jobtype = 0100&productname = 51job&partner = 8785419449a858b3314197b60d54d9c6&uuid = 6b21f77c7af3aa83a5c636792ba087c2&version = 0845&guid = 9bf37e8f

  比较以上两个链接,您是否找到了模式?是的,jobid不同,其他都一样. 此Jobid是我们在第一页xml中找到的jobid. 由此,我们可以从第一级页面获取Jobid来构造第二级页面的url链接,然后采集我们需要的所有信息. 整个采集器逻辑很明确:

  构造第一级页面的初始URL->采集jobid->构造第二级页面的URL->获取工作信息->通过循环模拟获取下一页的URL.

  好的,分析工作已经完成,我开始编写采集器.

  3编写采集器

  本文使用的是无忧移动APP网络采集器的Scrapy框架. 在下载了草率的第三方软件包之后,通过命令行创建一个爬虫项目:

  scrapy startproject job_spider.

  job_spider是我们的检索器项目的项目名称. 有一个“. ”在项目名称之后. 这一点是可选的. 区别在于在当前文件之间创建一个项目,或者创建一个与项目名称相同的文件. 在文件中创建一个项目.

  创建项目后,继续创建一个采集器,专用于搜寻51job发布的招聘信息. 创建一个名称如下的采集器:

  scrapy genspider qcwySpider

  注意: 如果未添加“. ”. 创建爬网程序项目时,将其更改为项目名称,请在运行命令以创建爬网程序之前进入项目文件夹.

  打开刚刚通过pycharm创建的爬虫项目,左侧​​的目录树结构如下:

  

  在开始所有采集器工作之前,请先打开settings.py文件,然后取消注释“ ROBOTSTXT_OBEY = False”行并将其值更改为False.

  #遵守robots.txt规则ROBOTSTXT_OBEY = False

  完成以上修改后,在spiders包下打开qcwySpider.py. 初始代码如下:

  

  这是scrapy为我们建立的框架. 我们只需要在此基础上改进爬虫.

  首先,我们需要向类添加一些属性,例如search关键字keyword,起始页,要进行爬网以获得最大页面数,还需要设置标头以进行简单的反爬网. 此外,starturl也需要重置为第一页的URL. 更改后的代码如下:

  

  然后开始编写parse方法来对第一级页面进行爬网. 在第一页中,我们的主要逻辑是通过循环在APP中实现屏幕幻灯片的更新. 我们在上面的代码中使用current_page来标识当前页码,在每个循环之后,将1添加到current_page中,然后构造一个新的url,并通过回调解析方法抓取下一页. 另外,我们还需要在parse方法中从第一级页面采集jobid,并构造第二级页面,然后回调实现第二级页面信息采集的parse_job方法. 解析方法代码如下:

  

  为了便于调试,我们在项目的jobSpider目录中创建一个main.py文件来启动采集器,并在每次启动采集器时运行该文件. 内容如下:

  

  辅助页面信息采集功能是在parse_job方法中实现的,因为我们需要获取的所有信息都在xml中,所以我们可以使用scrapy附带的选择器直接提取它,但是在提取之前,我们需要先定义用于存储我们采集的数据的项目. 打开items.py文件,编写一个Item类,然后输入以下代码:

  

  上面的每个项目都对应一个xml标记,该标记用于存储一条信息. 在qcwyJobsItem类的末尾,定义了一个do_insert方法,该方法用于生成插入语句,该语句将所有信息存储在数据库中的项目中. 之所以在items块中生成此insert语句,是因为如果将来有多个采集器,则在管道模块中可以有多个项目类之后,可以为不同的项目插入数据库,以使该项目更具可伸缩性. 您还可以编写所有与在管道中插入数据库有关的代码.

  然后编写parse_job方法:

  

  完成上述代码后,信息采集部分完成. 接下来,继续编写信息存储功能,该功能在pipelines.py中完成.

  

  在编写pipeline.py之后,打开settings.py文件并配置刚刚写入项目设置文件的MysqlTwistedPipline类:

  

  另外,还要配置数据库:

  

  您还可以将数据库配置嵌入MysqlTwistedPipline类中,但是我习惯于将这些专有数据库信息写入配置文件中.

  最后,仅需一步即可建立数据库和数据表. 表结构的一部分如下所示:

  

  完成上述所有操作后,您可以运行采集器以开始采集数据. 采集的数据如下图所示:

  

  4摘要

  经过整个过程,我觉得51job.com APP的爬取比Web爬取更容易(似乎很多网站都是这样). 回顾整个过程,实际上代码中有许多细节可以改进和完善,例如,在构建链接时可以添加职位搜索位置. 这篇博客文章侧重于整个爬网程序过程的逻辑分析,并介绍了APP的基本爬网方法. 博客文章中省略了部分代码. 如果您需要完整的代码,请从我的github获得. 将来,我们将继续更新其他招聘网站的抓取工具. 返回搜狐查看更多

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线