SEO Python公开课
因为近期官网上线了良多新功用,比来一段时间我介绍5118自家产物确实有点多,有些伴侣建议,除了介绍自家的产物,也希望我多供给一些干货,供各人进修。
做为实战派,崇尚极客精神,于是有了那篇文章,边撸代码边讲课。
若是你觉得有用,请必然点赞,让我更有动力来造做一系列SEO编程高级公开课。
过去十五年来做过良多流量站,也为数万网站供给SEO办事,认真回想,所有SEO工做里面,最重要但又效率低的工做,就是为页面编写TDK,出格是页面题目Title,是所有SEO工做里面最最重要的工做,若是那件工做没有做好,其他工做做的再好也是白费,若是Title写好了,其他工做稍有不敷也能够被填补。
所以今天就把不断在利用的办法详细的为各人讲解,并附带上代码,我们拿“月亮虾饼怎么做”的SEO为例,次要思绪如下:
TOP20的页面教我写Title
记录所有页面的实在题目(不是百度缩减过的题目)。
将所有题目中的词汇全数记录,并计算词汇呈现频次。
将高频词汇用人类语言串联起来成为句子,即对人类友好,又可以击中最多高频关键词。
以上步调核心思惟是:若是搜刮词汇,某个网页在百度搜刮成果排名表示好,那么他的题目必然是写的超卓,而若是把所有那些页面题目精华全数汇总计算,得出最精华的句子,那么那个句子做为题目就是最完美的。
也就是说既然排名靠前的那些网页在百度表示好,就应该尽量的进修和参考他们的做法,将那些精华全数吸收,究竟结果世人的聪慧必然要比一小我的聪慧要强良多,基于数据的结论必然比感性的推测更有说服力。
但是每个关键词都要手动完成上表中四个步调,显然是不现实的,我们要通过法式来尽量主动化,削减人的工做量,下面我将利用python来实现用爬虫阐发题目工做的雏形代码,满足我们对题目主动生成的需求。
起首请先安拆好python和pycharm,来安拆python法式的运行情况和pycharm编纂器,安拆完毕后,下面就起头我们的SEO完美题目python爬虫之旅。
1爬虫,你好!import requests
url = ?wd=月亮虾饼怎么做&rn=50
response = requests.get(url)
print(response)
第一句,import requests,是导入requests包,那个包是一个简洁的python的http库,我们在编写爬虫法式时,经常会用到它。
第二句,我们将需要拜候的网址,赋值给一个变量url,便利后面利用,关于python变量的利用。
第三句,我们用requests.get办法,获取url的返回,那里response并非返回的html,而是一个响应对象,里面包罗除了html外的其他良多http的响应信息。
第四局,打印response对象,若是我们运行,会看到下图所示返回成果,返回200代码标识拜候胜利。
别的比力熟悉的返回代码404,暗示页面不存在。
我们将上面代码保留到1_1.py文件中(py是python法式的常用文件后缀),在编纂器中运行ing1_1.py ,成果如下:
我们看到红箭头所指,返回200形态码,暗示拜候一般
如上图,我们将代码稍加革新,把
print(response)
改为
print(response.content)
从头在编纂器中运行1_1.py,运行后返回成果就是html了,如图:
完好代码:
2兼容各编码通过上文代码,获取百度搜刮成果页面html后,发现里面的中文全数是乱码
写过Html的伴侣都晓得,网页文件有各类编码,例如中文常用的gb2312字符集,例如针对Unicode的可变长度字符编码utf8,那两个是我们最常用的字符编码。
当我们不清晰网页是什么编码时,往往通过Html中的meta charset来确认。
那该若何通过法式主动确定网页的实正编码呢?
我们能够利用 chardet 那个第三方库,那个库可以快速的检测当前网页文件利用的是什么编码,它的原理是通过文件的挨次字节来测验考试确定当前文字的编码。
import chardet
通过上方代码引入 chardet 第三方库,然后我们对第一节中的代码稍做扩展:
import chardet
url = ?wd=月亮虾饼怎么做&rn=50
response = requests.get(url)
htmlEncoded = response.content
detectResult = chardet.detect(htmlEncoded)
encoding = detectResult[encoding]
print(页面编码:, encoding)
html = str(htmlEncoded, encoding)
print(页面Html:, html)
5118.com
我们在代码中参加了红框所框选的代码
保留文件到1_2.py,在编纂器中运行后,返回成果如下:
上图红线圈选的,恰是我们用print语句打印的两个成果
一行是chardet探测出的页面编码
另一行是用那个编码读取的网页内容
如今页面上内容全数显示为中文了,如图:
完好代码:
3获取搜刮成果着陆页信息通过第1、2步,获取百度搜刮成果页html后,我们希望通过html获取页面中的排名成果着陆页的准确题目,因为Title过长时,百度将会截取掉Title后过长的部门,酿成省略号,为了获取准确的题目,需要获得着陆页的实在url,从而读取那个url来获取页面的Title,下面我们再对代码停止革新:
import requests
import chardet
from bs4 import BeautifulSoup
url = ?wd=月亮虾饼怎么做&rn=50
response = requests.get(url)
htmlEncoded = response.content
detectResult = chardet.detect(htmlEncoded)
encoding = detectResult[encoding]
html = str(htmlEncoded, encoding)
soup = BeautifulSoup(html, html.parser)
items = soup.select(h3 a)
for item in items:
resultRedirectUrl = item.attrs[href]
print(resultRedirectUrl)
5118.com
为了可以更快的阐发页面html上的dom构造,我们引入
BeautifulSoup
那个第三方库,你能够通过
pip install beautifulsoup4
安拆那个第三方库,因为那些库不是官方自带的,所以需要利用pip install号令来安拆到当地,若是你利用的pycharm编纂器来安拆第三方库。
下面我们来详细讲解新增代码的详细用处
soup = BeautifulSoup(html, html.parser)
那行代码是暗示通过BeautifulSoup来解析html变量中Html代码,利用html.parser解析器,因为BeautifulSoup还有其他几种解析器,如xml、html5lib等,所以那里必需确定利用什么解析器。
items = soup.select(h3 a)
那句话是通过css选择器来从html的dom树中获取到对应的节点,例如我们那里是要获取html中所有h3标签下的a标签dom节点元素,所以我们利用了 h3 a 那个选择器,若是我们在chrome阅读器中点击F12来查看每个着陆页对应的元素,我们就晓得为什么要利用那个选择器。
我们也能够在chrome阅读器的F12中的控造台中运行js代码 document.querySelectorAll(h3 a) 来查看利用的选择器能否准确
例如上图在百度显示前10个成果的搜刮页上利用选择器h3 a,就会显示发现了10个a标签节点。
for item in items:
resultRedirectUrl = item.attrs[href]
print(resultRedirectUrl)5118.com
上方的那三行代码是我们轮回提取所有契合选择器的a标签节点,打印出a标签的href属性值,也就是a标签对应的锚链接,如下图。
那个链接是百度已经加密过的链接,在后面的代码中我们将会用到。
我们将整个代码保留到1_3.py中,在pycharm编纂器中运行那段代码,成果如下:
上面打印了一堆url,也就是下图的网址,是百度搜刮页上所有百度加密过的着陆页,就那么简单。
完好代码:
4解密百度着陆页url通过上面3个步调,获取了着陆页的详细url,如今需要解密着陆页的url,下面我们来革新第3节的代码到达那个目标。
import requests
import chardet
from bs4 import BeautifulSoup
url = ?wd=月亮虾饼怎么做&rn=50
response = requests.get(url)
htmlEncoded = response.content
detectResult = chardet.detect(htmlEncoded)
encoding = detectResult[encoding]
html = str(htmlEncoded, encoding)
soup = BeautifulSoup(html, html.parser)
items = soup.select(h3 a)
for item in items:
resultRedirectUrl = item.attrs[href]
if http:// in resultRedirectUrl or https:// in resultRedirectUrl:
itemHeadRes=requests.head(resultRedirectUrl, verify=False)
itemUrl = itemHeadRes.headers[Location]
print(搜刮成果实在网址:, itemUrl)
5118.com
通过增加红色那段代码,我们把百度搜刮成果中的所有秘密过的网址,通过Http Head号令解密成了实在的url,详细每段代码的感化如下:
if http:// in resultRedirectUrl or \
https:// in resultRedirectUrl:
那段代码是确保url是一个一般的url,因为我们在上节中发现从百度的搜刮成果html中利用h3 a那个选择器提取a标签节点,可能会提取到百度视频保举的一个成果
也就是下图那个链接
那个url是个百度视频搜刮的相对链接,所以我们那里加上了判断,必需在url中包容http:// 或者 https://
itemHeadRes=requests.head(resultRedirectUrl,verify=False)
itemUrl = itemHeadRes.headers[Location]
print(搜刮成果实在网址:, itemUrl)
5118.com
上方代码是利用http协议中的head号令来拜候百度加密毗连,head号令比get号令返回信息愈加精简,只会返回http头信息,如许我们就不消读取一大段html就能得到解密后的url。
通过headers的Location属性,便能得到解密后的url,我们把那个解密后的url网址存储到itemUrl变量中,以便后续读取页面Title利用。
我们将整段代码保留到1_4.py,在编纂器中运行后,效果如下:
如许每个着陆页解密后的网址就提取出来了,so easy。
完好代码:
5获取所有着陆页题目上一节我们得到了着陆页的所有解密后的网址url,如今要做的就是批量读取那些网址,获得它们的题目,代码革新如图:
上图红色框部门代码如下:
itemRes = requests.get(itemUrl, verify=False)
if itemRes.status_code == 200:
itemHtmlEncoding=chardet.detect(itemRes.content)[encoding]
itemHtml=str(itemRes.content,itemHtmlEncoding,errors=ignore)
itemSoup=BeautifulSoup(itemHtml,html.parser)
if itemSoup.title is not None:
itemTitle = itemSoup.title.text.strip()
print(着陆页Title:, itemTitle)
5118.com
我们同样利用request库,挪用和第一节一样的http get号令来读取每个着陆页的html代码,那里也利用了chardet来探测网页编码,因为我们不克不及确定每个着陆页用的详细什么编码,若是忘记了网页编码的内容,请回看本文的第二节。
读取每个着陆页的html后,将html存入itemHtml的变量中,然后通过下面代码提取出html中的title
itemSoup=BeautifulSoup(itemHtml,html.parser)
if itemSoup.title is not None:
itemTitle = itemSoup.title.text.strip()
print(着陆页Title:, itemTitle)
5118.com
那里看到又再次利用了第三节中提到的
BeautifulSoup
第三方库来解析html,间接通过title属性来获得html中的title,因为有些html可能没有title,所以我们那里利用了一个判断,若是title is not None,暗示若是title题目不为空那么就提取title,strip 函数是用来把题目字符串两头的空白去掉,因为我们晓得良多时候title标识表记标帜里可能会有多余的空格。
将上面的代码保留为1_5.py,在编纂器中运行,成果如下:
如许百度搜刮成果所有的着陆页题目就得到了,离胜利越来越近。
完好代码:
6获取所有题目中的词汇上一节我们得到了所有题目,那么接下来就要阐发出所有题目到底都包罗哪些词汇。
革新代码如下:
导入了一个第三方分词库jieba
import jieba
那个库能够把我们得到的title题目分词成词汇。
我们看到下面那段代码,那里我们引入了5118本身的一个大型用户词典,收录中文中大部门的词汇,若是你有本身的用户词典,也能够加载本身的用户词典,其实jieba那个库自带了系统词典,只不外可能没有5118的齐备,分词的效果很大水平上和词典的量量有很大关系。
rootPath = os.path.dirname(os.path.realpath(__file__))
userDictPath = os.path.join(rootPath, jiebadic.csv)jieba.load_userdict(userDictPath)
jieba.initialize()5118.com
前面两行代码组拆出当前py文件所在目次下jiebadic.csv用户词典文件的完好途径,然后通过jieba的load_userdict办法加载那个文件,最末通过initialize那个函数停止初始化。
接下来我们看到下图中的三段代码:
那三段代码目标是将所有题目累加在一路,放入allTitleStr变量,便于最初那段代码通过jieba分词库停止分词
titleWords = [word for word in jieba.lcut(allTitleStr, cut_all=False) if len(word) > 1]
那段代码的意思是通过jieba的lcut办法分词成一个列表,而且只保留长度大于1的词汇,jieba第三方库的详细利用办法。
将代码保留为1_6.py,在编纂器中运行成果如下:
在最初一行成果中我们已经看到分词后的所有词汇,离胜利只差一步。
完好代码:
7得出题目高频词汇通过1-6节已经得到了题目中的所有词汇,但是晓得哪些词汇是所有着陆页题目中利用最多的词汇才是我们最末目标。
接下来通过Counter那个第三方库,快速对词汇列表停止词频统计,同样通过python的import引入Counter对象
from collections import Counter
通过python对字典停止倒序摆列,以找到更高频的那些词汇,我们在第6节的代码底部参加下方代码。
titleWordsDic = dict(Counter(titleWords))
titleWordsSortedList = sorted(titleWordsDic.items(), key=lambda x: x[1], reverse=True)
for item in titleWordsSortedList:
print(item[0], :, item[1])
5118.com
下面逐行申明上方代码:
titleWordsDic = dict(Counter(titleWords))
那一句是通过Counter第三库对象,计算所有词汇列表中每个词汇的频次,而且转换成一个字典。
titleWordsSortedList = sorted(titleWordsDic.items(), key=lambda x: x[1], reverse=True)
那一句是通过python的排序办法,根据词汇频次倒序,以优先查看频次更高的词汇。
for item in titleWordsSortedList:
print(item[0], :, item[1])
那一句是轮回整个倒序后的词频列表,而且打印出词汇和词汇呈现的频次。
把以上四段代码贴到第6节的代码下,保留为1_7.py后,在编纂器中运行,成果如下:
那里暗示所有着陆页题目中,"月亮"呈现了80次,"虾饼"呈现了32次,"家常做法"呈现了14次,下面我们就起头操纵那个数据。
完好代码:
8最末构成页面题目Title通过以上7个末节构成的代码,获得百度搜刮成果Top50所有网页题目高频词后,我们能够用SEO原始办法操纵各类分隔符来停止拼接,例如:
月亮虾饼的做法_月亮虾饼怎么做_月亮虾饼家常做法
月亮虾饼的做法,台湾月亮虾饼图解步调,月亮虾饼菜谱
不外根据多年SEO经历,更好是通过人类语言将那些词用通畅的话语组织成一句话,如许对用户愈加友好,可以在搜刮成果中脱颖而出,更容易被点击,也更契合百度的着陆页标准,例如:
月亮虾饼好吃吗?教你家常做法食谱,台湾怎么做
用题目击中最多的流量高频关键词,而且还要让用户读题目后,还可以感兴趣点击,比起分隔符拼接,那才是SEO题目的高级技巧。
9给他们秀一波操做完好代码:
运行上面的代码,伶俐的你能够想想那段代码稍加修改后,还能用来做什么?
监控海量百度PC端关键词排名收罗某个关键词的所有文章(需要注释提取)获取百度搜刮成果着陆页所有解密的url获取所有着陆页的Meta description获取所有着陆页的外链本文代码其实已经是一个小型爬虫的雏形,你能够用那段代码做为原形,完成良多你以前可能无法完成的批量化数据工做。在你的上司和同事面前秀一波数据,或许会让他们另眼相看,让你的优良射瞎他们的双眼。
请鼓舞我
若是我的教程对你有帮忙,想要获得更多教程,我会持续为分享SEO编程的进阶教程,它或许能为你翻开职业生活生计的另一扇门。
2019年会员须知:6月第二周更新列表一 强化智能原创功用
https://wyc.5118.com/
01替代词主动替代所有词
当整段内容里,替代词的时候,其他同样词会同一替代,让用户更高效的停止智能原创。
https://tool.5118.com/
01右侧展开按钮可上下拖动
制止用户阅读网页时形成障碍。
02 权重读取显示载入形态
以便用户查看权重数据时,领会是数据正在读取中的形态。
03 无法加载网站显示“无法翻开”
30秒内仍加载不到的网站,显示“无法翻开”且无法点击。节省用户没必要要的拜候操做时间。
三 其他
www.5118.com
01功用视频教程显示
在5118相关功用里,添加对应功用视频教程入口,帮忙用户更好的领会功用利用。
02主动回复改良
进步用户体验,让5118更智能化按照用户输入的信息,快速解答用户问题。
03竞价合作剧烈度更大值调整
把以往的合作剧烈度更大值100调整为更大值40,让参考数据更精准。
四 新增页
https://www.5118.com/act/monitor
01SEO办事商排名监控页
SEO排名监控页是5118为SEO办事商供给的一整套监控大数据办事,可以帮忙企业监控所有搜刮引擎的排名情况,且供给一套可在用户当地化摆设的爬虫系统报表。

评论列表