python爬⾍--【百度知道】⾃动答题
做的第⼀个python爬⾍类项⽬,刚开始学,如有错误,指出⽆妨
百度知道⾃动答题
功能
访问,我们会看到有很多新的提问。
其实很多提问已经有⼈做了解释或者⽹上可以到现成的答案。
因此,⼀⽅⾯,满⾜那些提问题的⼈的需要,另⼀⽅⾯,⾃⼰使⽤python练练⼿。
项⽬的主要功能就是:对于百度知道⾥⾯的新问题,程序会在⽹页上去搜索,寻最佳答案。如果有,则回答他;如果没有,那就跳过。
实现思路
1. 在上获取问题列表,得到的全部问题的地址链接,然后遍历访问这些链接,依次进⼊问题的详情页。
2. 在问题详情页获取问题题⽬,题⽬是⽤于搜索相关的答案
3. 搜索答案的地址链接都是固定的,只要替换地址中word后⾯的内容即可搜索相关的答案。
4. 得到搜索结果后,获取答案列表的地址并遍历访问即可进⼊答案详情页,如果答案详情页⾥⾯有最佳答案就会获取答案内容,并且终
⽌答案列表的遍历。
5. 将得到的答案写回到问题详情页的回答⽂本框并单击提交回答按钮即可完成答题。
注意:整个项⽬在实现过程中是⽤户已登录的情况下去执⾏的,百度最近的登录验证是滑动使图⽚变正,⽬前我还没有搞完它,因此获取cookie,登录的内容是⼿动的。
具体实现步骤
获取cookie,使⽤cookie登录的内容
from selenium import webdriver
import json,time
driver = webdriver.Chrome()
<('baidu/')
driver.find_element_by_xpath('//*[@id="u1"]/a[7]').click()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]').click()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__userName"]').send_keys('XXX')
driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__password"]').send_keys('XXXXX')
driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__submit"]').click()
time.sleep(30)
cookies = _cookies()
f1 =open('','w')
f1.write(json.dumps(cookies))
f1.close()
如上,XXXX分别是你⾃⼰的百度账号和密码。当运⾏这段程序时,会弹出⼀个页⾯。登录时百度会验证,或者是短信验证码或者是滑动滑块等等,这⼀步是⼿动操作,操作完之后,程序会⾃动保存你的账号和密码在浏览器上的cookie值。⽤于下次登录。
得到⽤户的登录信息,接下来实现⾃动答题。整个答题过程⼀共涉及4个⽹页:百度知道问题列表页、百度知道问题详情页、答案搜索页和答案详情页。
在问题列表页中,每条问题的HTML代码是由标签 < a> ⽣成,并且属性 class 的属性值为 title-link,如下图,因此 selenium 可以对属性 class 进⾏定位,获取全部问题所在的标签 < a>,遍历这些标签提取相应的链接地址。
- 在新的窗⼝访问每条问题链接,这些链接会进⼊相应的问题详情页。在问题详情页中,⾸先判断问题是否已被抢答,如果尚未回答,程序根据题⽬去百度知道搜索相关的答案,在这些相关的答案中到最佳答案,然后写⼊问题答案输⼊框⾥并单击“提交回答”按钮;
如果问题已被回答,程序就关闭当前窗⼝,回到问题列表执⾏下⼀个问题。问题详情页的答案输⼊框和“提交回答”按钮的HTML代码如下图所⽰。
- 回答问题的过程中涉及到两个新的⽹页:答案搜索页和答案详情页。答案搜索页是根据问题在新的窗⼝中搜索相关答案,每个答案的链接以标签< dt> 表⽰,该标签下含有标签 < a>。将selenium 定位到每个答案的的标签< a>,在获取 href 属性值,该属性值⽤于进⼊答案详情页。
将答案详情页的链接在新的窗⼝⾥访问,每个答案详情页都不⼀定有最佳答案,根据分析可知,最佳答案的class 属性值为 best-text mb-10,如果 selenium 能对属性 class 进⾏定位,则说明当前答案详情页有最佳答案,反之则⽆。
根据上述的元素定位以及答题的业务逻辑,整个答题程序需要注意每个页⾯窗⼝之间的切换,如果窗⼝的切换逻辑不严谨,很容易导致程序出错。此外还需要考虑⼀些异常的情况出现,⽐如问题搜不到答案、问题已被回答以及⽹络延时响应等⼀些特殊情况。综合分析,⾃动答题的代码如下:
from selenium import webdriver
from selenium import webdriver
import json,time
url ='zhidao.baidu/list?cid=110'
driver = webdriver.Chrome()
<(url)
# 使⽤cookie 登录
driver.delete_all_cookies()
f1 =open('')
cookie = json.ad())
f1.close()
for c in cookie:
driver.add_cookie(c)
title_link = driver.find_elements_by_class_name('title-link')
print(title_link)
time.sleep(5)
for i in title_link:
# 打开问题详情页并切换窗⼝
driver.switch_to.window(driver.window_handles[0])
href = i.get_attribute('href')
time.sleep(5)
driver.switch_to.window(driver.window_handles[1])
try:
# 查iframe,判断问题是否已被回答
driver.find_element_by_id('ueditor_0')
# 获取问题题⽬并搜索答案
title = driver.find_element_by_class_name('ask-title ').text
title_url ='zhidao.baidu/search?&word='+ title
js ='window.open("%s");'%(title_url)
time.sleep(5)
driver.switch_to.window(driver.window_handles[2])
# 获取答案列表
answer_list = driver.find_elements_by_class_name('dt,mb-4,line') for k in answer_list:
# 打开答案详情页
href = k.find_element_by_tag_name('a').get_attribute('href')
time.sleep(5)
driver.switch_to.window(driver.window_handles[3])
# 获取最佳答案
try:
text = driver.find_element_by_class_name('best-text,mb-10').text except:
text =''
finally:
# 关闭答案详情页的窗⼝
driver.close()
# 答案不为空
if text:
# 关闭答案列表页的窗⼝
driver.switch_to.window(driver.window_handles[2])
driver.close()
# 将答案写在问题回答⽂本框上并提交答案按钮
selenium获取cookie
driver.switch_to.window(driver.window_handles[1])
driver.switch_to.frame('ueditor_0')
driver.find_element_by_xpath('/html/body').click()
driver.find_element_by_xpath('/html/body').send_keys(text)
# 跳回到⽹页的HTML
driver.switch_to.default_content()
# 单机提交回答按钮
driver.find_element_by_xpath('//*[@id="answer-editor"]/div[2]/a').click()                time.sleep(5)
time.sleep(5)
# 关闭问题详情页的窗⼝
driver.switch_to.window(driver.window_handles[1])
driver.close()
break
except  Exception as err:
# 除了问题列表页,关闭其他窗⼝
all_handles = driver.window_handles
for i, v in enumerate(all_handles):
if i !=0:
driver.switch_to.window(v)
driver.close()
driver.switch_to.window(driver.window_handles[0])
print(err)
项⽬的githup地址:github/zhangyi-135********/Baidu-Knows-Automatic-answer/tree/master 如果需要交流,欢迎交流。QQ:1251108673

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。