python爬虫案例-跳过百度验证,接口调用实现百度搜索功能

2023-11-09

需求背景:我们有自己的平台,但是希望在我们的平台上面想要实现一个百度搜索的接口,输入想要搜索的内容,模拟百度搜索,将返回的内容再展现在我们自己的平台中,提供给用户查看。

# -- coding:utf8 --
import hashlib
import random
import sys
import time
from pprint import pprint
from urllib.parse import quote

from bs4 import BeautifulSoup
from requests_html import HTMLSession


# 代理ip
class GetProxy:
    _instance = None
    @staticmethod
    def get_random_proxy():
        while not GetProxy._instance:
            GetProxy._instance = ['211.149.199.235:16818', '123.57.57.125:16818']
        proxy = random.choice(GetProxy._instance).strip()
        return proxy

    """返回HTTP/HTTPS的代理IP,可根据代理IP类型更改"""
    def get_ip_http(self):
        proxies = {
            "http": self.get_random_proxy(),
        }
        return proxies

    def get_ip_https(self):
        proxies = {
            "https": self.get_random_proxy(),
        }
        return proxies


# 随机获取一个cookie
def get_random_cookie():
    cookies = [
        'PSTM=1645440125; BAIDUID=49D5966BB6F2D98A8378EC10151CE748:FG=1; BAIDUID_BFESS=49D5966BB6F2D98A8378EC10151CE748:FG=1; BIDUPSID=5C48EADF0E27C74CB11F290539E5EAA8; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; __yjs_duid=1_6b058121c11c500f39afbc042ec623711645440178604; delPer=0; PSINO=7; MCITY=-257%3A; BA_HECTOR=05a0ak0ga42525a5us1h18lb30r; BDRCVFR[C0p6oIjvx-c]=rJZwba6_rOCfAF9pywd; H_PS_PSSID=35105_35865_34584_35491_35872_35246_35319; ab_sr=1.0.1_ZGM2MTQ3YjE2NGE0ZmE2NWNhNGYzMDQ1Nzg1ZWYxYWFjZDllZjA1NzY0YWE3NjVjZmEyNjA4NmE5NTljZTEzOTFkNzViMWRlNTA4ZmQwYWIzYWZlYjQyMDYxZTcxNGI0NWVjYzU5ODk0ZDVmYmNkZDI4YzkyNGEwNTUwZjc4MWU3Y2Q0ZTUzOGExNjQwZTgzMzM4ZjQ2ZjkzMjE0OGNjZA==; BAIDU_WISE_UID=wapp_1645499858512_985',
        'BIDUPSID=0AB15879656FD166028DF65039BDFF15; PSTM=1641442191; BAIDUID=911EF71E90573B2693EC612910B1F7BE:FG=1; BCLID_BFESS=9239639223377566883; BDSFRCVID_BFESS=1T-OJeCmHxdstirHc7RXbo9jumKK0gOTHllnPXllHP8_1buVJeC6EG0Ptf8g0KubFTPRogKK0gOTH6KF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tJkD_I_hJKt3fP36q6_a2-F_2xQ0etJXf5Txbp7F5lOVO-ngKU613MkSjNOj5t482jTLahkM5h7xObR1hl3ih-An0a7dJ4jtQeQ-5KQN3KJmfbL9bT3v5tDz3b3N2-biWbRM2MbdJqvP_IoG2Mn8M4bb3qOpBtQmJeTxoUJ25DnJhhCGe6-MjT3-DG8jqbvEHDc-WJ3t-TrjDCvRhMjcy4LdjG5N0PJT5bv73K022boobJcGLqjW0R_X3-Aq54RMagQwLPJEytQTS-5VbtoMQfbQ0-cOqP-jWbnu-qTo2n7JOpkRbUnxy50vQRPH-Rv92DQMVU52QqcqEIQHQT3m5-5bbN3ht6IHJbCJoDD5tIvbfP0kjjQWMt_h-fuX5-CstGPL2hcH0b61JbbR5-rKy-JW0R7a25cBbCjiaKJjBMb1DbRk0h7ShMkrebPD5JQpWDTm_q5TtUJMeCnTDMRh-xK70b5yKMnitIv9-pPKWhQrh459XP68bTkA5bjZKxtq3mkjbPbDfn028DKu-n5jHj3WDG-J3q; __yjs_duid=1_ada3d0ac8d4be7042dd53d52221555631641452261829; BAIDUID_BFESS=911EF71E90573B2693EC612910B1F7BE:FG=1; BD_HOME=1; H_PS_PSSID=35104_31660_34584_35490_35841_35887_35542_35318_26350_35867_22158; BD_UPN=12314753; delPer=0; BD_CK_SAM=1; PSINO=7; H_PS_645EC=09c89Z6QKcJ4xzJZr1LUqxrp0qdbpltyn/ixDDrfq5R6r0cQWwLiJT3HLZY; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=a424810gag04818hg31h15uop0q; baikeVisitId=492b5e23-3a27-4d6d-bf0a-ab5907361a87; BDSVRTM=643']
    cooke = random.choice(cookies).strip()
    return cooke

def search_kw(kw, pn, tp):
    cookie = get_random_cookie()
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",
        "Referer": "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&ch=&tn=baiduhome_pg&bar=&wd=123&oq=123&rsv_pq=896f886f000184f4&rsv_t=fdd2CqgBgjaepxfhicpCfrqeWVSXu9DOQY5WyyWqQYmsKOC%2Fl286S248elzxl%2BJhOKe2&rqlang=cn",
        # "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        "Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
        "Sec-Fetch-Mode": "navigate",
        "Cookie": cookie,
        "Connection": "Keep-Alive",
    }

    if cookie:
        if "__yjs_duid" not in cookie:
            pass
        else:
            _ = cookie.split("__yjs_duid=")
            __ = _[1].split(";", 1)[-1]
            ___ = hashlib.md5()
            cookie = _[0] + "__yjs_duid=1_" + str(___.hexdigest()) + __

    headers["Cookie"] = cookie + ";random=" + str(random.randint(500, 4000))

    text = quote(kw, "utf-8")
    rsv_page = ''
    cp = 1
    if pn == 'np':
        rsv_page = '&rsv_page=1'
    else:
        cp = int(pn)


    if tp == '1':  # 网页
        url = f"https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd={kw}&oq={text}&pn={(cp - 1) * 10}&inputT={random.randint(500, 4000)}{rsv_page}"
    elif tp == '2':  # 图片
        url = f"https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word={kw}&oq={text}&pn={(cp - 1) * 10}&inputT={random.randint(500, 4000)}{rsv_page}"
    # elif tp == '3':  # 资讯
    #     url = f"https://www.baidu.com/s??rtt=1&bsst=1&cl=2&tn=news&word={kw}&oq={text}&pn={(cp - 1) * 10}&inputT={random.randint(500, 4000)}{rsv_page}"
    # elif tp == '4':  # 知道
    #     url = f"https://zhidao.baidu.com/search?ie=utf-8&f=8&rsv_bp=1&tn=baidu&word={kw}&oq={text}&pn={(cp - 1) * 10}&inputT={random.randint(500, 4000)}{rsv_page}"
    # elif tp == '5':  # 贴吧
    #     url = f"https://tieba.baidu.com/f?fr=wwwt&ie=utf-8&kw={kw}&oq={text}&pn={(cp - 1) * 10}&inputT={random.randint(500, 4000)}{rsv_page}"
    # elif tp == '6':  # 视频
    #     url = f"https://www.baidu.com/sf/vsearch?pd=video&tn=vsearch&ie=utf-8&wrsv_spt=10&wd={kw}&oq={text}&pn={(cp - 1) * 10}&inputT={random.randint(500, 4000)}{rsv_page}"
    elif tp == '3':  # 文库
        url = f"https://wenku.baidu.com/search?lm=0&od=0&ie=utf-8&word={kw}&oq={text}&pn={(cp - 1) * 10}&inputT={random.randint(500, 4000)}{rsv_page}"

    elif tp == '4':  # 百科
        url = f"https://baike.baidu.com/search?lm=0&od=0&ie=utf-8&word={kw}&oq={text}&pn={(cp - 1) * 10}&inputT={random.randint(500, 4000)}{rsv_page}"


    proxies = GetProxy().get_ip_http()
    session = HTMLSession()
    r = session.get(url, headers=headers, proxies=proxies)
    r.encoding = r.apparent_encoding
    content_html = r.html.html
    soup = BeautifulSoup(content_html, features="html.parser")

    # 删除无用元素
    if tp == '1':  # 网页
        head = soup.find("div", id="head")
        if head:
            head.decompose()
        s_tab = soup.find("div", id="s_tab")
        if s_tab:
            s_tab.decompose()
        content_right = soup.find("div", id="content_right")
        if content_right:
            content_right.decompose()
        rs_new = soup.find("div", id="rs_new")
        if rs_new:
            rs_new.decompose()
        foot = soup.find("div", id="foot")
        if foot:
            foot.decompose()


    elif tp == '2':  # 图片
        head = soup.find("div", id="head")
        if head:
            head.decompose()
        s_tab = soup.find("div", id="s_tab")
        if s_tab:
            s_tab.decompose()
        content_right = soup.find("div", id="content_right")
        if content_right:
            content_right.decompose()
        rs_new = soup.find("div", id="rs_new")
        if rs_new:
            rs_new.decompose()
        foot = soup.find("div", id="foot")
        if foot:
            foot.decompose()
        bdpcImgTab = soup.find("div", id="bdpcImgTab")
        if bdpcImgTab:
            bdpcImgTab.decompose()
        topInfoBar = soup.find("div", id="topInfoBar")
        if topInfoBar:
            topInfoBar.decompose()


    # elif tp == '3':  # 资讯
    #     head = soup.find("div", id="head")
    #     if head:
    #         head.decompose()
    #     s_tab = soup.find("div", id="s_tab")
    #     if s_tab:
    #         s_tab.decompose()
    #     content_right = soup.find("div", id="content_right")
    #     if content_right:
    #         content_right.decompose()
    #     rs_new = soup.find("div", id="rs_new")
    #     if rs_new:
    #         rs_new.decompose()
    #     foot = soup.find("div", id="foot")
    #     if foot:
    #         foot.decompose()
    #
    #
    # elif tp == '4':  # 知道
    #     head = soup.find("div", id="head")
    #     if head:
    #         head.decompose()
    #     s_tab = soup.find("div", id="s_tab")
    #     if s_tab:
    #         s_tab.decompose()
    #     content_right = soup.find("div", id="content_right")
    #     if content_right:
    #         content_right.decompose()
    #     rs_new = soup.find("div", id="rs_new")
    #     if rs_new:
    #         rs_new.decompose()
    #     foot = soup.find("div", id="foot")
    #     if foot:
    #         foot.decompose()
    #     right_billboard = soup.find("div", id="right-billboard")
    #     if right_billboard:
    #         right_billboard.decompose()
    #
    #
    # elif tp == '5':  # 贴吧
    #     head = soup.find("div", id="head")
    #     if head:
    #         head.decompose()
    #     s_tab = soup.find("div", id="s_tab")
    #     if s_tab:
    #         s_tab.decompose()
    #     content_right = soup.find("div", id="content_right")
    #     if content_right:
    #         content_right.decompose()
    #     rs_new = soup.find("div", id="rs_new")
    #     if rs_new:
    #         rs_new.decompose()
    #     foot = soup.find("div", id="foot")
    #     if foot:
    #         foot.decompose()
    #     pagelet_head = soup.find("div", id="pagelet_frs-header/pagelet/head")
    #     if pagelet_head:
    #         pagelet_head.decompose()
    #     normal_aside = soup.find("div", id="pagelet_frs-aside/pagelet/normal_aside")
    #     if normal_aside:
    #         normal_aside.decompose()
    #     content_footer = soup.find("div", id="pagelet_frs-footer/pagelet/content_footer")
    #     if content_footer:
    #         content_footer.decompose()
    #
    #
    # elif tp == '6':  # 视频
    #     head = soup.find("div", id="head")
    #     if head:
    #         head.decompose()
    #     s_tab = soup.find("div", id="s_tab")
    #     if s_tab:
    #         s_tab.decompose()
    #     content_right = soup.find("div", id="content_right")
    #     if content_right:
    #         content_right.decompose()
    #     rs_new = soup.find("div", id="rs_new")
    #     if rs_new:
    #         rs_new.decompose()
    #     foot = soup.find("div", id="foot")
    #     if foot:
    #         foot.decompose()
    #     con_ar = soup.find("div", id="con-ar")
    #     if con_ar:
    #         con_ar.decompose()

    elif tp == '3':  # 文库
        head = soup.find("div", id="head")
        if head:
            head.decompose()
        s_tab = soup.find("div", id="s_tab")
        if s_tab:
            s_tab.decompose()
        content_right = soup.find("div", id="content_right")
        if content_right:
            content_right.decompose()
        rs_new = soup.find("div", id="rs_new")
        if rs_new:
            rs_new.decompose()
        foot = soup.find("div", id="foot")
        if foot:
            foot.decompose()

        elif tp == '4':  # 百科
            head = soup.find("div", iclass_="wiki-common-headTab")
            if head:
                head.decompose()
            foot = soup.find("div", class_="wgt-footer-main")
            if foot:
                foot.decompose()

    page_content = soup.find("div", id="page")
    if page_content:
        links = page_content.findAll("a")
        if links:
            for link in links:
                span = link.find('span')
                cp = 'np'
                if span:
                    cp = span.get_text()

                href = f"/article/searchEverything?wd={kw}&pn={cp}&tp={tp}"
                link['href'] = href

    soup_content = soup.prettify(encoding="utf-8", formatter='minimal')
    print(soup_content)


if __name__ == '__main__':

    kw = '广州市区'
    pn = '1'
    tp = '4'
    if len(sys.argv) == 4:
        kw = sys.argv[1]
        pn = sys.argv[2]
        tp = sys.argv[3]
    elif len(sys.argv) == 3:
        pn = sys.argv[1]
        tp = sys.argv[2]

    result = search_kw(kw, pn, tp)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python爬虫案例-跳过百度验证,接口调用实现百度搜索功能 的相关文章

随机推荐

  • Vm配置虚拟网络信息&配置虚拟机防火墙&取消软件安装限制&解决问题Temporary failure in name resolution

    目录 配置环境 一 前置知识 1 NAT模式 用的比较多 2 桥接模式 3 仅主机模式 二 修改虚拟网卡信息 1 首先我们可以看到我们这里有两张网卡 问题一 你们可以想一下假如我没有桥接到我的真实可以上网的网卡上会怎么样 这种错误我之前犯过
  • Google敦促更快普及VP9视频压缩技术

    转自 http www cnetnews com cn 2013 0516 2159618 shtml CNET科技资讯网 05月16日 国际报道 计算机行业才谈及VP8解编码技术 Google就希望人们接受它的VP9技术了 Google的
  • DES 密钥生成 加密解密

    import java security InvalidKeyException import java security NoSuchAlgorithmException import java security SecureRandom
  • E1,T1, PRI, Trunk

    E1 T1 PRI Trunk 北美的24路脉码调制PCM简称T1 速率是1 544Mbit s 欧洲的30路脉码调制PCM简称E1 速率是2 048Mbit s 我国采用的是欧洲的E1标准 E1的一个时分复用帧 其长度T 125us 共划
  • read_csv文件读写参数详解————

    python pandas IO tools 之csv文件读写 英文原文 pandas IO tools 读取csv文件 pd read csv 写入csv文件 pd to csv pandas还可以读取一下文件 read csv read
  • .NET诞生20周年 .NET 7有什么新东西?

    首个预览版已发布 NET 7 有什么新东西 随着第一个预览版发布 NET 7 渐渐浮出水面 NET 高级项目经理 Jeremy Likness 在官方博客中介绍了 NET 7 的主要发展方向 俺整理给大伙做一下介绍 NET 7 建立在 NE
  • 实训二十二:交换机标准 ACL 配置

    一 实验目的 1 了解什么是标准的 ACl 2 了解标准 ACL 不同的实现方法 二 应用环境 1 ACL Access Control Lists 是交换机实现的一种数据包过滤机制 通过允许或拒绝特定的数据包进出网络 交换机可以对网络访问
  • Uoj 33 树上GCD (树分治)

    include
  • RabbitMQ:Queue的介绍和使用

    1 声明 当前内容用于本人学习和使用当前的Queue 当前内容为RabbitMQ中对Queue的介绍 当前内容来源 RabbitMQ中的Queue 2 Queue的官方介绍 首先先分析以下前面的Queue的使用 其实这个东西就是一个队列 一
  • Qt项目中头文件无法找到的几个解决办法

    项目场景 在新建项目中引用头文件 问题描述 头文件无法找到 系统提示错误 file not found 原因分析 可能是头文件写错 也可能是路径有问题 解决方案 三种解决方法 1 检查头文件是否写错 注意新旧版本的差异 2 检查路径是否为全
  • Windows下Python加载VLC的方法

    从网上看到一篇文章 Python 流媒体播放器 基于VLC 其中提到windows下开发VLC需要首先安装VLC 否则就需要设置环境变量PYTHON VLC MODULE PATH 但是我尝试了一下 没有成功 但是 这篇文章给了我一个思路
  • 剑指 Offer 25. 合并两个排序的链表

    题目链接 25 合并两个排序的链表 思路分析 利用归并排序的归并思想 Definition for singly linked list struct ListNode int val ListNode next ListNode int
  • 2021中国WMS市场发展趋势和特点

    仓储行业经历了30多年的发展 正在由手工仓向数字仓 智能仓转变 而在这个过程中 作为指挥硬件设备的 大脑 WMS起着不可或缺的作用 WMS系统通过数字化仓库作业过程管控 借助条码化和智能化技术手段 实现仓库作业条码化 作业过程透明化 库存管
  • 【满分】【华为OD机试真题2023 JS】红黑图

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 红黑图 知识点枚举 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 众所周知红黑树是一种平衡树 它最突出的特性就是不能有两个相邻的红色节点 那我们定义一个红黑图
  • shardingsphere引发 java.lang.String cannot be cast to java.lang.Integer异常

    错误描述 mysql数据库查询sql在数据库连接工具中可以正常运行 在加入了shardingsphere的jar包的项目中抛如下异常 java lang ClassCastException java lang String cannot
  • shell脚本循环传值_Shell 脚本的循环控制(for/while/until)

    熟悉其他高级语言的伙伴们肯定了解循环控制语法是编程中非常基础的内容 今天就介绍Shell 中设计循环控制的语法 for while until 等内容 for 命令 for 命令是最简单的循环控制语句 它的格式为 for var in li
  • SyntaxError: Cannot use import statement outside a module

    Node 生态包含两个不同的模块系统 ESM ECMAScript 模块 和 CommonJS 两个模块系统彼此不兼容 其是 SyntaxError 无法在模块外部使用 import 语句 错误 错误 SyntaxError 无法在模块外部
  • C++ 好用的格式化库--fmt

    背景 fmt 库是一个开源的 C 格式化库 它提供了一种简洁 安全和高效的方式来进行字符串格式化 该库的设计目标是提供与 Python 的字符串格式化语法类似的功能 同时保持 C 的类型安全性和性能 下载与安装 官网下载 fmt 官网地址
  • springboot+jsp教育机构OA系统(源码免费获取+论文+答辩PPT)

    技术架构 springboot mybatis springmvc jsp mysql 功能模块 整个系统分为三种角色 1 系统管理员 2 上级角色 3 普通教师 其中系统管理员需要的功能 部门人员管理功能 档案信息的添加 工作管理功能 上
  • python爬虫案例-跳过百度验证,接口调用实现百度搜索功能

    需求背景 我们有自己的平台 但是希望在我们的平台上面想要实现一个百度搜索的接口 输入想要搜索的内容 模拟百度搜索 将返回的内容再展现在我们自己的平台中 提供给用户查看 coding utf8 import hashlib import ra