• Python如何采集关键词数据


    对于seo而言,关键词的排名对网站优化起到决定性作用,关键词排名情况,流量来源、以及同行的网站数据,都可以通过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!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    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成功!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    由于页码也是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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
  • 相关阅读:
    (八)RabbitMQ发布确认
    拆解 DeepSeek Harness:Profile 与 Bundle 如何装配运行时
    Go runtime 调度器精讲(九):系统调用引起的抢占
    Android Frgment中onActivityResult无效的问题
    行情订阅&分钟合成
    [cpu出错心得]
    紫草酸人血清白蛋白HSA纳米粒|乳香酸卵清白蛋白OVA纳米粒|表白桦脂酸人血清白蛋白纳米粒Epibetulinic Acid-HSA
    GBASE 8A v953报错集锦55--Load data 数据中含有 longtext 报内存不足
    用百度云怎么重装电脑系统
    如何将java项目部署到github?如何将github的java项目部署到本地(通过idea)?
  • 原文地址:https://blog.csdn.net/weixin_44617651/article/details/128076100