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

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无关。你想不花钱享受付费服务,这种破解似乎是违法的,谨慎。。
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题