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

爱站站长工具一直是不少个人站长,seo相关从业者使用的工具之一,相比站长工具数据,爱站站长工具的数据更具有参考意义,前段时间爱站一直是关站状态,是因为专利侵权?还是其他呢?应该没有什么大体上的更新,网页规则没有发生什么改变,以前写的python抓取源码还是能够使用。
python requests.session验证码登录应用实战,爱站关键词挖掘采集_第1张图片
爱站网成立于2009年,主办单位是亿讯网络公司,是一家专门针对中文站点提供服务的网站,主要为广大站长提供站长工具查询,目前网站访问量已超过百万,注册会员100万人次。

爱站关键词挖掘工具抓取几个关键点:
1.需登录方可查看获取全部数据
两个思路:
第一:直接粘贴登录后的 cookies 特别简单方便!
第二:使用 requests.session 保持cookies 登录状态 获取我们想要的采集数据。

self.s=requests.session() #设置一个会话
#登录网站账号
    def login(self):
        data = {
     
            'refer': 'https://ci.aizhan.com/',
            'username':self.username,
            'password':self.password,
            'code': self.code,
        }
        html=self.s.post(self.login_url,data=data,timeout=10).content.decode('utf-8')
        time.sleep(2)
        self.html=html
#登录主程序
    def login_main(self):
        self.get_code()
        self.login()
        self.verify()
        if self.status==1:
            print("正在重新获取验证码,请稍候重新输入验证码...")
            time.sleep(2)
            self.get_code()
            self.login()
            self.verify()
        if self.status == 2:
            print(">>>程序终止!")
            sys.exit()

2.验证码登录的处理
我这里处理是手工打码,下载到验证码图片,然后输入验证码,登录网站。
当然你可以接入第三方打码平台;
或者使用图片识别;
或者人工智能学习!

#获取验证码信息
    def get_code(self):
        code_html = self.s.get(self.login_url,headers=self.headers,timeout=10).content.decode('utf-8')
        time.sleep(2)
        captcha=re.findall(r',code_html,re.S)[0]
        img_code_url=f'https://www.aizhan.com/{captcha}'
        print(f"验证码图片地址为:{img_code_url},正在获取图片内容...")
        r=self.s.get(img_code_url,timeout=10)
        time.sleep(2)
        with open(f'code.png','wb') as f:
            f.write(r.content)
        code=input("请打开图片,输入图片验证码:")
        print(">>>已获取验证码,下一步,准备尝试登录...")
        self.code=code

本渣渣就只会手动党,最渣的方式。。

3.登录成功的状态验证,以及验证码输入有误的处理

#验证登录是否成功
    def verify(self):
        if "退出" in self.html:
            print(">>>爱站账号登录成功了!")
            status=0
        elif "验证码错误" in self.html:
            print(">>>验证码输入有误!")
            status=1
        else:
            print(">>>爱站账号登录失败!")
            print(">>>请检查爱站账号是否有误或者是否被封禁或者网站是否无法打开!")
            status=2
        self.status=status

4.关键词字符转成url地址格式(关键点!!!)

还好网上有大佬分享!!

来源:https://www.biaodianfu.com/aizhan-keywords.html

        http://static.aizhan.com/js/home.js
        function encode_unicode_param(a) {
     
            for (var s = "
", t = 0; t < a.length; t++) {
     
                var e = a.charCodeAt(t).toString(16);
                s += (2 == e.length) ? "
n
" + e : e
            }
            return s
        }

        function decode_unicode_param(a) {
     
            a = a.replace(/n/g, "
00
");
            for (var s = "
", t = 0; t < a.length / 4; t++) s += unescape("
%u
" + a.substr(4 * t, 4));
            return s
        }
        来源:https://www.biaodianfu.com/aizhan-keywords.html
 


#关键词字符url转换
    def get_keyword_url(self):
        s = ""
        if self.keyword:
            self.keyword =self.keyword.replace('+', '')
            for c in keyword:
                e = hex(ord(c))[2:]
                if len(e) == 2:
                    e = "n" + e
                s += e
        print(s)
        return s

5.数据采集的特殊情况处理
第一:关键词无数据
python requests.session验证码登录应用实战,爱站关键词挖掘采集_第2张图片
第二:关键词数据存在分页情况
所以数据采集处理的时候有三种情况(暂时我就观察到这样的三种情况)

#爱站关键词挖掘
    def get_keywords(self):
        key=self.keyword
        keyurl=self.get_keyword_url()
        url=f'https://ci.aizhan.com/{keyurl}/'
        html=self.s.get(url,timeout=10).content.decode('utf-8')
        if "没有相关的关键词。" in html:
            print(f'{key}没有相关的关键词')
            print(">>>采集程序终止!")
            sys.exit()
        req=etree.HTML(html)
        pagenum=req.xpath('//div[@class="pager"]/ul/li/a/text()')[-1]
        if int(pagenum)>1:
            print(f'{key}关键词数据存在分页,共有{pagenum}个分页!')
            for i in range(1,int(pagenum)+1):
                print(f'正在采集第{i}页关键词数据..')
                page_url=f'{url}{i}/'
                page_html = self.s.get(page_url, timeout=10).content.decode('utf-8')
                time.sleep(2)
                page_req = etree.HTML(page_html)
                datas=self.get_page_kewords(page_req)
                self.keywords_data.extend(datas)
            print(f">>>采集关键词数据完成!")

        else:
            print(f'{key}关键词数据没有分页,正在抓取关键词数据...')
            datas=self.get_page_kewords(req)
            self.keywords_data.extend(datas)
            print(f">>>采集关键词数据完成!")

6.数据的保存,还是保存为excel格式文件!


#保存数据为excel
    def save_datas(self):
        key=self.keyword
        print(f"正在保存{key}关键词数据...")
        workbook = xlwt.Workbook(encoding='utf-8')
        booksheet = workbook.add_sheet('Sheet 1', cell_overwrite_ok=True)
        title = [['序号', '关键词', 'PC/移动指数', '收录数', '首页第1位网页链接', '首页第1位网页标题', '首页第2位网页链接', '首页第2位网页标题']]
        title.extend(self.keywords_data)
        for i, row in enumerate(title):
            for j, col in enumerate(row):
                booksheet.write(i, j, col)
        workbook.save(f'{key}.xls')
        print(f">>>保存关键词数据为 {key}.xls 成功!")

采集效果:
python requests.session验证码登录应用实战,爱站关键词挖掘采集_第3张图片
python requests.session验证码登录应用实战,爱站关键词挖掘采集_第4张图片
python requests.session验证码登录应用实战,爱站关键词挖掘采集_第5张图片

附完整源码:

#爱站关键词挖掘
#20200214 by 微信:huguo00289
# -*- coding: utf-8 -*-

import requests,time,re,sys
from fake_useragent import UserAgent
from lxml import etree
import xlwt

class Aizhan(object):
    def __init__(self,keyword,username,password):
        self.ua=UserAgent()
        self.headers={
     'UserAgent':self.ua.random}
        self.s=requests.session() #设置一个会话
        self.login_url = "https://www.aizhan.com/login.php"
        self.code=''
        self.html=''
        self.status=int()
        self.keywords_data=[]
        self.keyword = keyword
        self.username=username
        self.password=password

    #获取验证码信息
    def get_code(self):
        code_html = self.s.get(self.login_url,headers=self.headers,timeout=10).content.decode('utf-8')
        time.sleep(2)
        captcha=re.findall(r',code_html,re.S)[0]
        img_code_url=f'https://www.aizhan.com/{captcha}'
        print(f"验证码图片地址为:{img_code_url},正在获取图片内容...")
        r=self.s.get(img_code_url,timeout=10)
        time.sleep(2)
        with open(f'code.png','wb') as f:
            f.write(r.content)
        code=input("请打开图片,输入图片验证码:")
        print(">>>已获取验证码,下一步,准备尝试登录...")
        self.code=code


    #登录网站账号
    def login(self):
        data = {
     
            'refer': 'https://ci.aizhan.com/',
            'username':self.username, 
            'password':self.password, 
            'code': self.code,
        }
        html=self.s.post(self.login_url,data=data,timeout=10).content.decode('utf-8')
        time.sleep(2)
        self.html=html


    #验证登录是否成功
    def verify(self):
        if "退出" in self.html:
            print(">>>爱站账号登录成功了!")
            status=0
        elif "验证码错误" in self.html:
            print(">>>验证码输入有误!")
            status=1
        else:
            print(">>>爱站账号登录失败!")
            print(">>>请检查爱站账号是否有误或者是否被封禁或者网站是否无法打开!")
            status=2
        self.status=status

    #关键词字符url转换
    def get_keyword_url(self):
        """
        http://static.aizhan.com/js/home.js
        function encode_unicode_param(a) {
            for (var s = "", t = 0; t < a.length; t++) {
                var e = a.charCodeAt(t).toString(16);
                s += (2 == e.length) ? "n" + e : e
            }
            return s
        }

        function decode_unicode_param(a) {
            a = a.replace(/n/g, "00");
            for (var s = "", t = 0; t < a.length / 4; t++) s += unescape("%u" + a.substr(4 * t, 4));
            return s
        }
        来源:https://www.biaodianfu.com/aizhan-keywords.html
        """
        s = ""
        if self.keyword:
            self.keyword =self.keyword.replace('+', '')
            for c in keyword:
                e = hex(ord(c))[2:]
                if len(e) == 2:
                    e = "n" + e
                s += e
        print(s)
        return s

    #爱站关键词挖掘
    def get_keywords(self):
        key=self.keyword
        keyurl=self.get_keyword_url()
        url=f'https://ci.aizhan.com/{keyurl}/'
        html=self.s.get(url,timeout=10).content.decode('utf-8')
        if "没有相关的关键词。" in html:
            print(f'{key}没有相关的关键词')
            print(">>>采集程序终止!")
            sys.exit()
        req=etree.HTML(html)
        pagenum=req.xpath('//div[@class="pager"]/ul/li/a/text()')[-1]
        if int(pagenum)>1:
            print(f'{key}关键词数据存在分页,共有{pagenum}个分页!')
            for i in range(1,int(pagenum)+1):
                print(f'正在采集第{i}页关键词数据..')
                page_url=f'{url}{i}/'
                page_html = self.s.get(page_url, timeout=10).content.decode('utf-8')
                time.sleep(2)
                page_req = etree.HTML(page_html)
                datas=self.get_page_kewords(page_req)
                self.keywords_data.extend(datas)
            print(f">>>采集关键词数据完成!")

        else:
            print(f'{key}关键词数据没有分页,正在抓取关键词数据...')
            datas=self.get_page_kewords(req)
            self.keywords_data.extend(datas)
            print(f">>>采集关键词数据完成!")

    #采集单页关键词数据
    def get_page_kewords(self,req):
        datas=[]
        orders=req.xpath('//table[@class="table table-striped table-s2"]/tbody/tr/td[@class="order"]/text()') #序号
        titles = req.xpath('//table[@class="table table-striped table-s2"]/tbody/tr/td[@class="title"]/a/@title') #关键词
        centers = req.xpath('//table[@class="table table-striped table-s2"]/tbody/tr/td[@class="center"]/span/text()') #PC/移动指数
        levels = req.xpath('//table[@class="table table-striped table-s2"]/tbody/tr/td[@class="level"]/text()')  # 收录数
        url1s = req.xpath('//table[@class="table table-striped table-s2"]/tbody/tr/td[@class="url"][1]/a/i/text()')  # 首页第1位网页链接
        url1_titles = req.xpath('//table[@class="table table-striped table-s2"]/tbody/tr/td[@class="url"][1]/a/p/text()')  # 首页第1位网页标题
        url2s = req.xpath('//table[@class="table table-striped table-s2"]/tbody/tr/td[@class="url"][2]/a/i/text()')  # 首页第2位网页链接
        url2_titles = req.xpath('//table[@class="table table-striped table-s2"]/tbody/tr/td[@class="url"][2]/a/p/text()')  # 首页第2位网页标题
        for order,title,center,level,url1,url1_title,url2,url2_title in zip(orders,titles,centers,levels,url1s,url1_titles,url2s,url2_titles):
            print(order,title,center,level,url1,url1_title,url2,url2_title)
            data=[order,title,center,level,url1,url1_title,url2,url2_title]
            datas.append(data)

        time.sleep(2)
        return datas

    #保存数据为excel
    def save_datas(self):
        key=self.keyword
        print(f"正在保存{key}关键词数据...")
        workbook = xlwt.Workbook(encoding='utf-8')
        booksheet = workbook.add_sheet('Sheet 1', cell_overwrite_ok=True)
        title = [['序号', '关键词', 'PC/移动指数', '收录数', '首页第1位网页链接', '首页第1位网页标题', '首页第2位网页链接', '首页第2位网页标题']]
        title.extend(self.keywords_data)
        for i, row in enumerate(title):
            for j, col in enumerate(row):
                booksheet.write(i, j, col)
        workbook.save(f'{key}.xls')
        print(f">>>保存关键词数据为 {key}.xls 成功!")

    #登录主程序
    def login_main(self):
        self.get_code()
        self.login()
        self.verify()
        if self.status==1:
            print("正在重新获取验证码,请稍候重新输入验证码...")
            time.sleep(2)
            self.get_code()
            self.login()
            self.verify()
        if self.status == 2:
            print(">>>程序终止!")
            sys.exit()



if __name__=="__main__":
    username=input("请输入爱站站长工具账号名称:")
    password = input("请输入爱站站长工具账号密码:")
    keyword=input("请输入要挖掘的关键词:")
    spider=Aizhan(keyword,username,password)
    spider.login_main()
    spider.get_keywords()
    spider.save_datas()

以上仅供参考和学习,如有雷同肯定是我抄袭的!

欢迎与我交流python,微信:huguo00289

你可能感兴趣的:(python与seo)