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');

 

Selenium是一个自动化测试工具,可以模拟用户对网页的操作,因此可以用来爬取百度文库的图片。在这个过程中,我们需要用到PythonSelenium库,以及ChromeDriver或者其他浏览器驱动来控制浏览器。 首先,我们需要打开百度文库的页面,并登录账号,如果不登录无法访问文库的图片。我们可以用Selenium模拟登录,输入账户名和密码,然后点击登录。在登录成功的情况下,我们就可以访问文库的内容。 接着,我们需要定位到文库页面中的所需要的图片。这一步可以通过XPath或CSS Selector等方式来实现。然后,我们可以用Selenium的find_element_by_xpath或者find_element_by_css_selector方法来定位图片,并获取图片的属性,比如图片的URL。通过获取URL,我们就可以将图片保存到本地或者上传到其他网站当中。 下面是一个比较简单的爬取百度文库图片的代码段: ```python from selenium import webdriver import urllib.request # 设置ChromeDriver路径 driver_path = 'C:\chromedriver_win32\chromedriver.exe' # 创建浏览器对象 browser = webdriver.Chrome(driver_path) # 打开百度文库登录界面 browser.get('https://wenku.baidu.com/') # 输入账户名和密码并点击登录 browser.find_element_by_id('loginUserName').send_keys('your_username') browser.find_element_by_id('loginPassword').send_keys('your_password') browser.find_element_by_link_text('登录').click() # 定位到图片 image = browser.find_element_by_xpath('//img[@class="doc-image"]') # 获取图片URL image_url = image.get_attribute('src') # 下载图片 urllib.request.urlretrieve(image_url, 'image.jpg') # 关闭浏览器 browser.quit() ``` 上面的代码中,我们首先设置了ChromeDriver的路径,然后打开浏览器并访问百度文库的登录页面。接着,输入账户名和密码,并点击登录按钮。在登录成功后,我们定位到文库页面中的图片,获取图片的URL并下载图片到本地。 总的来说,使用Selenium爬取百度文库图片比较简单,只需要模拟登录和定位图片等操作即可。不过需要注意的是,在爬取数据的过程中不要过于频繁,否则会被百度封禁。建议设置合理的时间间隔和获取数据数量,并且遵守网站的使用规定。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值