Python丨scrapy爬取某急聘网手机APP发布信息
优采云 发布时间: 2020-08-10 08:511 引言
过段时间要开始找新工作了,爬取一些岗位信息来剖析一下吧。目前主流的急聘网站包括前程无忧、智联、BOSS直聘、拉勾等等。有段时间时间没爬取手机APP了,这次写一个爬虫爬取前程无忧手机APP岗位信息,其他急聘网站后续再更新补上……
所用工具(技术):
IDE:pycharm
Database:MySQL
抓包工具:Fiddler
爬虫框架:scrapy==1.5.0
信息抓取:scrapy外置的Selector
Python学习资料或则须要代码、视频加Python学习群:960410445
2 APP抓包剖析
我们先来体会一下前程无忧的APP,当我们在首页输入搜索关键词点击搜索然后APP都会跳转到新的页面,这个页面我们暂且称之为一级页面。一级页面展示着我们所想找查看的所有岗位列表。
当我们点击其中一条岗位信息后,APP又会跳转到一个新的页面,我把这个页面称之为二级页面。二级页面有我们须要的所有岗位信息,也是我们的主要采集目前页面。
分析完页面然后,接下来就可以对前程无忧手机APP的恳求(request)和回复(response)进行剖析了。本文所使用的抓包工具为Fiddler。
本文的目的是抓取前程无忧APP上搜索某个关键词时返回的所有急聘信息,本文以“Python”为例进行说明。APP上操作如下图所示,输入“Python”关键词后,点击搜索,随后Fiddler抓取到4个数据包,如下所示:
事实上,当听到第2和第4个数据包的图标时,我们就应当会心一笑。这两个图标分别代表传输的是json和xml格式的数据,而好多web插口就是以这两种格式来传输数据的,手机APP也不列外。选中第2个数据包,然后在右边主窗口中查看,发现第二个数据包并没有我们想要的数据。在瞧瞧第4个数据包,选中后在右边窗体,可以看见以下内容:
右下角的内容不就是在手机上看见的急聘信息吗,还是以XML的格式来传输的。我们将这个数据包的链接复制出来:
keyword=Python&keywordtype=2&jobarea=000000&searchid=&famoustype=&pageno=1&pagesize=30&accountid=&key=&productname=51job&partner=8785419449a858b3314197b60d54d9c6&uuid=6b21f77c7af3aa83a5c636792ba087c2&version=845&guid=bbb37e8f266b9de9e2a9fbe3bb81c3d0
我们爬取的时侯肯定不会只爬取一个页面的信息,我们在APP上把页面往下滑,看看Fiddler会抓取到哪些数据包。看右图:
手机屏幕往下滑动后,Fiddler又抓取到两个数据包,而且第二个数据包选中看再度发觉就是APP上新刷新的急聘信息,再把这个数据包的url链接复制出来:
pageno=2&pagesize=30&accountid=&key=&productname=51job&partner=8785419449a858b3314197b60d54d9c6&uuid=6b21f77c7af3aa83a5c636792ba087c2&version=845&guid=bbb37e8f266b9de9e2a9fbe3bb81c3d0
接下来,我们比对一下前后两个链接,分析其中的优缺。可以看出,除了“pageno”这个属性外,其他都一样。没错,就是在里面标红的地方。第一个数据包链接中pageno值为1,第二个pageno值为2,这下翻页的规律就一目了然了。
既然我们早已找到了APP翻页的恳求链接规律,我们就可以在爬虫中通过循环形参给pageno,实现模拟翻页的功能。
我们再尝试一下改变搜索的关键词瞧瞧链接有哪些变化,以“java”为关键词,抓取到的数据包为:
keyword=java&keywordtype=2&jobarea=000000&searchid=&famoustype=&pageno=1&pagesize=30&accountid=&key=&productname=51job&partner=8785419449a858b3314197b60d54d9c6&uuid=6b21f77c7af3aa83a5c636792ba087c2&version=845&guid=bbb37e8f266b9de9e2a9fbe3bb81c3d0
对比后发觉,链接中也只有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=845&guid=bbb37e8f266b9de9e2a9fbe3bb81c3d0
如法炮制点开一级页面中列表的第二条急聘,然后从Fiddler中复制出对应数据包的url链接:
jobid=109381483&accountid=&key=&from=searchjoblist&jobtype=0100&productname=51job&partner=8785419449a858b3314197b60d54d9c6&uuid=6b21f77c7af3aa83a5c636792ba087c2&version=845&guid=bbb37e8f266b9de9e2a9fbe3bb81c3d0
对比前面两个链接,发现规律没?没错,就是jobid不同,其他都一样。这个jobid就是我们在一级页面的xml中发觉的jobid。由此,我们就可以在一级页面中抓取出jobid来构造出二级页面的url链接,然后采集出我们所须要的所有信息。整个爬虫逻辑就清晰了:
构造一级页面初始url->采集jobid->构造二级页面url->抓取岗位信息->通过循环模拟翻页获取下一页面的url。
好了,分析工作完成了,开始动手写爬虫了。
3 编写爬虫
本文编撰前程无忧手机APP网路爬虫用的是Scrapy框架,下载好scrapy第三方包后,通过命令行创建爬虫项目:
scrapy startproject job_spider .
job_spider就是我们本次爬虫项目的项目名称,在项目名前面有一个“.”,这个点可有可无,区别是在当前文件之间创建项目还是创建一个与项目名同名的文件之后在文件内创建项目。
创建好项目后,继续创建一个爬虫,专用于爬取前程无忧发布的急聘信息。创建爬虫命名如下:
scrapy genspider qcwySpider
注意:如果你在创建爬虫项目的时侯没有在项目名前面加“.”,请先步入项目文件夹以后再运行命令创建爬虫。
通过pycharm打开刚创建好的爬虫项目,左侧目录树结构如下:
在开始一切爬虫工作之前,先打开settings.py文件,然后取消“ROBOTSTXT_OBEY = False”这一行的注释,并将其值改为False。
# Obey robots.txt rulesROBOTSTXT_OBEY = False
完成上述更改后,打开spiders包下的qcwySpider.py,初始代码如下:
这是scrapy为我们搭好的框架,我们只须要在这个基础起来建立我们的爬虫即可。
首先我们须要在类中添加一些属性,例如搜索关键词keyword、起始页、想要爬取得最大页数,同时也须要设置headers进行简单的反爬。另外,starturl也须要重新设置为第一页的url。更改后代码如下:
然后开始编撰parse方式爬取一级页面,在一级页面中,我们主要逻辑是通过循环实现APP中屏幕下降更新,我们用前面代码中的current_page来标示当前页页脚,每次循环后,current_page加1,然后构造新的url,通过反弹parse方式爬取下一页。另外,我们还须要在parse方式中在一级页面中采集出jobid,并构造出二级页面的,回调实现二级页面信息采集的parse_job方式。parse方式代码如下:
为了便捷进行调试,我们在项目的jobSpider目录下创建一个main.py文件,用于启动爬虫,每次启动爬虫时,运行该文件即可。内容如下:
二级页面信息采集功能在parse_job方式中实现,因为所有我们须要抓取的信息都在xml中,我们直接用scrapy自带的selector提取下来就可以了,不过在提取之前,我们须要先定义好Item拿来储存我们采集好的数据。打开items.py文件,编写一个Item类,输入以下代码:
上面每一个item都与一个xml标签对应,用于储存一条信息。在qcwyJobsItem类的最后,定义了一个do_insert方式,该方式用于生产将item中所有信息储存数据库的insert句子,之所以在items铁块中生成这个insert句子,是因为日后若果有了多个爬虫,有多个item类以后,在pipelines模块中,可以针对不同的item插入数据库,使本项目具有更强的可扩展性。你也可以将所有与插入数据库有关的代码都写在pipelines。
然后编撰parse_job方式:
完成上述代码后,信息采集部分就完成了。接下来继续写信息储存功能,这一功能在pipelines.py中完成。
编写完pipelines.py后,打开settings.py文件,将刚写好的MysqlTwistedPipline类配置到项目设置文件中:
顺便也把数据库配置好:
数据库配置你也可以之间嵌入到MysqlTwistedPipline类中,不过我习惯于把这种专属的数据库信息写在配置文件中。
最后,只差一步,建数据库、建数据表。部分表结构如下图所示:
完成上述所有内容以后,就可以运行爬虫开始采集数据了。采集的数据如下图所示:
4 总结
整个过程出来,感觉前程无忧网APP爬取要比网页爬取容易一些(似乎好多网站都这样)。回顾整个流程,其实代码中还有众多细节尚可改进建立,例如还可以在构造链接时加上求职地点等。本博文重在对整个爬虫过程的逻辑剖析和介绍APP的基本爬取方式,博文中省略了部份代码,若须要完整代码,请在我的github中获取,后续将继续更新其他急聘网站的爬虫。返回搜狐,查看更多