先说一下可能用到的一些python知识

一、python中使用的是unicode编码, 而日常文本使用各类编码如:gbk utf-8 等等所以使用python进行文字读写操作时候经常会出现各种错误, 一般都是操作时没有进行转码操作.而转码则需要decode(解码)和encode(编码)方法.

如:

str1.decode(‘gbk’), 表示将gbk编码的字符串‘str1’转换成unicode编码.

str2.encode(‘gbk’), 表示将unicode编码的字符串‘str2’转换gbk编码.

二、写入数据的时候报错程序直接停止,这就不得不重视“Python UnicodeEncodeError: 'gbk' codec can't encode character ”解决方法

将网络数据流写入文件时时,我们会遇到几个编码:

1: #encoding='XXX' 这里(也就是python文件第一行的内容)的编码是指该python脚本文件本身的编码,无关紧要。只要XXX和文件本身的编码相同就行了。 比如notepad++ "格式"菜单里面里可以设置各种编码,这时需要保证该菜单里设置的编码和encoding XXX相同就行了,不同的话会报错

2:网络数据流的编码 比如获取网页,那么网络数据流的编码就是网页的编码。需要使用decode解码成unicode编码。

3:目标文件的编码 要将网络数据流的编码写入到新文件,那么我么需要指定新文件的编码。在windows下面,新文件的默认编码是gbk,这样的话,python解释器会用gbk编码去解析我们的网络数据流txt,然而txt此时已经是decode过的unicode编码,这样的话就会导致解析不了,出现上述问题。 解决的办法就是,改变目标文件的编码:

f = open("out.html","w",encoding='utf-8')  

三、pycharm缩进

1、pycharm使多行代码同时缩进、左移

鼠标选中多行代码后,按下Tab键,一次缩进四个字符

2、pycharm使多行代码同时左移

鼠标选中多行代码后,同时按住shift+Tab键,一次左移四个字符

四、time.sleep(t)

参数:t -- 推迟执行的秒数。

五、selenium 元素可以定位到,但是无法点击问题

描述:页面元素可以定位到,但是无法点击click。元素可能被一个透明div覆盖了
解决方案:
1.在执行click之前多休眠几秒
2.确认自己的元素是否定位正确,是否有id,name,class相同的元素,加下划线的是遮挡的div确定它的位置判断他的z_index是否大于你要点击元素的z_index
3.用Enter键代替click

4、将页面拖拽到要点击的元素位置,例如百度文库点击继续阅读展示全部内容(代码如下)

from selenium import webdriver
from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome('D:/chromedriver.exe')
driver.get("https://wenku.baidu.com/view/aa31a84bcf84b9d528ea7a2c.html")
page = driver.find_element_by_xpath("//*[@id='html-reader-go-more']/div[2]/div[1]/span/span[2]")
driver.execute_script('arguments[0].scrollIntoView();', page) #拖动到可见的元素去
driver.find_element_by_xpath("//*[@id='html-reader-go-more']/div[2]/div[1]/p").click()

六、爬取百度文库连接:https://wenku.baidu.com/view/df34290a763231126edb11f9.html

原本我就没有想着要去用自动化工具去爬取,本来想着取用requests模拟请求,顶多就是麻烦一下弄弄js,但是我一看百度文库它的请求头

找这个文件找了半天,主要是它的文字不是连续的,我刚开始大致一看都没有找到。我还以为怎么了(翻车现场)。。。弄了半天可以确定0.png?这样类型的传递的是文库的照片,0.json传递的是文库的文字

但是这个请求头的url太长了,,突然就不想用requests模拟请求了

那就用selenium自动化工具+bs4解析页面,如果没有安装python的selenium库和selenium对应的浏览器驱动可以看一下:安装python的selenium库和驱动

接下来我们把思路和代码说一下

1、首先导入一下需要用到的模块

from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

2、因为这个页面是动态的,我们的selenium检测到浏览器框架之后就会返回源码,但是它不会去检测这个页面的动态加载部分是否加载出来,所以我们需要要求它去检测一下

这两个东西就是表示的是百度文库中文库是第几页,上图表示的是百度文库的第二页的div元素,第三页如下

这样我就可以确定,这个肯定可以作为检测条件

num = input('输入总页数:')
st = "pageNo-"
st_nums = st+str(num) #先构建一下最后一页的属性值

3、使用selenium模拟浏览器,并打开指定网址

browser = webdriver.Chrome("D:\python-senium\chromedriver.exe")#里面传的参数是你selenium驱动所在位置
browser.get('https://wenku.baidu.com/view/df34290a763231126edb11f9.html') #发送请求

4、我们使用selenium中的显示等待,初始化最长等待时间为10s。并等待我们要点击“继续阅读”出现,然后将浏览器页面移动到这里

wait = WebDriverWait(browser,10)
time.sleep(5)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#html-reader-go-more > div.continue-to-read > div.banner-more-btn > span')))#等待条件:找到文库中“继续阅读”字样,并等待其出现
page = browser.find_element_by_xpath("//*[@id='html-reader-go-more']/div[2]/div[1]/span") #找到页面中“继续阅读”所在位置
#js = "document.getElementsByClassName('banner-more-btn').style.visibility='hidden'"
#browser.execute_script(js) #这个js代码是我原来以为是“继续阅读”被一个空的div包裹所以不能点击,然后我尝试把这个div掩盖掉,结果js代码运行失败。。。
browser.execute_script('arguments[0].scrollIntoView();', page) #拖动到可见的元素“继续阅读”去

5、等待“继续阅读”可以点击就点击它,然后等待文库中最后一页也加载出来就返回页面源码

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#html-reader-go-more > div.continue-to-read > div.banner-more-btn > span'))).click()
wait.until(EC.presence_of_element_located((By.ID,st_nums))) #等待文库中最后一页也加载出来
html = browser.page_source

6、我们发现这些文字都被一个class属性值为“ie-fix”所包裹,那我们就把它所包裹的p标签都拿出来

its_p = soup.select(".ie-fix p")

然后对这个列表进行遍历,并输出其中的文本,并写入文件ab.txt中

soup = BeautifulSoup(html,"html.parser")  #使用python内置解析html库
def get_context():
try:
its_p = soup.select(".ie-fix p")
for it_p in its_p:
print(it_p.text,end='')
with open('ab.txt','a',encoding='utf-8') as f:
f.write(it_p.text)
except:
print('出错了') get_context() #调用函数
browser.close() #关闭浏览器

全部代码:

from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time num = input('输入总页数:')
st = "pageNo-"
st_nums = st+str(num)
''''''
browser = webdriver.Chrome("D:\python-senium\chromedriver.exe")
browser.get('https://wenku.baidu.com/view/df34290a763231126edb11f9.html')
wait = WebDriverWait(browser,10)
time.sleep(5)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#html-reader-go-more > div.continue-to-read > div.banner-more-btn > span')))
page = browser.find_element_by_xpath("//*[@id='html-reader-go-more']/div[2]/div[1]/span")
#js = "document.getElementsByClassName('banner-more-btn').style.visibility='hidden'"
#browser.execute_script(js)
browser.execute_script('arguments[0].scrollIntoView();', page) #拖动到可见的元素去
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#html-reader-go-more > div.continue-to-read > div.banner-more-btn > span'))).click()
wait.until(EC.presence_of_element_located((By.ID,st_nums)))
html = browser.page_source soup = BeautifulSoup(html,"html.parser")
def get_context():
try:
its_p = soup.select(".ie-fix p")
for it_p in its_p:
print(it_p.text,end='')
with open('ab.txt','a',encoding='utf-8') as f:
f.write(it_p.text)
except:
print('出错了') get_context()
browser.close()

结果:

缺陷:

这个代码不会去爬取文库中图片信息,所以要是爬取ppt等文库还是不要用了(后面爬ppt的我会再写一篇博客)

提示:

也是后代码会运行出错,主要原因是time.sleep()的时间不够长,可以根据自身情况调整,或者可以多运行几次(如果有其他好的方法可以,希望大佬可以带带我^_^)

python+selenium+bs4爬取百度文库内文字 && selenium 元素可以定位到,但是无法点击问题 && pycharm多行缩进、左移的更多相关文章

  1. python 利用selenium爬取百度文库的word文章

    今天学习如何使用selenium库来爬取百度文库里面的收费的word文档 from selenium import webdriver from selenium.webdriver.common.k ...

  2. Python3实现QQ机器人自动爬取百度文库的搜索结果并发送给好友(主要是爬虫)

    一.效果如下: 二.运行环境: win10系统:python3:PyCharm 三.QQ机器人用的是qqbot模块 用pip安装命令是: pip install qqbot (前提需要有request ...

  3. python+selenium爬取百度文库不能下载的word文档

    有些时候我们需要用到百度文库的某些文章时,却发现需要会员才能下载,很难受,其实我们可以通过爬虫的方式来获取到我们所需要的文本. 工具:python3.7+selenium+任意一款编辑器 前期准备:可 ...

  4. 百度图片爬虫-python版-如何爬取百度图片?

    上一篇我写了如何爬取百度网盘的爬虫,在这里还是重温一下,把链接附上: http://www.cnblogs.com/huangxie/p/5473273.html 这一篇我想写写如何爬取百度图片的爬虫 ...

  5. python+requests爬取百度文库ppt

    实验网站:https://wenku.baidu.com/view/c7752014f18583d04964594d.html 在下面这种类型文件中的请求头的url打开后会得到一个页面 你会得到如下图 ...

  6. python简单爬虫爬取百度百科python词条网页

    目标分析:目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL:/ ...

  7. Python简易爬虫爬取百度贴吧图片

    通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.requ ...

  8. Python协程爬取妹子图(内有福利,你懂得~)

    项目说明: 1.项目介绍   本项目使用Python提供的协程+scrapy中的选择器的使用(相当好用)实现爬取妹子图的(福利图)图片,这个学会了,某榴什么的.pow(2, 10)是吧! 2.用到的知 ...

  9. 【Python】Python简易爬虫爬取百度贴吧图片

    通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.requ ...

随机推荐

  1. 天梯赛练习 L3-008 喊山 (30分) bfs搜索

    题目分析: 本题是一题比较简单的bfs搜索题,首先由于数据给的比较多不能直接开二维数组存放,而是用了vector的动态的二维数组的形式存放,对于每个出发点,我们bfs向四周搜索,标记搜索过的点,遇到搜 ...

  2. SQL注入-流程

    一般注入分类: 时间,布尔,报错,堆,联合 有关函数介绍: current_user() 当前用户名 session_user() 链接数据库的用户名 @@basedir mysql安装路径 @@da ...

  3. Linux 防火墙基于 CentOS7 的防火墙操作命令

    防火墙服务操作命令 重启防火墙 systemctl restart firewalld 查看防火墙状态 systemctl status firewalld 开启.关闭.重启防火墙 # 开启 serv ...

  4. xtrabackup_binlog_info

    文件保存了备份结束时刻binlog的名称和位置

  5. kill 指令的执行原理

    kill 指令有两种写法 " kill query + 线程 id "." kill connection(可缺省) + 线程 id ".分别表示关闭指定线程正 ...

  6. 【Linux】salt的cmd.script命令介绍

    salt是一个很棒的自动化运维工具之一,常用的有cmd.run,今天介绍的是cmd.script 其实一眼就能看出这个命令是执行脚本的命令 具体操作如下: 1.将/etc/salt/master中的 ...

  7. EF Core 6.0的新计划

    今天,我们很兴奋地与你分享Entity Framework Core 6.0的计划. 这个计划汇集了许多人的意见,并概述了我们打算在哪里以及如何优化实体框架(EF Core) 6.0版本.这个计划并不 ...

  8. oracle创建恢复编录(recovery catalog)

    1.在要作为恢复编录的数据库创建用户 create user rman identified by oracle default tablespace system temporary TABLESP ...

  9. Ice系列--基于IceGrid的部署方案

    前言 前一篇文章介绍了IceGrid的简单应用.这篇文章来介绍一下它的高端玩法-如何将模板,复制组,知名对象应用于部署方案及其作用. 基于模板的部署方案 之前介绍了xml格式的配置文件通过各种描述符如 ...

  10. pytorch——预测值转换为概率,单层感知机

    softmax函数,可以将算出来的预测值转换成0-1之间的概率形式 导数的形式 import torch import torch.nn.functional as F x=torch.tensor( ...