Python selenium 爬取百度文库文章

本次所爬取的文章页为https://wk.baidu.com/view/aa452c19647d27284b7351fa?sxts=1543041112658

首先下载需要的库:  selenium,beautifulsoup 关于selenium的中chromedriver的配置安装在我这篇文章可以找到https://mp.csdn.net/postedit/84401460

pip install selenium

pip install beautifulsoup4

 配置ChromeWebdriver用Android模拟访问页面(手机版的页面较为简洁所以模拟手机去爬取页面)并且实例化

options = webdriver.ChromeOptions()
#模拟user-agent请求 本次是用安卓设备进行请求
options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"')
#启动ChromeWebdriver驱动程序
driver = webdriver.Chrome(chrome_options = options)

访问所需要爬取的百度文库地址

url = input("请输入需要爬取的百度文库地址:")
# driver.get('https://wk.baidu.com/view/aa452c19647d27284b7351fa?sxts=1543041112658')
driver.get(url)

我们检查元素 继续阅读 这一块div的构成

如图红框所示 我们获取到继续阅读那一块的div class为foldpagewg-root ,此外我们还要使得滚动条滚动到这个div的上一个元素,确保继续阅读在我们的可见页面中,注意每一步页面的操作,例如滚动操作,点击操作,最好进行休眠以免百度机器检测

#获取继续阅读的元素定位
page = driver.find_elements_by_xpath("//div[@class='foldpagewg-root']")
#拖动到可见的元素
driver.execute_script('arguments[0].scrollIntoView();', page[-1])
#注意每次操作页面元素要进行休眠 防止被机器检测
time.sleep(1)

#获取继续阅读的元素定位 类似于JS里的getElement的感觉
nextpage = driver.find_element_by_xpath("//div[@class='foldpagewg-text-con']")
#点击继续阅读元素
nextpage.click()
time.sleep(1)

点击了继续阅读以后,如果文章内容过多的话可能会有点击加载更多的按钮,我们和上面一样进行相同的处理

这次把div class换成pagerwg-root 然后进行相似的操作 这里就不细细说明了 贴上代码

page = driver.find_elements_by_xpath("//div[@class='pagerwg-root']")
#拖动到可见元素
driver.execute_script('arguments[0].scrollIntoView();', page[-1])
time.sleep(1)
#获取加载更多的元素定位 类似于JS里的getElement的感觉
nextpage = driver.find_element_by_xpath("//div[@class='pagerwg-button']")

我们如何判断点击加载更多这个消失了呢?可以通过判断元素点击时异常来判断是否可以再点击,如果文章没有点击加载更多的按钮,此时进行点击的话就会抛出异常,这时候我们可以认为文章内容以及获取完整。

while(1):
    try:
        nextpage.click()
        time.sleep(1)
    except:
        break

此时我们可以通过selenium下的page_source方法获取当前页面的所有内容 ,然后我们再次检查百度文库页面

我们可以发现所有的文本内容都是在<div class="content singlePage wk-container">下的p标签中的,这时候我们又可以开始操作了,我们可以通过selenium下的page_source方法获取页面的所有内容,然后通过beautifulsoup下的find_all方法找到class是content singlePage wk-container"的所有内容,然后通过  bf2 = BeautifulSoup(str(each_result), 'lxml') 将内容填充为html的页面

此时我们在通过beatifulsoup下的find_all('p')方法把p标签的内容拉出啦,在通过re正则过滤掉html标签就可以完成我们对百度文库的文本内容获取了。此时有的朋友会问,为什么不在获取所有页面的时候通过find_all('p')直接去获取文章内容,而是要通过class为content singlePage wk-container再去获取p标签内容? 因为我们不能判断整个页面的p标签是否只是存在于文本中,如果其他地方例如导航头也有p标签这时候我们就会误拉错误的内容了。

#获取html内容
html = driver.page_source
bf1 = BeautifulSoup(html, 'lxml')
#拉取出class下的文本数据
result = bf1.find_all(class_='content singlePage wk-container')

#打开一个文件 命名为之前定义的网页title 记得设置编码为UTR8 否则会出现乱码
File = open(file_name+'.txt','w',encoding='utf8')
for each_result in result:
     bf2 = BeautifulSoup(str(each_result), 'lxml')
     texts = bf2.find_all('p')
     #获取所有p标签
     for each_text in texts:
        html = BeautifulSoup(str(each_text),'lxml');
        #正则过滤所有的标签
        pat = re.compile('<[^>]+>', re.S)
        content = pat.sub('', str(html))
        #将过滤的内容写入txt中
        File.write(content +'\n');

这里贴上所有的代码,如果有更好的方法或者代码哪里有可优化的地方欢迎进行探讨

from selenium import webdriver
from bs4 import BeautifulSoup
import  re

import time
options = webdriver.ChromeOptions()
#模拟user-agent请求 本次是用安卓设备进行请求
options.add_argument('user-agent="Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"')
#启动ChromeWebdriver驱动程序
driver = webdriver.Chrome(chrome_options = options)

url = input("请输入需要爬取的百度文库地址:")
# driver.get('https://wk.baidu.com/view/aa452c19647d27284b7351fa?sxts=1543041112658')
driver.get(url)

#获取网页的标题 作为文件保存
file_name = driver.title
#获取继续阅读的元素定位
page = driver.find_elements_by_xpath("//div[@class='foldpagewg-root']")
#拖动到可见的元素
driver.execute_script('arguments[0].scrollIntoView();', page[-1])
#注意每次操作页面元素要进行休眠 防止被机器检测
time.sleep(1)

#获取继续阅读的元素定位 类似于JS里的getElement的感觉
nextpage = driver.find_element_by_xpath("//div[@class='foldpagewg-text-con']")
#点击继续阅读元素
nextpage.click()
time.sleep(1)

#跳到加载更多元素div下
page = driver.find_elements_by_xpath("//div[@class='pagerwg-root']")
#拖动到可见元素
driver.execute_script('arguments[0].scrollIntoView();', page[-1])
time.sleep(1)
#获取加载更多的元素定位 类似于JS里的getElement的感觉
nextpage = driver.find_element_by_xpath("//div[@class='pagerwg-button']")
#写一个循环,一直点击继续阅读直到拉取出文章所有内容
#通过点击事件异常来判断是否拉出所有文章所有内容
while(1):
    try:
        nextpage.click()
        time.sleep(1)
    except:
        break

#获取html内容
html = driver.page_source
bf1 = BeautifulSoup(html, 'lxml')
#拉取出class下的文本数据
result = bf1.find_all(class_='content singlePage wk-container')

#打开一个文件 命名为之前定义的网页title 记得设置编码为UTR8 否则会出现乱码
File = open(file_name+'.txt','w',encoding='utf8')
for each_result in result:
     bf2 = BeautifulSoup(str(each_result), 'lxml')
     texts = bf2.find_all('p')
     #获取所有p标签
     for each_text in texts:
        html = BeautifulSoup(str(each_text),'lxml');
        #正则过滤所有的标签
        pat = re.compile('<[^>]+>', re.S)
        a = pat.sub('', str(html))
        #将过滤的内容写入txt中
        File.write(a+'\n');

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值