我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python爬虫获取子域名以及对“百度安全验证”问题的解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python爬虫获取子域名以及对“百度安全验证”问题的解决

编写的python代码是在借鉴老师给的资料的基础上实现的

进行课堂实践:模仿bing搜索引擎域名收集功能,实现baidu搜索引擎的域名搜集功能时,走了不少弯路,最后终于形成了完整的思路。尤其是在“百度安全验证”问题上耗费的时间之久,就因为忽略了cookie的有效获取

公开信息搜集之子域名搜集的语法

  1. bing搜索引擎获取子域名的语法为:domain:[域名]
    eg:通过bing搜索引擎获取baidu.com域名下的子域名,需输入的语法为:domain:baidu.com
  2. baidu搜索引擎获取子域名的语法为:site:[域名]
    eg:通过baidu搜索引擎获取baidu.com域名下的子域名,需输入的语法为:site:baidu.com

编写python代码与实现过程

导入相应模块

import requests       #用于请求网页资源from bs4 import BeautifulSoup            #用于处理获取的网页源码数据from urllib.parse import urlparse        #用于处理url"""若没有这些模块,可在安装的python文件下执行命令“pip install requests”或“pip install bs4”或“pip install urllib.parse”进行下载"""

在baidu搜索引擎上获取请求相应网页资源时,需要的部分请求头信息

注意:在进行子域名搜集之前,请确保已登录百度,否则获取的cookie不起作用,其他搜索引擎同理
未登录时的界面
未登录的界面
获取无效cookie的运行结果
未登录时用获取的无效cookie定义请求头得到的响应内容
未登录时获取无效cookie来定义请求头,得到的响应内容为“百度安全验证”与“网络不给力,请稍后重试”、“返回首页”、“问题反馈”
出现此问题也还可能是请求头定义不完善被反爬了,从网上搜索的资料看大多是因为请求头缺少“Accept”
已登录后的界面
已登录的界面

python爬虫需要定义请求头以绕过反扒机制,而定义请求头信息需从一下几步获取
  1. 进入百度搜索引擎首页,输入:site:baidu.com,这里以火狐浏览器为例
    百度搜索引擎首页
    搜索baidu.com下的子域名
  2. 按F12键进入开发者工具=》点击网络项=》Ctrl+R更新

    从消息头获取请求URL
    从请求头获取Cookie
    从请求头获取User-Agent
  3. 查看子域名收集返回网页的网页源码,找出子域名所在的标签和书写格式,以便于编写代码获取
  4. 代码编写
    #定义baidu搜索引擎的子域名搜集功能的函数
def baidu_search():    Subdomain2 = []            #定义一个空列表用于存储收集到的子域名    #定义请求头,绕过反爬机制    hearders = {       'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0',       'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',       'referer':'',         #该请求没有来源网页可不填       'cookie':'BAIDUID=23891A85BA85C16E5C9B5560154BA69C:FG=1; BIDUPSID=B6A72EB557B74FFA3D56BB80DB603C2C; PSTM=1663062807; BD_UPN=13314752; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BA_HECTOR=alal2001850g8l81252h8aqu1hi0t9e18; ZFY=SEUInM0ZuRBXFZUw1B0dlkNP:BZj3M:BZlpxlcZfdCgw8:C; BD_HOME=1; H_PS_PSSID=36558_37117_37354_37300_36885_34812_36802_36789_37145_37258_26350_37364; delPer=0; BD_CK_SAM=1; PSINO=7; BDRCVFR[Fc9oatPmwxn]=aeXf-1x8UdYcs; BDUSS=Zpc0MwUDE5bTZ4dUdQcUIxM2Z1SnFZMEpvUGpxTlRBWTBaTjZVdlh1V0tDRWxqRVFBQUFBJCQAAAAAAQAAAAEAAACnhFosAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIp7IWOKeyFjUD; H_PS_645EC=18db%2FxuyDIkSXG5WHmpOcEYdpAWQjJ77VSAYXPxhCINzCpt3nIF4SZssA6n9ATbCjzGM; BDSVRTM=247; baikeVisitId=e2c826a7-6934-4751-ac3d-29e118347887'    }    #定义请求url    url = "https://www.baidu.com/s?wd=site:baidu.com&rsv_spt=1&rsv_iqid=0xce93ba97000245cf&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=monline_3_dg&rsv_enter=1&rsv_dl=tb&rsv_sug3=16&rsv_sug1=17&rsv_sug7=101&rsv_sug2=0&rsv_btype=t&inputT=175341&rsv_sug4=175341"    resp = requests.get(url,headers=hearders)           #访问url,获取网页源码    #print(resp.content.decode())等价于print(soup),变量soup在下面定义,是解析过的网页内容    soup = BeautifulSoup(resp.content,'html.parser')    #创建一个BeautifulSoup对象,第一个参数是网页源码,第二个参数是Beautiful Soup 使用的 HTML 解析器,    #print(soup)    job_bt = soup.find_all('div',class_="result c-container xpath-log new-pmd")                        #find_all()查找源码中所有
标签的内容 for i in job_bt: #遍历获取的标签 link = i.get('mu') #获取属性mu的值 #urlparse是一个解析url的工具,scheme获取url的协议名,netloc获取url的网络位置 domain = str(urlparse(link).scheme + "://" + urlparse(link).netloc) if domain in Subdomain2: #如果解析后的domain存在于Subdomain2中则跳过,否则将domain存入子域名表中 pass else: Subdomain2.append(domain) print(domain)#调用函数baidu_search()baidu_search()
  1. 运行结果

  2. 优化:给获取的子域名添加描述
    查看网页源码,找到子域名描述的位置
    子域名的描述为与子域名同标签下的标签的“标题”

#子域名的描述在标签
下的标签
下的标签

下的标签的“标题”中

#获取标签“"的“标题”的方法为get_text()

代码

      for i in job_bt:                 #遍历获取的标签        link = i.get('mu')           #获取属性mu的值                #获取子域名的描述,注意:变量的命名不可与关键字、方法名等重叠,否则会报错:"str" object is not callable         string=i.find('div',class_="c-container").find('h3').find('a').get_text()   #urlparse是一个解析url的工具,scheme获取url的协议名,netloc获取url的网络位置        domain = str(urlparse(link).scheme + "://" + urlparse(link).netloc)        if domain in Subdomain2:              #如果解析后的domain存在于Subdomain2中则跳过,否则将domain存入子域名表中            pass        else:            Subdomain2.append(domain)            print(domain+'\t'+string)  #输出进行字符串拼接

运行结果:

来源地址:https://blog.csdn.net/qq_53184526/article/details/126853601

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python爬虫获取子域名以及对“百度安全验证”问题的解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录