SEO Python公开课
由于近期官网上线了很多新功能,最近一段韶光我先容5118自家产品确实有点多,有些朋友建议,除了先容自家的产品,也希望我多供应一些干货,供大家学习。
做为实战派,崇尚极客精神,于是有了这篇文章,边撸代码边讲课。

如果你以为有用,请一定点赞,让我更有动力来制作一系列SEO编程高等公开课。
过去十五年来做过很多流量站,也为数万网站供应SEO做事,仔细回忆,所有SEO事情里面,最主要但又效率低的事情,便是为页面编写TDK,特殊是页面标题Title,是所有SEO事情里面最最主要的事情,如果这件事情没有做好,其他事情做的再好也是白搭,如果Title写好了,其他事情稍有不敷也可以被填补。
以是本日就把一贯在利用的方法详细的为大家讲解,并附带上代码,我们拿“玉轮虾饼怎么做”的SEO为例,紧张思路如下:
TOP20的页面教我写Title
在百度搜索“玉轮虾饼怎么做”。
记录所有页面的真实标题(不是百度缩减过的标题)。
将所有标题中的词汇全部记录,并打算词汇涌现频次。
将高频词汇用人类措辞串联起来成为句子,即对人类友好,又能够击中最多高频关键词。
以上步骤核心思想是:如果搜索词汇,某个网页在百度搜索结果排名表现好,那么他的标题一定是写的出色,而如果把所有这些页面标题精华全部汇总打算,得出最精华的句子,那么这个句子作为标题便是最完美的。
也便是说既然排名靠前的这些网页在百度表现好,就该当只管即便的学习和参考他们的做法,将这些精华全部接管,毕竟众人的聪慧一定要比一个人的聪慧要强很多,基于数据的结论一定比感性的预测更有说服力。
但是每个关键词都要手动完成上表中四个步骤,显然是不现实的,我们要通过程序来只管即便自动化,减少人的事情量,下面我将利用python来实现用爬虫剖析标题事情的雏形代码,知足我们对标题自动天生的需求。
首先请先安装好python和pycharm,来安装python程序的运行环境和pycharm编辑器,安装完毕后,下面就开始我们的SEO完美标题python爬虫之旅。
1爬虫,你好!import requests
url = 'http://www.baidu.com/s?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了,如图:
完全代码:
https://shimo.im/docs/r05eM6l20iQSYDpw/
2兼容各编码通过上文代码,获取百度搜索结果页面html后,创造里面的中文全部是乱码
写过Html的朋友都知道,网页文件有各种编码,例如中文常用的gb2312字符集,例如针对Unicode的可变长度字符编码utf8,这两个是我们最常用的字符编码。
当我们不清楚网页是什么编码时,每每通过Html中的meta charset来确认。
那该如何通过程序自动确定网页的真正编码呢?
我们可以利用 chardet 这个第三方库,这个库能够快速的检测当前网页文件利用的是什么编码,它的事理是通过文件的顺序字节来考试测验确定当前笔墨的编码。
import chardet
通过上方代码引入 chardet 第三方库,然后我们对第一节中的代码稍作扩展:
import chardet
url = 'http://www.baidu.com/s?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探测出的页面编码
另一行是用这个编码读取的网页内容
现在页面上内容全部显示为中文了,如图:
完全代码:
https://shimo.im/docs/r05eM6l20iQSYDpw/
3获取搜索结果着陆页信息通过第1、2步,获取百度搜索结果页html后,我们希望通过html获取页面中的排名结果着陆页的准确标题,由于Title过永劫,百度将会截取掉Title后过长的部分,变成省略号,为了获取准确的标题,须要得到着陆页的真实url,从而读取这个url来获取页面的Title,下面我们再对代码进行改造:
import requests
import chardet
from bs4 import BeautifulSoup
url = 'http://www.baidu.com/s?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,也便是下图的网址,是百度搜索页上所有百度加密过的着陆页,就这么大略。
完全代码:
https://shimo.im/docs/r05eM6l20iQSYDpw/
4解密百度着陆页url通过上面3个步骤,获取了着陆页的详细url,现在须要解密着陆页的url,下面我们来改造第3节的代码达到这个目的。
import requests
import chardet
from bs4 import BeautifulSoup
url = 'http://www.baidu.com/s?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。
完全代码:
https://shimo.im/docs/r05eM6l20iQSYDpw/
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,在编辑器中运行,结果如下:
这样百度搜索结果所有的着陆页标题就得到了,离成功越来越近。
完全代码:
https://shimo.im/docs/r05eM6l20iQSYDpw/
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,在编辑器中运行结果如下:
在末了一行结果中我们已经看到分词后的所有词汇,离成功只差一步。
完全代码:
https://shimo.im/docs/r05eM6l20iQSYDpw/
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次,下面我们就开始利用这个数据。
完全代码:
https://shimo.im/docs/r05eM6l20iQSYDpw/
8终极组成页面标题Title通过以上7个小节形成的代码,得到百度搜索结果Top50所有网页标题高频词后,我们可以用SEO原始方法利用各种分隔符来进行拼接,例如:
玉轮虾饼的做法_玉轮虾饼怎么做_玉轮虾饼家常做法
玉轮虾饼的做法,***玉轮虾饼图解步骤,玉轮虾饼菜谱
不过按照多年SEO履历,最好是通过人类措辞将这些词用畅通的话语组织成一句话,这样对用户更加友好,能够在搜索结果中脱颖而出,更随意马虎被点击,也更符合百度的着陆页规范,例如:
玉轮虾饼好吃吗?教你家常做法食谱,***怎么做
用标题击中最多的流量高频关键词,并且还要让用户读标题后,还能够感兴趣点击,比起分隔符拼接,这才是SEO标题的高等技巧。
9给他们秀一波操作完全代码:
https://shimo.im/docs/r05eM6l20iQSYDpw/
运行上面的代码,聪明的你可以想想这段代码稍加修正后,还能用来做什么?
监控海量百度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做事商供应的一整套监控大数据做事,能够帮助企业监控所有搜索引擎的排名情形,且供应一套可在用户本地化支配的爬虫系统报表。