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

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条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

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

      悬赏问题

      • ¥15 js 使用contenteditable属性模拟富文本框的时候如何定位光标到指定位置
      • ¥15 怎么激活组态王的Touchvew菜单和Touchmak 菜单
      • ¥15 Meta分析中,如何在只有样本量的情况下用cma处理效应量r值。
      • ¥15 关于#OpenCV#的问题,如何解决?(语言-qt|开发工具-visual studio)
      • ¥15 centos环境中引入jsoncpp后,编译工程报错,找不到基本库。
      • ¥15 vue3为什么请求在这边获取不到数据呢(关键词-select)
      • ¥20 Multisim仿真设计三路智力抢答装置
      • ¥15 用UML制作简单的语音计算机
      • ¥20 用socket实现ping遇到的问题
      • ¥15 综合的类,这个类里面里面又有构造方法,重载方法,有继承,有重写,有接口