Selenium+Phantomjs动态获取CSDN下载资源信息和评论

源代码

# coding=utf-8    from selenium import webdriver    
from selenium.webdriver.common.keys import Keys    
import selenium.webdriver.support.ui as ui    
from selenium.webdriver.common.action_chains import ActionChains    
import time        
import re        
import os    #打开Firefox浏览器 设定等待加载时间 访问URL    
driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")    
driver_detail = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")    
wait = ui.WebDriverWait(driver,10)    
driver.get("http://download.csdn.net/user/eastmount/uploads")    
SUMRESOURCES = 0 #全局变量 记录资源总数(尽量避免)    #获取列表页数 <div class="page_nav>共46个 共8页..</div>    
def getPage():    number = 0    wait.until(lambda driver: driver.find_element_by_xpath("//div[@class='page_nav']"))    texts = driver.find_element_by_xpath("//div[@class='page_nav']").text    print texts    m = re.findall(r'(\w*[0-9]+)\w*',texts) #正则表达式寻找数字    print '页数:' + str(m[1])    return int(m[1])    #获取URL和文章标题     
def getURL_Title(num):    global SUMRESOURCES    url = 'http://download.csdn.net/user/eastmount/uploads/' + str(num)    print unicode('下载列表URL: ' + url,'utf-8')    '''''''  ' 等待最下面页面加载成功 获取URL和标题  ' 源码  ' <div class='list-container mb-bg'>  '     <dl>  '        <dt>  '           <div class="icon"><img src="xxx"></img></div>  '           <h3><a href="/detail/eastmount/8757243">MFC显示BMP图片</a></h3>  '        </dt>  '     </dl>  ' </div>  ' get_attribute('href')获取URL且自动补齐  ' unicode防止报错 - s.encode('utf8')unicode转换成utf8编码 decode表示utf8转换成unicode  '''    driver.get(url)    wait.until(lambda driver: driver.find_element_by_xpath("//div[@class='page_nav']"))    list_container = driver.find_elements_by_xpath("//div[@class='list-container mb-bg']/dl/dt/h3/a")   for title in list_container:    print 'Num' + str(SUMRESOURCES +1)    print u'标题: ' + title.text    print u'链接: ' + title.get_attribute('href')    SUMRESOURCES = SUMRESOURCES +1    #    #获取具体内容和评论    getDetails( str(title.get_attribute('href')) )    else:    print ' ' #换行    #获取详细信息 因前定义的driver正在使用中 故调用driver_detail    
#否则报错 Message: Error Message => 'Element does not exist in cache'    
def getDetails(url):    #获取infobox    driver_detail.get(url)    details = driver_detail.find_element_by_xpath("//div[@class='info']").text    print details    #加载评论 <dl><dt></dt><dd></dd></dl>    comments = driver_detail.find_elements_by_xpath("//dl[@class='recom_list']/dd")    for com in comments:    print u'评论:' + com.text    else:    print ' ' #换行    #主函数    
def main():    start = time.clock()    pageNum = getPage()    i=1    #循环获取标题和URL    while(i<=pageNum):    getURL_Title(i)     i = i + 1    else:    print 'SUmResouces: ' + str(SUMRESOURCES)    print 'Load Over'    end = time.clock()    print "Time: %f s" % (end - start)    main()  

代码实现步骤

        1.首先获取页面总数,通过getPage()函数实现;
        2.每个页面有一列资源,通过driver的find_element_by_xpath()路径获取标题和get_attribute('href')函数获取URL,它会自动补齐链接;
        3.根据步骤2获取资源的URL,去到具体资源获取消息框和评论信息;

        4.由于采用Phantomjs无界面浏览器加载页面,故获取class=info和recom_list的div即可。

 

运行结果

        运行结果如下图所示:


 

程序分析

        首先获取如下图所示的页面总数,此时为“8”页。它通过如下代码实现:
       

 texts = driver.find_element_by_xpath("//div[@class='page_nav']").text


        然后再while(i<=8)依次遍历每页的资源,每页资源的URL链接为:
        
http://download.csdn.net/user/eastmount/uploads/8

        再获取每页所有资源的标题及URL,通过代码如下:
 

list_container = driver.find_elements_by_xpath("//div[@class='list-container mb-bg']/dl/dt/h3/a")    
for title in list_container:    print 'Num' + str(SUMRESOURCES +1)    print u'标题: ' + title.text    print u'链接: ' + title.get_attribute('href')    

        其中对应的源码如下所示,通过获取find_elements_by_xpath()获取多个元素,其div的class='list-container mb-bg',同时路径为<div><dl><dt><h3><a>即可。同时自动补齐URL,如:
        <a href='/detail/eastmount/6917799'会添加“http://download.csdn.net/”。

        最后在进入具体的资源获取相应的消息盒InfoBox和评论信息,由于通过模拟Phantomjs浏览器直接可以显示动态JS评论信息。


        而如果通过BeautifulSoup只能获取的HTML源码如下,并没有JS信息。因为它是动态加载的,这就体现了Phantomjs的优势。而通过Chrome或FireFox浏览器审查元素能查看具体的评论div,这也是模拟浏览器的用处所在吧!

<div class="section-list panel panel-default">    <div class="panel-heading">    <h3 class="panel-title">资源评论</h3>    </div>    <!-- recommand -->    <script language='JavaScript' defer type='text/javascript' src='/js/comment.js'></script>    <div class="recommand download_comment panel-body" sourceid="8772951"></div>    
</div>  

总结

        这篇文章主要讲述通过Selenium和Phantomjs获取CSDN下载资源信息的过程,其中由于driver调用Chrome或FireFox浏览器总会有额外空间增加,故调用Phantomjs无界面浏览器完成。同时有几个问题:
            1.如何避免Phantomjs的黑框弹出;
            2.程序的运行时间比较低,响应时间较慢,如何提高?
        接下来如果有机会准备尝试的内容包括:
            1.下载百度百科的旅游地点InfoBox(毕设知识图谱挖掘);
            2.如何爬取搜狐图片的动态加载图片,完成智能爬图工具;
            3.当需要自动登录时driver访问Chrome或FireFox浏览器发送消息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享好用的Cloudflare测速文件

引言 有时候我们想测试一下自己的带宽&#xff0c;或者梯子的速度。又或者我们想看看我们服务器的速度到底有多快&#xff1f;那么就需要一个大文件来支撑我们进行这样的测试。 而这样的测速文件需要有两个特性&#xff1a; 不受速率限制&#xff0c;也就是说能把你的带宽拉…

登录系统的时候账号和密码加密传输

1、登录系统的时候账号和密码加密传输&#xff0c;前端解密&#xff0c;后端解密 2、前端点击登录按钮的执行方法 function loginSubmit() {//先把账号的属性设置为password&#xff0c;这样点击登录按钮&#xff0c;看到的就是加密后的账号$("input[nameusername]"…

FPGA设计时序约束三、设置时钟组set_clock_groups

目录 一、背景 二、时钟间关系 2.1 时钟关系分类 2.2 时钟关系查看 三、异步时钟组 3.1 优先级 3.2 使用格式 3.3 asynchronous和exclusive 3.4 结果示例 四、参考资料 一、背景 Vivado中时序分析工具默认会分析设计中所有时钟相关的时序路径&#xff0c;除非时序约束…

Java包装类、装箱和拆箱

在 java 的设计中提倡一种思想&#xff0c;即一切皆对象。但是从数据类型的划分中&#xff0c;我们知道 Java 中的数据类型分为基本数据类型和引用数据类型&#xff0c;但是基本数据类型怎么能够称为对象呢&#xff1f;于是 Java 为每种基本数据类型分别设计了对应的类&#xf…

引导滤波融合matlab

引导滤波&#xff08;Guided Filter&#xff09;是一种用于图像增强和融合的技术&#xff0c;它可以用于将一幅图像的细节信息&#xff08;引导图像&#xff09;融合到另一幅图像&#xff08;目标图像&#xff09;中。在MATLAB中&#xff0c;你可以使用以下步骤来执行引导滤波融…

Games104现代游戏引擎笔记 基础ai

游戏AI navigation(导航系统) 地图的表达形式&#xff0c; 寻路&#xff0c;路径优化 Map representation&#xff1a; 1.可行走区域&#xff08;物理碰撞&#xff0c;跳跃距离&#xff0c;攀爬高度&#xff09; 2.表达形式&#xff1a;waypoint networks(路点网络图)&#…

交互式ICP

以下程序演示如何编写交互式ICP查看器。该程序将加载点云并对其进行刚性变换。之后&#xff0c;使用ICP算法将变换后的点云与原来的点云对齐。每次用户按下“空格”&#xff0c;进行ICP迭代&#xff0c;刷新可视化界面。 代码实现 资源准备 monkey.ply #include <string&…

I/O多路复用【Linux/网络】(C++实现select、poll和epoll服务器)

阅读前导&#xff1a; “I/O 多路复用”处于知识树中网络和操作系统的最后&#xff0c;因此本文默认读者有计算机网络和操作系统的基础。 1. 引入&#xff1a;C10K 问题 c10k 问题是指如何让一个服务器同时处理超过 10000 个客户端的连接&#xff0c;这是一个网络编程中的经…

STM32+USB3300复位枚举异常的问题

关键字&#xff1a;STM32F4&#xff0c;STM32H7&#xff0c;USB3300&#xff0c;USBHS&#xff0c;Reset复位 F4和H7用的都是DWC2的USBIP&#xff0c;我的板子上3300单片机工作的很好&#xff0c;插入枚举一切正常&#xff0c;但是设备收到上位机的复位命令后&#xff0c;单片…

ubuntu安装ssh

安装 OpenSSH 服务器&#xff08;如果尚未安装&#xff09;&#xff1a; apt-get update && apt-get upgrade -y sudo apt-get install -y openssh-server 检查 SSH 服务是否正在运行&#xff1a; sudo service ssh status 如果 SSH 服务未运行&#xff0c;请通过以…

Redis之主从复制,哨兵模式,集群

Redis之主从复制&#xff0c;哨兵模式&#xff0c;集群 1、主从复制1.1主从复制概述1.2Redis主从复制作用1.3Redis主从复制流程1.4部署Redis 主从复制 2、哨兵模式2.1哨兵模式原理2.2哨兵模式的作用2.3哨兵模式的结构2.4故障转移机制2.5搭建Redis 哨兵模式 3、Redis集群模式3.1…

Deep learning of free boundary and Stefan problems论文阅读复现

Deep learning of free boundary and Stefan problems论文阅读复现 摘要1. 一维一相Stefan问题1.1 Direct Stefan problem1.2 Inverse Type I1.3 Inverse Type II 2. 一维二相Stefan问题2.1 Direct Stefan problem2.2 Inverse Type I2.3 Inverse Type II 3. 二维一相Stefan问题…

数据结构 | (四) Queue

队列 &#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾&#xff08; Tail/Rear &#xff09; 出队列&#xff1a;进行删除操…

如何在mac a1系统下将mysql加入环境变量

mac系统若使用二进制软件包直接安装&#xff0c;默认路径为/usr/local/mysql 故而需要将/usr/local/mysql/bin加入到环境变量中即可&#xff0c;具体操作过程如下&#xff1a; 打开终端open -e .zprofile回车在TextEdit中追加如下内容&#xff0c;并保存 PATH"/usr/loc…

代码随想录 单调栈part2

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…

iOS App上架全流程及相关处理

iOS app上架总体流程&#xff1a; 一、IOS上架整个流程 1、申请开发者账号 2、创建APP ID及申请证书 3、itunes connect 创建APP 4、打包 上传APP 5、提交APP&#xff0c;上线成功 1、申请开发者账号 苹果开发者账号主要分为三种&#xff1a;个人账号、公司账号、企业账…

Linux安装单机PostgreSQL15.4

1. 联网rpm安装 1.1.关闭服务 ## 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service ## 关闭 selinux cat /etc/selinux/config SELINUXdisabled1.2.安装yum源 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-…

深度学习基础知识 register_buffer 与 register_parameter用法分析

深度学习基础知识 register_buffer 与 register_parameter用法分析 1、问题引入2、register_parameter()2.1 作用2.2 用法 3、register_buffer()3.1 作用3.2 用法 1、问题引入 思考问题&#xff1a;定义的weight与bias是否会被保存到网络的参数中&#xff0c;可否在优化器的作用…

使用webclient出现Exceeded limit on max bytes to buffer : 262144

使用webclient出现Exceeded limit on max bytes to buffer : 262144 由于公司技术升级&#xff0c;要求我用webflux的webclient替换原来的restTemplate&#xff0c;代码看起来很好改动&#xff0c;但是在改完后测试出现了这样的报错 org.springframework.core.io.buffer.Data…

《深入理解计算机系统》(2):虚拟内存

虚拟内存是一种对主存的抽象概念。 &#xff08;1&#xff09;将主存看作一个存储在磁盘上的地址空间的高速缓存&#xff0c;在主存中只保存活动区域&#xff0c;并根据需要在磁盘和主存之间来回传送数据&#xff0c;通过这种方式高效地使用内存 &#xff08;2&#xff09;为每…