如果没有百度账号,需要使用手机号注册,建议使用小号,百度的产品指不定就封号。完成用户注册之后,我们进入百度答题网页,该网页是显示某个分类的问题列表,每条问题代表一条连接,单击即可进入问题详情页。

在问题详情页,我们需要根据题目搜索正确答案,然后将答案写到问题详情页的回答文本框里,最后单击提交回答按钮即可实现答题。首先获取问题详情页的题目,然后根据题目搜索答案,在答案列表页中逐一访问每个答案的链接,在答案详情页中获取合理的答案,最后将答案写回到问题详情页中。

整个项目可以分为5个步骤来实现,每个步骤具体说明如下:

(1)在https://zhidao.baidu.com/list?cid=110上获取问题列表,得到全部问题的地址链接,然后遍历访问这些链接,依次进入问题的详情页。

(2)在问题详情页获取问题题目,题目是用于搜索相关的答案。

(3)搜索答案的地址链接都是固定的,只要替换地址中wd后面的内容即可搜索相关的答案。

(4)得到搜索结果后,获取答案列表的地址并遍历访问即可进入答案详情页,如果答案详情页里面有最佳答案就会获取答案内容,并且终止答案列表的遍历。

(5)将得到的答案写回到问题详情页的回答文本框并单击提交回答按钮即可完成答题。

整个项目在实现过程中是在用户已登录的情况下执行,如果使用百度的账号密码去执行用户登录,就会遇到手机验证码或图片验证码。用户登录后,网站会一直保持用户的登录状态,不管用户是否重启浏览器,只要访问百度网址,用户登录信息就会显示出来。利用用户登录的状态,Selenium可以模拟用户登录并将用户登录后的Cookies保存下来,在下次登录的时候,直接读取并操控Cookies即可完成用户登录。功能代码如下:

from selenium import webdriver

import time, json,re

from urllib.parse import quote

def get_cookies():

# 百度登录用户并保存Cookies

driver=webdriver.Chrome()

driver.get('https://www.baidu.com/')

driver.find_element_by_xpath('//*[@id="u1"]/a[2]').click()

time.sleep(3)

driver.find_element_by_id('TANGRAM__PSP_11__footerULoginBtn').click()

time.sleep(3)

# 设置用户名和密码

driver.find_element_by_id('TANGRAM__PSP_11__userName').send_keys('用户名')

driver.find_element_by_id('TANGRAM__PSP_11__password').send_keys('密码')

driver.find_element_by_id('TANGRAM__PSP_11__submit').click()

time.sleep(3)

cookies=json.dumps(driver.get_cookies())

dic_cookie = re.sub('"expiry":.*?,', '', cookies) # 剔除过期时间的属性

with open('./baidu_cookies.txt','w',encoding='utf-8') as f:

f.write(dic_cookie)

driver.refresh()

#get_cookies()

百度目前使用的是图片旋转的验证,等待一定的时间手动旋转,成功之后就会将已登录的cookies保存在本地。频繁操作会出现手机验证码,频繁发送验证码也不行,需要注意。

得到用户的登录信息,接下来实现自动答题。整个答题过程一共涉及4个网页:百度知道问题列表页、百度知道问题详情页、答案搜索页和答案详情页。

在问题列表页中,每条问题的HTML代码是由a标签生成,并且属性class的属性值为title-link,。因此Selenium可以对属性class进行定位,获取全部问题所在的标签a,遍历这些标签提取相应的链接地址。

在新的窗口访问每条问题链接,这些链接会进入相应的问题详情页。在问题详情页中,首先判断问题是否已被抢答,如果尚未被回答,程序根据题目去百度知道搜索相关的答案,在这些相关答案中找到最佳答案,然后写入问题答案输入框里并单击“提交回答”按钮;如果问题已被回答,程序就关闭当前窗口,回到问题列表执行下一个问题。

回答问题的过程中涉及到两个新的网页:答案搜索页和答案详情页。答案搜索页是根据问题在新的窗口中搜索相关答案。

将答案详情页的链接在新的窗口里访问,每个答案详情页都不一定有最佳答案,根据分析可知,最佳答案的class属性值为best-text mb-10,如果Selenium能对属性class进行定位,则说明当前答案详情页有最佳答案,反之则无。

def operation():

driver=webdriver.Chrome()

driver.get('https://zhidao.baidu.com/list?cid=110')

driver.maximize_window()

# 使用Cookies登录

driver.delete_all_cookies()

with open('./baidu_cookies.txt','r',encoding='utf-8') as f:

cookies=json.loads(f.read())

for i in cookies:

driver.add_cookie(i)

driver.refresh()

# 获取问题列表

title_link=driver.find_elements_by_class_name('title-link')

for a in title_link:

# 打开问题详情页并且切换窗口

driver.switch_to.window(driver.window_handles[0])

time.sleep(2)

href_detail=a.get_attribute('href')

driver.execute_script('window.open("%s");' % href_detail)

driver.switch_to.window(driver.window_handles[1])

time.sleep(5)

try:

# 问题没有被回答会存在iframe

driver.find_element_by_id('ueditor_0')

except Exception as e:

driver.close()

# 获取问题题目并且搜索答案

try:

title=driver.find_element_by_class_name('ask-title').text

title_url='https://www.baidu.com/s?wd={0}?&ie=utf-8'.format(quote(title))

js='window.open("%s");' % title_url

driver.execute_script(js)

time.sleep(4)

driver.switch_to.window(driver.window_handles[2])

# 获取答案列表

answ_list=driver.find_elements_by_class_name('t')

for k in answ_list:

# 打开答案详情页

href=k.find_element_by_tag_name('a').get_attribute('href')

driver.execute_script('window.open("%s")' % href)

time.sleep(4)

driver.switch_to.window(driver.window_handles[3])

time.sleep(3)

# 获取最佳答案

try:

texts=driver.find_element_by_xpath('//*[contains(@id,"best-content")]').text

except:

texts=''

finally:

# 关闭答案详情页

driver.close()

driver.switch_to.window(driver.window_handles[2])

#答案不能为空

if texts:

print(texts)

# 关闭答案列表页窗口

driver.switch_to.window(driver.window_handles[2])

driver.close()

# 将答案写在问题回答文本框并提交

driver.switch_to.window(driver.window_handles[1])

time.sleep(3)

driver.switch_to.frame('ueditor_0')

driver.find_element_by_xpath('/html/body').click()

driver.find_element_by_xpath('/html/body').send_keys(texts)

# 调回到网页的HTML

driver.switch_to.default_content()

# 单击提交按钮

driver.find_element_by_xpath('/html/body/div[5]/div/section/article/div[1]/div[3]/div[2]/div[2]/a').click()

time.sleep(5)

# 关闭问题详情页

driver.switch_to.window(driver.window_handles[1])

driver.close()

break

all_handles = driver.window_handles

for b, c in enumerate(all_handles):

if b != 0:

driver.switch_to.window(c)

driver.close()

driver.switch_to.window(driver.window_handles[0])

except Exception as e:

# 除了问题列表,关闭其他窗口

all_handles=driver.window_handles

for b,c in enumerate(all_handles):

if b !=0:

driver.switch_to.window(c)

driver.close()

driver.switch_to.window(driver.window_handles[0])

print(e)

operation()

代码主要是联系一下Selenium的自动化使用,具体实践不可行。具体就是,如果在搜索出来的列表中找到了最佳答案,那么会填入答案,并提交,这里提交的答案,百度会进行检测是否合法,如果不合法就提交不了,selenim的send_keys发送长文本会隔行,百度会检测到,所以提交不了。如果在答案列表中没有找到最佳答案,那么就会更换问题回答,所以说想要实现完美的自动化,还是比较繁琐的!

未经允许不得转载:作者:鳄鱼君,

转载或复制请以 超链接形式 并注明出处 鳄鱼君。

原文地址:《Selenium实现百度自动答题 懒人获取积分》 发布于2020-06-06

python根据题库答案自动答题_Selenium实现百度自动答题 懒人获取积分相关推荐

  1. python根据题库答案自动答题_python实现百万答题自动百度搜索答案

    用python搭建百万答题.自动百度搜索答案. 使用平台 windows7 python3.6 MIX2手机 代码原理 手机屏幕内容同步到pc端 对问题截图 对截图文字分析 用浏览器自动搜索文本 使用 ...

  2. 网页自动获取题目匹配题库答案填充(原创1.0)

    /***欢迎使用网页自动获取题目匹配题库答案填充(原创1.0)**1.可手动添加本地题库,一键复制,无序key自动匹配,2.通过调试可获取相应div类下的值/元素3.遍历实现多选,可在console中 ...

  3. python每隔一段时间保存网页内容_利用Python轻松爬取网页题库答案!教孩子不怕尴尬了!...

    大家有没有遇到这种令人尴尬的情况:"好不容易在网上找到需要的资源数据,可是不容易下载下来!"如果是通过一页一页的粘贴复制来下载,真的让人难以忍受,特别是像我这种急性子,真得会让人窒 ...

  4. 专技天下河北省2016年专业技术人员继续教育公需科目题库答案(答题器)

    专技天下河北省2016年专业技术人员继续教育公需科目题库答案(答题器) 科目包括河北省专业技术人员公需科目继续教育的必修的三门<当代科学技术新知识读本(一)>.<专业技术人员知识创造 ...

  5. python爬取学校题库_利用Python轻松爬取网页题库答案!教孩子不怕尴尬了!

    大家有没有遇到这种令人尴尬的情况:"好不容易在网上找到需要的资源数据,可是不容易下载下来!"如果是通过一页一页的粘贴复制来下载,真的让人难以忍受,特别是像我这种急性子,真得会让人窒 ...

  6. python编程题-python编程题库

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 上期题目连接:1000道python题库系列分享十一(9道)上期题目答案:? 本期 ...

  7. python程序设计题库-python编程题库

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 上期题目连接:1000道python题库系列分享十一(9道)上期题目答案 ...

  8. python 入门题库————python语句和基础数理

    python 入门题库 python 题库 Python使用符号_______表示注释 Python不支持的数据类型有 查看python版本的命令是 在Python中,print(type(16/4) ...

  9. Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程

    Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...

  10. 全国计算机等级考试二级Python精品题库学习笔记1

    全国计算机等级考试二级Python精品题库学习笔记1 精品试卷01 精品试卷01程序题 基本操作题 2:随机验证码 基本操作题 3:比赛成绩计算 Turtle 绘图题:同心圆 简单应用题 2:员工工资 ...

最新文章

  1. Oracle学习笔记整理手册
  2. eclipse 环境下整合 struts2+spring+hibernate 开发web应用常见问题及解答
  3. 真正拉开人与人之间的差距是什么?
  4. Java:comp/env/讲解与JNDI
  5. html 手机访问优化,移动端首屏优化
  6. 谷歌Launchpad Studio瞄准医疗领域,从早期公司吸取行业经验
  7. 串流类(istrstream)输入行为的探讨
  8. java1.6安装_JAVAjdk1.6安装方法
  9. 数学原理(The Principles of Mathmatics)
  10. eclipse格式化代码快捷键
  11. 数字时代的保险创新与升级 | 创新场景50
  12. HTML5多媒体(音频、视频播放)
  13. 【华为OD机试真题 python】数字涂色 【2022 Q4 | 100分】
  14. adjacent_find
  15. PySpark RDD 之collect、 take、top、first取值操作
  16. C#招行支付流程(一网通支付-PC扫码支付)
  17. 山西3件国宝春节期间亮相《国家宝藏》
  18. CSS颜色代码大全及a标签超链接颜色改变
  19. 数据结构-平衡二叉树(AVL树)
  20. unity android解析包失败,打包APK失败。求解释

热门文章

  1. java中的extends与implement
  2. 蚂蚁金服校招一面有感
  3. 当当网注册页面html源代码,当当网HTML源代码
  4. 排列组合计算公式简易版
  5. MySql常用命令集
  6. ico图片格式生成器
  7. 怎样在 iPhone 或 iPad 上使用“快捷指令”?
  8. php投票小程序源码,微信小程序:投票小程序源码
  9. SAP中销售订单中的条件类型修改控制问题配置分析
  10. 掌握TikTok商业化玩法,3大支点撬动亿万级流量市场