干货内容:分享百度SEO算法经常更新的困恼
优采云 发布时间: 2022-12-17 23:11干货内容:分享百度SEO算法经常更新的困恼
很多做优化的朋友都苦恼百度快照更新带来的残酷脱毛。解决百度算法更新的顾问:百度算法更新是我们每个优化师最头疼的事情。更新后无数的网站k、power、ranking都登录了,所以很多优化师都跟着百度算法。在这里,我来谈谈百度SEO算法经常更新的烦恼。
其实百度的更新方式离不开自己的侧重点,就是:
第一,让更多的用户使用百度。谷歌退出中国后,百度基本占领了整个互联网。那时候百度很少更新算法,根本没有规则,也没有所谓的用户体验。在360出现和介入之前,它占据了20%的用户。之后百度不断更新算法,很多网站没有k,power,ranking。此外,他还改进了许多材料 网站 以提高 SEO 排名和权重。这是用户为了方便而想要的东西。如果用户在百度上找不到自己需要的东西,就去其他搜索引擎,百度就会失去用户,所以百度会对数据网站进行加权。也就是说,这是为了方便用户查找,让更多的用户使用百度。
第二,基于UX更新的人知道UX,但他们真的有UX吗?
其实,要想体验用户,就必须站在用户的立场上去思考,解决用户的问题。需要用百度工具查看数据和统计,用户每天搜索什么,需要什么,问什么,做统计,针对用户的需求做一个起点。比如:你知道吗,如果你装修网站,80%以上的用户都会搜索最新的室内设计图,那么用户就会从室内设计图入手,每天更新一些装饰效果图来满足需求用户。这是用户体验。如果你的网站能解决用户的问题,帮助百度解决用户的体验问题,百度不会给自己的网站权力。
第三,从方便和最新的价值出发,大家都能理解方便和最新的原则,但是你遇到过这样的情况吗?
当然,百度是从大众集团开始的,不是优化我们网站。那我们就得自己去挖,挖一些最新的、有价值的、方便的。它适用于用户。如果你的网站上有这些东西,百度是不可能下载你的网站的。
你以这个点为中心开始。如果有这样的条件,无论百度怎么更新SEO算法,都不会k你的网站。
干货教程:Python丨scrapy爬取某招聘网手机APP发布信息
欢迎点击右上角关注小编。除了分享技术文章,还有很多好处。私信领取学习资料,包括不限于Python实战练习、PDF电子文档、面试花絮、学习资料等。
介绍
一段时间后,我将开始寻找新工作。让我们抓取一些职位信息并进行分析。目前主流的招聘网站有51job、智联、BOSS直招、拉勾等。好久没爬手机APP了。这次我会写一个爬虫来爬取51job手机APP的职位信息。其他招聘网站稍后更新...
使用的工具(技术):
APP抓包分析
先来体验一下51job的APP吧。当我们在首页输入搜索关键词,点击搜索,APP会跳转到一个新的页面。我们称这个页面为一级页面。第一级页面显示了我们希望看到的所有职位的列表。
当我们点击其中一个职位信息时,APP会跳转到一个新的页面。我称这个页面为次要页面。二级页面有我们需要的所有工作信息,是我们的主要采集当前页面。
分析完页面,接下来就是分析51job手机APP的请求(request)和回复(response)。本文使用的抓包工具是Fiddler。
本文的目的是抓取在51job APP上搜索关键词返回的所有招聘信息。本文以“Python”为例进行说明。APP上的操作如下图所示。输入“Python”关键词后,点击Search,Fiddler抓取到4个数据包,如下图:
其实看到数据包2和4的图标大家应该都笑了。这两个图标分别代表json和xml格式的数据,很多web界面传输的都是这两种格式的数据,手机app也不例外。选择第二个数据包,然后在右侧主窗口查看,发现第二个数据包中不收录我们想要的数据。看了第四个数据包,在右侧窗口选中后,可以看到如下:
右下角的内容不就是你在手机上看到的招聘信息吗,而且还是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=bbb30dbe8f3626b9f9de
下面我们来对比一下前后两个链接,分析一下异同点。可以看出,除了“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。
好了,分析工作完成,开始手写爬虫了。
写一个爬虫
本文使用Scrapy框架为51job手机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为我们搭建的框架,我们只需要在此基础上完善我们的爬虫即可。
首先我们需要在类中添加一些属性,比如搜索关键词关键字,起始页,想要爬取最大页数,还需要设置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类,输入如下代码:
上面的每一项都对应一个xml标签,用来存储一条信息。在qcwyJobsItem类的最后,定义了一个do_insert方法,用于生成一条insert语句,将item中的所有信息存储到数据库中。之所以在items块中生成这个insert语句,是因为如果以后有多个爬虫, 有了多个item类之后,在pipelines模块中,可以将不同的item插入到数据库中,使得这个项目的扩展性更强。您还可以在管道中编写与插入数据库相关的所有代码。
然后编写parse_job方法:
完成以上代码后,信息采集部分就完成了。接下来继续编写信息存储函数,在pipelines.py中完成。
写好pipelines.py后,打开settings.py文件,在项目设置文件中配置刚刚写入的MysqlTwistedPipline类:
顺便配置一下数据库:
也可以把数据库配置嵌入到MysqlTwistedPipline类中,不过我习惯把这些独占的数据库信息写在配置文件里。
最后只剩下一步了,建数据库,建数据表。部分表结构如下图所示:
完成上述所有操作后,就可以运行爬虫来启动 采集 数据了。采集 的数据如下所示:
总结
整个过程下来,感觉51job的app爬取比网页爬取更容易(好像很多网站都是这样)。回顾整个过程,代码中还有很多细节可以改进,比如可以在构建链接的时候加入求职地点。本篇博文着重对整个爬取过程进行逻辑分析,介绍APP的基本爬取方法。博文中省略了一些代码。如果你需要完整的代码,请从我的github上获取。其他招聘会在以后继续更新网站爬虫。