python公开课_SEOPython公开课:⽤python实现完美标题⾃
动⽣成
过去⼗五年来做过很多流量站,也为数万⽹站提供SEO服务,仔细回想,所有SEO⼯作⾥⾯,最重要但⼜效率低的⼯作,就是为页⾯编写TDK,特别是页⾯标题Title,是所有SEO⼯作⾥⾯最最重要的⼯作,如果这件⼯作没有做好,其他⼯作做的再好也是⽩搭,如果Title写好了,其他⼯作稍有不⾜也可以被弥补。
所以今天就把⼀直在使⽤的⽅法详细的为⼤家讲解,并附带上代码,我们拿“⽉亮虾饼怎么做”的SEO为例,主要思路如下:
TOP20的页⾯教我写Title
在百度搜索“⽉亮虾饼怎么做”。
记录所有页⾯的真实标题(不是百度缩减过的标题)。
将所有标题中的词汇全部记录,并计算词汇出现频次。
将⾼频词汇⽤⼈类语⾔串联起来成为句⼦,即对⼈类友好,⼜能够击中最多⾼频关键词。
以上步骤核⼼思想是:如果搜索词汇,某个⽹页在百度搜索结果排名表现好,那么他的标题⼀定是写的出⾊,⽽如果把所有这些页⾯标题精华全部汇总计算,得出最精华的句⼦,那么这个句⼦作为标题就是最完美的。
也就是说既然排名靠前的这些⽹页在百度表现好,就应该尽量的学习和参考他们的做法,将这些精华全部吸收,毕竟众⼈的智慧⼀定要⽐⼀个⼈的智慧要强很多,基于数据的结论⼀定⽐感性的猜测更有说服⼒。
但是每个关键词都要⼿动完成上表中四个步骤,显然是不现实的,我们要通过程序来尽量⾃动化,减少⼈的⼯作量,下⾯我将使⽤python 来实现⽤爬⾍分析标题⼯作的雏形代码,满⾜我们对标题⾃动⽣成的需求。
⾸先请先安装好python和pycharm,不懂的朋友可以参考这篇⽂章来安装python程序的运⾏环境和pycharm编辑器,安装完毕后,下⾯就开始我们的SEO完美标题python爬⾍之旅。
1、爬⾍,你好!
import requests
url = 'www.baidu/s?wd=⽉亮虾饼怎么做&rn=50'
response = (url)
print(response)
第⼀句,import requests,是导⼊requests包,这个包是⼀个简洁的python的http库,我们在编写爬⾍程序时,经常会⽤到它,具体可以参考这篇⽂章。
第⼆句,我们将需要访问的⽹址,赋值给⼀个变量url,⽅便后⾯使⽤,关于python变量的使⽤,具体可参考这篇⽂章。
第三句,我们⽤⽅法,获取url的返回,这⾥response并不是返回的html,⽽是⼀个响应对象,⾥⾯包含除了html外的其他很多http的响应信息,具体可以参考这篇⽂章。
第四局,打印response对象,如果我们运⾏,会看到下图所⽰返回结果,返回200代码标识访问成功。
另外⽐较熟悉的返回代码404,表⽰页⾯不存在,具体的http返回代码可以参考这篇⽂章。
我们将上⾯代码保存到1_1.py⽂件中(py是python程序的常⽤⽂件后缀),在编辑器中运⾏ing1_1.py ,结果如下:
我们看到红箭头所指,返回200状态码,表⽰访问正常
如上图,我们将代码稍加改造,把
print(response)
改为
t)
重新在编辑器中运⾏1_1.py,运⾏后返回结果就是html了,如图:
2、兼容各编码
通过上⽂代码,获取百度搜索结果页⾯html后,发现⾥⾯的中⽂全部是乱码
写过Html的朋友都知道,⽹页⽂件有各种编码,例如中⽂常⽤的gb2312字符集,例如针对Unicode的可变长度字符编码utf8,这两个是我们最常⽤的字符编码,如果希望了解字符集概念,请参考这篇⽂档。
当我们不清楚⽹页是什么编码时,往往通过Html中的meta charset来确认。
那该如何通过程序⾃动确定⽹页的真正编码呢?
我们可以使⽤ chardet 这个第三⽅库,这个库能够快速的检测当前⽹页⽂件使⽤的是什么编码,它的原理是通过⽂件的顺序字节来尝试确定当前⽂字的编码,感兴趣了解详情的朋友可以查看官⽹⽂档。
import chardet
通过上⽅代码引⼊ chardet 第三⽅库,然后我们对第⼀节中的代码稍作扩展:
import chardet
url = 'www.baidu/s?wd=⽉亮虾饼怎么做&rn=50'
response = (url)
htmlEncoded = t
detectResult = chardet.detect(htmlEncoded)
encoding = detectResult['encoding']
print('页⾯编码:', encoding)
html = str(htmlEncoded, encoding)
print('页⾯Html:', html)
5118
我们在代码中加⼊了红框所框选的代码
保存⽂件到1_2.py,在编辑器中运⾏后,返回结果如下:
上图红线圈选的,正是我们⽤print语句打印的两个结果:⼀⾏是chardet探测出的页⾯编码,另⼀⾏是⽤这个编码读取的⽹页内容
现在页⾯上内容全部显⽰为中⽂了,如图:
3、获取搜索结果着陆页信息、
过第1、2步,获取百度搜索结果页html后,我们希望通过html获取页⾯中的排名结果着陆页的准确标题,因为Title过长时,百度将会截取掉Title后过长的部分,变成省略号,为了获取准确的标题,需要获得着陆页的真实url,从⽽读取这个url来获取页⾯的Title,下⾯我们再对代码进⾏改造:
import requests
import chardet
from bs4 import BeautifulSoup
url = 'www.baidu/s?wd=⽉亮虾饼怎么做&rn=50'
response = (url)
htmlEncoded = t
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
为了能够更快的分析页⾯html上的dom结构,我们引⼊BeautifulSoup 这个第三⽅库,你可以通过
pip install beautifulsoup4
安装这个第三⽅库,因为这些库不是官⽅⾃带的,所以需要使⽤pip install命令来安装到本地,如果你使⽤的pycharm编辑器,可以通过这篇⽂章来安装第三⽅库。
下⾯我们来详细讲解新增代码的具体⽤途
soup = BeautifulSoup(html, 'html.parser')
这⾏代码是表⽰通过BeautifulSoup来解析html变量中Html代码,使⽤html.parser解析器,因为BeautifulSoup还有其他⼏种解析器,如xml、html5lib等,所以这⾥必须确定使⽤什么解析器,具体参考官⽅⽂档。
python怎么读取py文件
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
上⽅的这三⾏代码是我们循环提取所有符合选择器的a标签节点,打印出a标签的href属性值,也就是a标签对应的锚链接,如下图。
这个链接是百度已经加密过的链接,在后⾯的代码中我们将会⽤到。
我们将整个代码保存到1_3.py中,在pycharm编辑器中运⾏这段代码,结果如下:
上⾯打印了⼀堆url,也就是下图的⽹址,是百度搜索页上所有百度加密过的着陆页,就这么简单。
4、解密百度着陆页url
通过上⾯3个步骤,获取了着陆页的具体url,现在需要解密着陆页的url,下⾯我们来改造第3节的代码达到这个⽬的。
import requests
import chardet
from bs4 import BeautifulSoup
url = 'www.baidu/s?wd=⽉亮虾饼怎么做&rn=50'
response = (url)
htmlEncoded = t
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 '' in resultRedirectUrl or '' in resultRedirectUrl:
itemHeadRes=requests.head(resultRedirectUrl, verify=False)
itemUrl = itemHeadRes.headers['Location']
print('搜索结果真实⽹址:', itemUrl)
5118
通过增加红⾊这段代码,我们把百度搜索结果中的所有机密过的⽹址,通过Http Head命令解密成了真实的url,具体每段代码的作⽤如下:
if '' in resultRedirectUrl or \
'' in resultRedirectUrl:
这段代码是确保url是⼀个正常的url,因为我们在上节中发现从百度的搜索结果html中使⽤’h3 a’这个选择器提取a标签节点,可能会提取到百度视频推荐的⼀个结果
也就是下图这个链接
itemHeadRes=requests.head(resultRedirectUrl,verify=False)
itemUrl = itemHeadRes.headers['Location']
print('搜索结果真实⽹址:', itemUrl)
5118
上⽅代码是使⽤http协议中的head命令来访问百度加密连接,head命令⽐get命令返回信息更加精简,只会返回http头信息,这样我们就不⽤读取⼀⼤段html就能得到解密后的url,关于http头信息的内容请参考这篇⽂章。
通过headers的Location属性,便能得到解密后的url,我们把这个解密后的url⽹址存储到itemUrl变量
中,以便后续读取页⾯Title使⽤。
我们将整段代码保存到1_4.py,在编辑器中运⾏后,效果如下:
这样每个着陆页解密后的⽹址就提取出来了,so easy。
5、获取所有着陆页标题
上⼀节我们得到了着陆页的所有解密后的⽹址url,现在要做的就是批量读取这些⽹址,获得它们的标题,代码改造如图:
上图红⾊框部分代码如下:
itemRes = (itemUrl, verify=False)
if itemRes.status_code == 200:
itemHtmlEncoding=chardet.t)['encoding']
itemHtml=t,itemHtmlEncoding,errors='ignore')
itemSoup=BeautifulSoup(itemHtml,'html.parser')
if itemSoup.title is not None:
itemTitle = strip()
print('着陆页Title:', itemTitle)
5118
我们同样使⽤request库,调⽤和第⼀节⼀样的http get命令来读取每个着陆页的html代码,这⾥也使⽤了chardet来探测⽹页编码,因为我们不能确定每个着陆页⽤的具体什么编码,如果忘记了⽹页编码的内容,请回看本⽂的第⼆节。
读取每个着陆页的html后,将html存⼊itemHtml的变量中,然后通过下⾯代码提取出html中的title
itemSoup=BeautifulSoup(itemHtml,'html.parser')
if itemSoup.title is not None:
itemTitle = strip()
print('着陆页Title:', itemTitle)
5118

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。