python教程

当前位置:首页 > SEO工具 > 当前文章

SEO工具

python多线程百度mo指定域名查询关键词排名

2020-08-24 175赞 老董笔记

  查询关键词排名有两种,第一种是指定url和关键词查看是否有排名,第二种是提供关键词查看某个域名下哪个url有排名,这里提供第二种方式的脚本。其中的注意事项如下(线程数默认是1,现在百度反爬比之前严重!线程最好是1。【多线程写同一个文件需要加锁否则可能数据错乱)):

  1、准备关键词文件kwd.txt(一行一个)

  2、指定待查询域名domain

  3、域名不要带https或者http

  4、如果一个词某个域名下有2个url出现排名 取第一个

# ‐*‐ coding: utf‐8 ‐*‐
"""
关键词文件kwd.txt(一行一个) 仅查前十名
指定待查询域名domain
domain不要带https或者http
结果保存文件格式:关键词 对应排名的url 及排名值
如果一个词某个域名下有2个url出现排名 取第一个
"""

import requests
from pyquery import PyQuery as pq
import threading
import queue
import gc
import json


class BdmoRank(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    # 读取txt文件 获取待查询url
    @staticmethod
    def read_txt(filepath):
        q = queue.Queue()
        for line in open(filepath, encoding='utf-8'):
            kwd = line.strip()
            q.put(kwd)
        return q

    # 获取某词的serp源码
    def get_html(self, url, retry=2):
        try:
            r = requests.get(url=url, headers=user_agent, timeout=5)
        except Exception as e:
            print('获取源码失败', url, e)
            if retry > 0:
                self.get_html(url, retry - 1)
        else:
            html = r.text
            return html

    # 获取某词的serp源码上包含排名url的div块
    def get_data_logs(self, html):
        data_logs = []
        if html and '百度' in html:
            doc = pq(html)
            try:
                div_list = doc('.c-result').items()
            except Exception as e:
                print('提取div块失败', e)
            else:
                for div in div_list:
                    data_log = div.attr('data-log')
                    data_logs.append(data_log) if data_log is not None else data_logs
        return data_logs

    # 检查链接是否首页有排名
    def check_include(self,data_logs=[]):
        rank = None
        for data_log in data_logs:
            # json字符串要以双引号表示
            data_log = json.loads(data_log.replace("'", '"'))
            rank_url = data_log['mu']
            if doamin in rank_url:
                rank = data_log['order']
                print(rank_url,rank)
                return rank_url,rank
        return 'not url found',rank

    # 线程函数
    def run(self):
        while 1:
            kwd = q.get()
            try:
                url = "https://m.baidu.com/s?ie=utf-8&word={0}".format(kwd)
                html = self.get_html(url)
                data_logs = self.get_data_logs(html)
                rank_url,rank = self.check_include(data_logs)
                print(kwd,rank_url,rank)
                f.write(kwd + '	' + rank_url+ '	'+ str(rank) + '
')
                del kwd
                gc.collect()
            except Exception as e:
                print(e)
            finally:
                q.task_done()


if __name__ == "__main__":

    doamin = 'renrenche.com'
    user_agent = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 8.1.0; ALP-AL00 Build/HUAWEIALP-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.83 Mobile Safari/537.36 T7/10.13 baiduboxapp/10.13.0.11 (Baidu; P1 8.1.0)'}
    q = BdmoRank.read_txt('kwd.txt')
    f = open('bdmo_rank2.txt','w',encoding='utf-8')
    # 设置线程数
    for i in list(range(1)):
        t = BdmoRank()
        t.setDaemon(True)
        t.start()
    q.join()
    f.flush()
    f.close()


鞍山保时捷二手车报价	not url found	None
鞍山二手宝沃	https://m.renrenche.com/sh/car/fe11e17fbeb45886	5
鞍山北京二手车报价	not url found	None
鞍山二手北汽幻速	https://m.renrenche.com/luohe/car/94afbec2606a6696	1
鞍山宝沃二手车报价	https://www.renrenche.com/cn/baowo/	8
鞍山二手北汽绅宝	https://m.renrenche.com/bj/car/97313486b7d4b368	5
鞍山二手北汽威旺	https://m.renrenche.com/as/car/d21275d63df8e1c8	1
鞍山北汽绅宝二手车报价	https://m.renrenche.com/cn/beiqishenbao/	10
鞍山北汽威旺二手车报价	https://m.renrenche.com/cn/beiqiweiwang/	7
鞍山二手北汽新能源	not url found	None
鞍山二手北汽制造	not url found	None
鞍山北汽新能源二手车报价	https://www.renrenche.com/cn/beiqixinnengyuan/jishou/	9
鞍山北汽制造二手车报价	not url found	None
鞍山二手北京	not url found	None


  百度Mo指定域名查询关键词的排名url的代码如上,有问题请及时反馈给我,共同交流哈。

感兴趣直接点击图片获取>>

文章评论

python多线程百度mo指定域名查询关键词排名文章写得不错,值得赞赏