m0_57965808 2021-10-24 18:32 采纳率: 90.9%
浏览 17
已结题

爬虫遇到了自己打开无关网页的网站

背景 爬取某文库
问题:他自己会在我爬取几个页面之后自动打开一个无关页面,导致程序报错。
代码如下:

from selenium import webdriver
import time
global pages#全局变量。如果可以的话希望能换个地方呆着。全局变量的写法,先后顺序
pages=set()#一万个页面的储存体
driver = webdriver.Chrome()
driver.get('https://snail.baidu.com/ndyanbao/browse/index#/search')
#print(driver.current_url)#打印当前的url
time.sleep(5)
i=0
while i < 1000:
  i=i+1
  elements = driver.find_elements_by_class_name('report-title')  # 第一层的标题的按钮
  for element in elements:
    element.click()#可以先把链接存起来,也可以直接开始:它本身的文本内容以及页面内的其他文章链接
    hand = driver.window_handles  # 获取当前的所有句柄
    driver.switch_to.window(hand[-1])   # 转换窗口至最高的句柄
    dlans = driver.find_elements_by_xpath('//*[@id="view-app"]/div[3]/div/div[3]')#登录观看
    if dlans :#登录按钮存在时
        dlan = dlans[0]
        driver.execute_script("arguments[0].click();", dlan)
        time.sleep(5)
        yhm = driver.find_elements_by_css_selector('#TANGRAM__PSP_11__footerULoginBtn')  # 用户名登录
        yhmd = yhm[0]
        yhmd.click()
        yh = driver.find_elements_by_css_selector('#TANGRAM__PSP_11__userName')  # 用户名
        yh = yh[0]
        yh.send_keys('用户名')
        mm = driver.find_elements_by_css_selector('#TANGRAM__PSP_11__password')  # 密码
        mm = mm[0]
        mm.send_keys('密码')
        dl = driver.find_elements_by_css_selector('#TANGRAM__PSP_11__submit')  # 点击登录按钮
        dl = dl[0]
        dl.click()
        time.sleep(10)
        xt = driver.find_elements_by_class_name('reader-word-layer')  # 爬取文章内容#加入百度文库4的代码
        xt2 = [str(i.text) for i in xt]
        print(''.join(xt2))  # 后期改为TXT。join列表方法
        wz = driver.current_url  # 当前的url
        pages.add(wz)  # 将第一层的10000个页面全部存进pages中,方便后面判断
        time.sleep(5)
        # driver.quit()#如何关闭子页面呢?
        hand = driver.window_handles  # 获取当前的所有句柄
        driver.switch_to.window(hand[0])  # 转换原始页面
    else:#登录按钮不存在
        time.sleep(10)
        print('吾皇万岁万岁万万岁')
        xt = driver.find_elements_by_class_name('reader-word-layer')  # 爬取文章内容#加入百度文库4的代码
        xt2 = [str(i.text) for i in xt]
        print(''.join(xt2))  # 后期改为TXT。join列表方法
        wz = driver.current_url  # 当前的url
        pages.add(wz)  # 将第一层的10000个页面全部存进pages中,方便后面判断
        time.sleep(5)
        hand = driver.window_handles  # 获取当前的所有句柄
        driver.switch_to.window(hand[0])  # 转换原始页面
  nps= driver.find_elements_by_class_name('el-icon.el-icon-arrow-right')  #下一页按钮
  for np in nps:
    np.click()
else:
    for page in pages:#第一层以及后边几层的网址
      driver.get('page')
      qts=driver.find_elements_by_class_name('doc-title')#当前页面中含有的的其他文本的按钮.准备进入第二层
      for qt in qts:#当前页面内可操作的文本标题
        qt.click()#之后要在其他页面上重复操作。进入第二层
        hand = driver.window_handles  # 获取当前的所有句柄
        driver.switch_to.window(hand[1])  # 转换窗口至最高的句柄
        ht = driver.current_url#获得他们的URL
        time.sleep(30)
        LD = driver.find_elements_by_class_name('btn login-btn')  # 登录观看
        if LD :
            ld = LD[0]
            ld.click()
            yhm = driver.find_elements_by_css_selector('#TANGRAM__PSP_11__footerULoginBtn')  # 用户名登录
            yhmd = yhm[0]
            yhmd.click()
            yh = driver.find_elements_by_css_selector('#TANGRAM__PSP_11__userName')  # 用户名
            yh = yh[0]
            yh.send_keys('用户名')
            mm = driver.find_elements_by_css_selector('#TANGRAM__PSP_11__password')  # 密码
            mm = mm[0]
            mm.send_keys('密码')
            dl = driver.find_elements_by_css_selector('#TANGRAM__PSP_11__submit')  # 点击登录按钮
            dl = dl[0]
            dl.click()
            time.sleep(10)
            xt = driver.find_elements_by_class_name('reader-word-layer')  # 爬取文章内容#加入百度文库4的代码
            xt2 = [str(i.text) for i in xt]
            print(''.join(xt2))  # 后期改为TXT。join列表方法
            wz = driver.current_url  # 当前的url
            time.sleep(10)
            pages.add(wz)  # 将第一层的10000个页面全部存进pages中
            time.sleep(5)
            # driver.quit()
            if ht not in pages:
                pages.add(ht)
            # driver.quit()
        else:
            time.sleep(10)
            xt = driver.find_elements_by_class_name('reader-word-layer')  # 爬取文章内容#加入百度文库4的代码
            xt2 = [str(i.text) for i in xt]
            print(''.join(xt2))  # 后期改为TXT。join列表方法
            wz = driver.current_url  # 当前的url
            time.sleep(10)
            pages.add(wz)  # 将第一层的10000个页面全部存进pages中
            time.sleep(5)
            # driver.quit()
            if ht not in pages:
                pages.add(ht)
            # driver.quit()
 
 

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月1日
    • 创建了问题 10月24日

    悬赏问题

    • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号
    • ¥50 安装pyaudiokits失败
    • ¥15 计组这些题应该咋做呀
    • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?