专栏首页二爷记Python关键词数据采集案例,5118查询网站关键词数据采集

Python关键词数据采集案例,5118查询网站关键词数据采集

对于seoer而言,关注网站的关键词数据是非常重要的,关键词排名情况,流量来源,以及同行的网站数据,那么借助于seo查询工具也是非常有必要的,比较知名的就有爱站站长工具,站长工具以及5118。

当然现今比较全,以及用得比较广泛的就是5118!

从数据而言,以及功能上来看,5118是非常强大的!

有条件的话还是付费吧!

5118的反爬做的还是非常不错的!

需要登录才能采集,发现5118更新过一次!

比如登录账号需要经过滑块验证码的反爬限制,关键词指数等方面的数据都是图片加密的形式来展现,本渣渣头秃也是破解不来,怕了怕了。。

不过,有些数据还是可以拿来参考的!so,python搞起来!

我们来查询一个设计网站,设计癖的关键词情况

爬取网址:

https://www.5118.com/seo/baidupc/www.shejipi.com

不是付费会员的话,只能查看前一百页数据!

不少数据都是反爬限制,比较可惜!

虽然5118会员登录存在滑块验证码的情况,但是cookies登录还是非常好用的!

我们通过手动添加cookies来登录采集想要的数据。

几个关键点:

1.添加协议头:

headers={
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Content-Length': '0',
        'Cookie': Cookies,
        'Host': 'www.5118.com',
        'Origin': 'https://www.5118.com',
        'Referer': 'https://www.5118.com/',
        'User-Agent': ua,
        'X-Requested-With': 'XMLHttpRequest',
    }

自行添加ua和cooikes!

当然这是一个完整的协议头,有些可以删除的,可自行尝试!

2.zip函数的使用以及格式化数据处理,前面也分享过!

for keyword,rank,title,link,index_link in zip(keywords,ranks,titles,links,index_links):
    data=[
        keyword,
        rank.xpath('string(.)').strip().replace(' ','').replace('\r\n','-'),
        self.get_change(rank),
        title,
        unquote(link.split('target=')[-1]),
        'https:{}'.format(index_link),
    ]
    print(data)

3.排名波动的情况处理

通过源码查询可知,green为排名上升,red为排名下降,这里写了判断来获取!

#判断排名是否提升
def get_change(self,rank):
    rank=etree.tostring(rank).decode('utf-8')
    if "red" in str(rank):
        change="下降"
    elif "green" in str(rank):
        change = "提升"
    else:
        change = "不变"
    return change

4.关键词数据写入csv

写了一个案例,以及找了两个参考案例

import csv
#关键词数据写入csv
def write_keywords(self):
    path='{}_keywords.csv'.format(self.file_name)
    csvfile = open(path, 'a+')
    for keyword in self.keyword_datas:
        csvfile.write('%s\n' % keyword)
    print("5118关键词搜索数据写入csv成功!")

#参考一
def write_csv(self):
    path = "aa.csv"
    with open(path, 'a+') as f:
        csv_write = csv.writer(f)
        data_row = ["1", "2"]
        csv_write.writerow(data_row)

# 参考二
def wcsv(self):
    csvfile = open('csvtest.csv', 'w')
    writer = csv.writer(csvfile)
    writer.writerow(['keywords'])
    data = [
        ('1', 'http://www.xiaoheiseo.com/', '小黑'),
        ('2', 'http://www.baidu.com/', '百度'),
        ('3', 'http://www.jd.com/', '京东')
]
writer.writerows(data)
csvfile.close()

5.查询网站相关关键词数据写入excel表格

使用第三方库, xlsxwriter

#数据写入excle表格
def write_to_xlsx(self):
    workbook = xlsxwriter.Workbook('{}_search_results.xlsx'.format(self.file_name))  # 创建一个Excel文件
    worksheet = workbook.add_worksheet(self.file_name)
    title = ['关键词', '排名', '排名波动', '网页标题', '网页链接', '长尾词链接']  # 表格title
    worksheet.write_row('A1', title)
    for index, data in enumerate(self.data_lists):
        num0 = str(index + 2)
        row = 'A' + num0
        worksheet.write_row(row, data)
    workbook.close()
print("5118搜索数据写入excel成功!")

由于页码也是js生成,没有找到,所以页码自行输入吧!

输入查询网站网址格式为:www.xxx.com/cn 爬取后数据存储文件取用了主域名!

附完整代码:

#5118网站关键词数据获取

import requests
from lxml import etree
from urllib.parse import unquote
import xlsxwriter
import time
import csv


class C5118(object):
    def __init__(self,url,nums):
        self.keyword_datas=[]
        self.data_lists=[]
        self.index_links_hrefs=[]
        self.headers={
                'Accept': 'application/json, text/javascript, */*; q=0.01',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.9',
                'Connection': 'keep-alive',
                'Content-Length': '0',
                'Cookie': Cookies,
                'Host': 'www.5118.com',
                'Origin': 'https://www.5118.com',
                'Referer': 'https://www.5118.com/',
                'User-Agent': UA,
                'X-Requested-With': 'XMLHttpRequest',
            }
        self.post_url=url
        self.file_name=url.split('.')[1]
        self.pagenums=nums
    #判断排名是否提升
    def get_change(self,rank):
        rank=etree.tostring(rank).decode('utf-8')
        if "red" in str(rank):
            change="下降"
        elif "green" in str(rank):
            change = "提升"
        else:
            change = "不变"
        return change

    #获取数据
    def get_data(self,pagenum):
        url="https://www.5118.com/seo/baidupc"
        params={
            'isPager': 'true',
            'viewtype': '2',
            'days': '90',
            'url': self.post_url,
            'orderField': 'Rank',
            'orderDirection': 'asc',
            'pageIndex': pagenum,   #页码
            'catalogName': '',
        }
        response=requests.post(url,params=params,headers=self.headers)
        time.sleep(1)
        print(response.status_code)
        doc=etree.HTML(response.content.decode('utf-8'))
        keywords= doc.xpath('//tr[@class="list-row"]/td[1]/a/text()')  #关键词
        print(keywords)
        self.keyword_datas.extend(keywords)
        ranks = doc.xpath('//tr[@class="list-row"]/td[2]/a') #排名
        titles = doc.xpath('//tr[@class="list-row"]/td[5]/a/text()') #网页标题
        links=doc.xpath('//tr[@class="list-row"]/td[5]/a/@href') #网页链接
        index_links=doc.xpath('//tr[@class="list-row"]/td[7]/a/@href') #长尾词数量链接
        self.index_links_hrefs.extend(index_links)

        for keyword,rank,title,link,index_link in zip(keywords,ranks,titles,links,index_links):
            data=[
                keyword,
                rank.xpath('string(.)').strip().replace(' ','').replace('\r\n','-'),
                self.get_change(rank),
                title,
                unquote(link.split('target=')[-1]),
                'https:{}'.format(index_link),
            ]
            print(data)
            self.data_lists.append(data)
        time.sleep(4)

        return self.data_lists

    #关键词数据写入csv
    def write_keywords(self):
        path='{}_keywords.csv'.format(self.file_name)
        csvfile = open(path, 'a+')
        for keyword in self.keyword_datas:
            csvfile.write('%s\n' % keyword)
        print("5118关键词搜索数据写入csv成功!")

    #数据写入excle表格
    def write_to_xlsx(self):
        workbook = xlsxwriter.Workbook('{}_search_results.xlsx'.format(self.file_name))  # 创建一个Excel文件
        worksheet = workbook.add_worksheet(self.file_name)
        title = ['关键词', '排名', '排名波动', '网页标题', '网页链接', '长尾词链接']  # 表格title
        worksheet.write_row('A1', title)
        for index, data in enumerate(self.data_lists):
            num0 = str(index + 2)
            row = 'A' + num0
            worksheet.write_row(row, data)
        workbook.close()
        print("5118搜索数据写入excel成功!")



    def main(self):
        for i in range(1,self.pagenums+1):
            print(f'>>> 正在采集第{i}页关键词数据...')
            self.get_data(i)
        print("数据采集完成!")
        self.write_keywords()
        self.write_to_xlsx()



if __name__=="__main__":
    url = "www.shejipi.com"
    nums=100
    spider=C5118(url,nums)
    spider.main()

采集效果:

设计癖网站关键词相关数据:shejipi_search_results..xlsx

设计癖网站关键词数据:shejipi_keywords.csv

本文分享自微信公众号 - 二爷记(eryeji),作者:调侃二大爷

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python requests.session验证码登录应用实战,爱站关键词挖掘采集

    爱站站长工具一直是不少个人站长,seo相关从业者使用的工具之一,相比站长工具数据,爱站站长工具的数据更具有参考意义,前段时间爱站一直是关站状态,是因为专利侵权?...

    二爷
  • 关键词爬虫,Python花瓣画板关键词采集存储数据库

    想要寻找图片的小伙伴们应该不会错过这个网站,对,没错,就是花瓣网,各种图片应有尽有,而花瓣网的推荐画板里面的词还是非常不错的,可惜被和谐了不少,想要采集花瓣画板...

    二爷
  • 类及数据库的应用,G-MARK网站数据Python爬虫系统的构建

    “Good Design Award”创立于1957年,也是日本国内唯一综合性的设计评价与推荐制度,通称为G-mark,中文称之为日本优良设计大奖。

    二爷
  • 详解文本分类之DeepCNN的理论与实践

    最近在梳理文本分类的各个神经网络算法,特地一个来总结下。下面目录中多通道卷积已经讲过了,下面是链接,没看的可以瞅瞅。我会一个一个的讲解各个算法的理论与实践。目录...

    zenRRan
  • python pyqt5 按钮 QRadioButton 常用

    import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.Qt...

    用户5760343
  • 树莓派基础实验39:解析无线电接收机PWM、SBUS信号

      虽然如今或者将来,5G网络的建设带来人工智能和工业自动化的全面升级,生产活动中劳动力的需求大大减少,大量的劳动力将向内容生产行业和服务行业转移。教育、医疗、...

    张国平
  • Python基础之面向对象基础知识

    手洗:找盆 - 放水 - 加洗衣粉 - 浸泡 - 搓洗 - 拧干水 - 倒水 - 漂洗N次 - 拧干 - 晾晒。

    海仔
  • python收发邮件客户端

    程序员不务正业
  • Mechanize实战二:获取音悦台公告

    有些网站或论坛为了防止暴力破解,在登录框设置了一个验证码,目前针对验证码的解决方案可谓是千奇百怪,考虑到爬虫所需要的只是数据,完全可以绕过验证码,直接使用COO...

    py3study
  • TensorFlow应用实战-17-Qlearning实现迷宫小游戏

    总共有12个状态,s1到s12.对于每一个状态会有四个动作。对于每个状态下的每个动作会有一个Q的值。

    用户1332428

扫码关注云+社区

领取腾讯云代金券