m0_57965808 2021-10-24 09:44 采纳率: 91.2%
浏览 401
已结题

Python selenium的爬虫无法完整爬取整个页面的内容

问题:
1 爬取的内容不完整,在爬取了大部分内容后就又开始爬取另一个页面。
2 页面会自己变成一个VIP充的无关页面,导致报错。这种情况是被反爬了么?
3 有些页面只有VIP才能观看,这样的话还能用selenium爬取么?
代码如下:

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()




  • 写回答

1条回答 默认 最新

  • 江天暮雪丨 2021-10-26 17:39
    关注
    1. 爬取内容不完整,应该是文档的更多内容,要往下滑动页面才会出现
    2. 这个不太清楚,应该不是什么反爬,就是类似于中途给你弹出个广告,要具体分析怎么弄
    3. VIP内容肯定是需要你的账号是VIP才能看得到的,与selenium无关。你想不花钱享受付费服务,这种破解似乎是违法的,谨慎。。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月13日
  • 已采纳回答 11月5日
  • 修改了问题 10月26日
  • 创建了问题 10月24日

悬赏问题

  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题
  • ¥20 基于matlab的航迹融合 航迹关联 航迹插补
  • ¥15 用Matlab实现图中的光线追迹
  • ¥15 联想笔记本开机出现系统更新界面