所用工具(技术):如何配置Fiddler及如何抓取手机APP数据包

优采云 发布时间: 2021-08-03 22:39

  所用工具(技术):如何配置Fiddler及如何抓取手机APP数据包

  1 简介

  过段时间就开始找新工作了,我们爬取一些工作信息来分析一下。目前主流招聘网站包括51job、智联、BOSS直招、pullgou等。我有一段时间没有抓取移动应用程序了。这次我会写一个爬虫来爬取的手机app的职位信息。其他招聘网站稍后更新...

  使用的工具(技术):

  IDE:pycharm

  数据库:MySQL

  抓包工具:Fiddler

  爬虫框架:scrapy==1.5.0

  信息捕获:scrapy 内置的选择器

  2 APP抓包分析

  先来体验一下51job的app吧。当我们在首页输入search关键词并点击search时,app会跳转到一个新页面。我们称这个页面为一级页面。一级页面显示了我们正在寻找的所有职位的列表。

  

  当我们点击其中一个帖子信息时,APP会跳转到一个新页面。我称这个页面为二级页面。二级页面有我们需要的所有职位信息,也是我们的主要采集当前页面。

  

  分析页面后,可以分析51job应用的请求和响应。本文使用的抓包工具是Fiddler。 Fiddler的使用方法请查看这篇文章《Fiddler在网络爬虫中抓取PC端网页数据包和手机APP数据包》的博客。本篇博文详细介绍了如何配置Fiddler以及如何抓取手机APP数据包。链接如下:

  本文的目的是捕捉在51job App上搜索某个关键词时返回的所有招聘信息。本文以“Python”为例进行说明。 APP上的操作如下图所示。输入“Python”关键词后,点击搜索,然后Fiddler抓取4个数据包,如下图:

  

  其实,当我们看到第2个和第4个数据包的图标时,我们应该会心一笑。这两个图标分别代表json和xml格式传输的数据,很多web界面都是用这两种格式传输数据,手机app也没有列出。选择第二个数据包,然后在右侧主窗口查看,发现第二个数据包中没有我们想要的数据。查看第四个数据包,选中后,在右边的表格中,可以看到如下:

  

  右下角的内容不就是你在手机上看到的职位信息吗?它仍然以 XML 格式传输。我们复制这个数据包的链接:

  keyword=Python&keywordtype=2&jobarea=000000&searchid=&着名类型=&pageno=1&pagesize=30&accountid=&key=&productname=51job&partner=8785419449a858b3314197b60d54d9c621afu7>a8c65a37a35c68c65afu7

  我们抓取的时候,肯定不会只抓取一页的信息。我们在APP上向下滑动页面,看看Fiddler会抓到什么数据包。看下图:

  

  滑下手机屏幕后,Fiddler又抓取了两个数据包,第二个数据包被选中,再次发现是APP上新刷新的招聘信息,然后复制这个数据包的url链接:

  pageno=2&pagesize=30&accountid=&key=&productname=51job&partner=8785419449a858b3314197b60d54d9c6&uuid=6b21f77c7af3aa83a5c636792ba087f3aa83a5c636792ba0887c6b3p6eb3&partner=8785419449a858b3314197

  接下来我们对比一下前后两个链接,分析异同。可以看出,除了属性“pageno”外,其他都一样。没错,它上面标有红色。第一个数据包链接的pageno值为1,第二个pageno值为2,翻页规则一目了然。

  既然找到了APP翻页的请求链接规则,我们就可以通过爬虫中的循环将pageno赋值给pageno,实现模拟翻页的功能。

  我们再次尝试更改搜索关键词,看看链接是否已更改。使用“java”作为关键词,捕获的数据包为:

  keyword=java&keywordtype=2&jobarea=000000&searchid=&著名类型=&pageno=1&pagesize=30&accountid=&key=&productname=51job&partner=8785419449a858b3314197b60d54d9c621afui754d9c621afui75a35c6b3fu7

  对比后发现只有链接中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=6b21f77c7af36aa2&uuid=6b21f77c7af36d9f78c7af36d9f78c7af36c8f78f78c7af36c8f78c7f36c8f78c7f2aaa3

  按照方法,点击一级页面列表中的第二个job,然后从Fiddler复制对应数据包的url链接:

  jobid=109381483&accountid=&key=&from=searchjoblist&jobtype=0100&productname=51job&partner=8785419449a858b3314197b60d54d9c6&uuid=6b21f77c7a52aaa3&uuid=6b21f77c7af36c8f78c7af36d9f78f78c7af3aa2f8c8f78f78f78c7af3aa2f9f78f78c7f3aa3

  对比以上两个链接,你有没有发现什么规律?没错,jobid不一样,其他都一样。这个jobid就是我们在一级页面的xml中找到的jobid。由此,我们可以从一级页面中抓取jobid来构造二级页面的url链接,然后采集出我们需要的所有信息。整个爬虫逻辑清晰:

  构建一级页面的初始url->采集jobid->构建二级页面的url->捕获作业信息->通过循环模拟翻页获取下一页的url。

  好了,分析工作完成,启动脚本爬虫。

  3 编写爬虫

  本文是使用无忧手机APP网络爬虫的Scrapy框架编写的。下载scrapy第三方包后,通过命令行创建爬虫项目:

   scrapy startproject job_spider .

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

  创建项目后,继续创建爬虫,专门用于爬取发布的招聘信息。创建一个如下命名的爬虫:

    scrapy genspider qcwySpider appapi.51job.com

  注意:如果没有添加“.”创建爬虫项目时的项目名称后,请在运行命令创建爬虫之前进入项目文件夹。

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

  

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

  # Obey robots.txt rules

ROBOTSTXT_OBEY = False

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

  # -*- coding: utf-8 -*-

import scrapy

class QcwyspiderSpider(scrapy.Spider):

name = 'qcwySpider'

allowed_domains = ['appapi.51job.com']

start_urls = ['http://appapi.51job.com/']

def parse(self, response):

pass

  这是scrapy为我们构建的框架。我们只需要在此基础上改进我们的爬虫即可。

  首先需要给类添加一些属性,比如搜索关键词keyword、起始页、想爬取最大页数、还需要设置headers进行简单的反爬取。另外,starturl也需要重置为第一页的url。更改后的代码如下:

  name = 'qcwySpider'

keyword = 'python'

current_page = 1

max_page = 100

headers = {

'Accept': 'text / html, application / xhtml + xml, application / xml;',

'Accept-Language': 'zh-CN,zh;q=0.9',

'Connection': 'keep-alive',

'Host': 'appapi.51job.com',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',

}

allowed_domains = ['appapi.51job.com']

start_urls = ['https://appapi.51job.com/api/job/search_job_list.php?postchannel=0000&&keyword='+str(keyword)+

'&keywordtype=2&jobarea=000000&searchid=&famoustype=&pageno=1&pagesize=30&accountid=97932608&key=a8c33db43f42530fbda2f2dac7a6f48d5c1c853a&productname=51job&partner=8785419449a858b3314197b60d54d9c6&uuid=6b21f77c7af3aa83a5c636792ba087c2&version=845&guid=bbb37e8f266b9de9e2a9fbe3bb81c3d0']

  然后开始写parse方法爬取一级页面。在一级页面中,我们的主要逻辑是通过循环实现APP中的屏幕滑动更新。上面代码中我们使用current_page来标识当前页码,每次循环后,给current_page加1,然后构造一个新的url,通过回调解析方法抓取下一页。另外,我们还需要在parse方法中采集输出一级页面的jobid,构造二级页面,回调实现二级页面信息采集的parse_job方法。解析方法代码如下:

<p> def parse(self, response):

"""

通过循环的方式实现一级页面翻页,并采集jobid构造二级页面url

:param response:

:return:

"""

selector = Selector(response=response)

itmes = selector.xpath('//item')

for item in itmes:

jobid = item.xpath('./jobid/text()').extract_first()

url = 'https://appapi.51job.com/api/job/get_job_info.php?jobid='+jobid+'&accountid=&key=&from=searchjoblist&jobtype=0100&productname=51job&partner=8785419449a858b3314197b60d54d9c6&uuid=6b21f77c7af3aa83a5c636792ba087c2&version=845&guid=bbb37e8f266b9de9e2a9fbe3bb81c3d0'

yield scrapy.Request(url=url, headers=self.headers, dont_filter=False, callback=self.parse_job)

if self.current_page

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线