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,一经查实,立即删除!

相关文章

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

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

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;进行删除操…

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

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

深度学习基础知识 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;可否在优化器的作用…

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

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

GitHub要求开启2FA,否则不让用了。

背景 其实大概在一个多月前&#xff0c;在 GitHub 网页端以及邮箱里都被提示&#xff1a;要求开启 2FA &#xff0c;即双因子认证&#xff1b;但是当时由于拖延症和侥幸心理作祟&#xff0c;直接忽略了相关信息&#xff0c;毕竟“又不是不能用”。。 只到今天发现 GitHub 直接…

Linux软硬链接和动静态库

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 软硬链接和动静态库 前言正文软硬链接原理使用 文件时间动静态库库介绍静态库静态库制作静态库的使用关于静态链接 动态库动态库制作动态库的使用关于动态链接 补充 最…

Java练习题-用冒泡排序法实现数组排序

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…

Computer Architecture Subtitle:Engineering And Technology

原文链接&#xff1a;https://www.cs.umd.edu/~meesh/411/CA-online/index.html

基于Springboot实现疫情网课管理系统项目【项目源码+论文说明】

基于Springboot实现疫情网课管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于疫情网课管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了疫情…

Windows11 安全中心页面不可用问题(无法打开病毒和威胁防护)解决方案汇总(图文介绍版)

本文目录 Windows版本与报错信息问题详细图片&#xff1a; 解决方案:方案一、管理员权限&#xff08;若你确定你的电脑只有你一个账户&#xff0c;则此教程无效&#xff0c;若你也不清楚&#xff0c;请阅读后再做打算&#xff09;方案二、修改注册表(常用方案)方案三、进入开发…

leetcode:2427. 公因子的数目(python3解法)

难度&#xff1a;简单 给你两个正整数 a 和 b &#xff0c;返回 a 和 b 的 公 因子的数目。 如果 x 可以同时整除 a 和 b &#xff0c;则认为 x 是 a 和 b 的一个 公因子 。 示例 1&#xff1a; 输入&#xff1a;a 12, b 6 输出&#xff1a;4 解释&#xff1a;12 和 6 的公因…

Meta分析的流程及方法

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…