有没有人有我的世界神奇宝贝下载1.7.10神奇宝贝服务器IP地址?

当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得url的html内容,然后使用BeautifulSoup抓取某个标签内容,结合正则表达式过滤。但是,用urllib.urlopen(url).read()获取的只是网页的静态html内容,很多动态数据(比如网站访问人数、当前在线人数、微博的点赞数等等)是不包含在静态html里面的,例如我要抓取这个bbs网站中
各个板块的当前在线人数,静态html网页是不包含的(不信你查看页面源代码试试,只有简单的一行)。像这些动态数据更多的是由JavaScript、JQuery、PHP等语言动态生成的,因此再用抓取静态html内容的方式就不合适了。
我尝试过网上所说的用浏览器自带的开发者工具(一般是F12弹出相应网页的开发者工具),查看网络可以获得动态数据的走向,但这需要从众多的url中找出蛛丝马迹,个人觉得太麻烦了。另外,用查看器查看的html内容也是包含动态数据的,但这有几个问题:怎么实时获取查看器的html内容?怎么将查看器的html导入python程序?因此利用查看器的html内容的方法也是不符合抓取程序要求的。
而偶然间发现了selenium模块,发现这个模块可以很方便地根据url加载页面获得session,并找到当前session的相应标签。本文将通过selenium webdriver模块的使用,以获取这些动态生成的内容,尤其是一些重要的动态数据。其实selenium模块的功能不是仅仅限于抓取网页,它是网络自动化测试的常用模块,在Ruby、Java里面都有广泛使用,Python里面虽然使用相对较少,但也是一个非常简洁高效容易上手的自动化测试模块。通过利用selenium的子模块webdriver的使用,解决抓取动态数据的问题,还可以可以对selenium有基本认识,为进一步学习自动化测试打下基础。
我是在windows 7系统上安装了Python 2.7版本,使用Python(X,Y)这个IDE,安装好的Python库没有自带selenium,在Python程序中直接import selenium会提示没有这个模块,联网状态下cmd直接输入pip install selenium,系统会找到Python的安装目录直接下载解压并安装这个模块。等到终端提示完成后可以看看,在C:\Python27\Lib\site-packages目录下有没有selenium模块,这个目录取决于你安装Python的路径。如果有selenium和selenium-2.47.3.dist-info这两个文件夹,代表模块可以在Python程序中被加载了。
使用webdriver抓取动态数据
1.先导入webdriver子模块
from selenium import webdriver
2.获得浏览器的session,浏览器用Firefox、Chrome、IE等都可以,这里以Firefox为例
browser = webdriver.Firefox()
3.加载页面,url自己指定一个合法的字符串即可
browser.get(url)
4.获得了session对象后,要定位元素,webdriver提供了一系列的元素定位方法,常用的有以下几种方式:
class-name
cssselector
比如通过id定位,返回所有元素组成的list,lis=borwser.find_elements_by_id_name('kw'')
通过class-name定位,lis=find_elements_by_class_name('title_1')
更详细的定位方式可以参考‘博客园-虫师’这个大神的selenium webdriver(python)教程的第三章-定位方式部分(第一版可在百度文库阅览,第二版开始就收费了&-&)
5.结合正则表达式过滤相关信息
定位后的元素有些是不想要的,用正则过滤掉即可,比如我想只提取英文字符(包括0-9),建立下面的正则
pile(r'\w+')
for u in lis:
&&& en=pa.findall(u.lis)
&&& print en
6.关闭会话
当执行完抓取操作后,必须关闭session,不然让它一直占内存会影响机器其他进程的运行
browser.close()或者browser.quit()都可以关闭session,前者只是关闭当前的session,浏览器的webdriver不关闭,后者则是包括webdriver这些东西全部shut down
7.加入异常处理
这是有必要的,因为有时会获得session失败,因此要把上述语句块放入try里面,然后exception处理异常
except NoSuchElementException:
&&&& assert 0, &can't find element&
我抓取了 指定分区中各个板块的在线人数,指定分区id号(0-9),可以获得板块名称和对应的在线人数,形成列表打印出来,代码如下
# -*- coding: utf-8 -*-
from selenium import webdriver
mon.exceptions import NoSuchElementException
import time
def find_sec(secid):
pile(r'\w+')
browser = webdriver.Firefox() # Get local session of firefox
browser.get(&/#!section/%s &%secid) # Load page
time.sleep(1) # Let the page load
#获得版面名称和在线人数,形成列表
board=browser.find_elements_by_class_name('title_1')
ol_num=browser.find_elements_by_class_name('title_4')
max_bindex=len(board)
max_oindex=len(ol_num)
assert max_bindex==max_oindex,'index not equivalent!'
#版面名称有中英文,因此用正则过滤只剩英文的
for i in range(1,max_oindex):
board_en=pa.findall(board[i].text)
result.append([str(board_en[-1]),int(ol_num[i].text)])
browser.close()
return result
except NoSuchElementException:
assert 0, &can't find element&
#打印分区5下面的所有板块的当前在线人数列表
print find_sec('5')
运行结果如下:
无论是从代码行数还是执行效率上看,selenium都非常优秀,用selenium webdriver抓取动态数据非常简洁高效,进一步地利用这个实现数据挖掘、机器学习等深层研究也是可以的,因此selenium+python是很值得深入学习的!
转载来自: &a href=http://blog.csdn.net/buptlrw/article/details/&&http://blog.csdn.net/buptlrw/article/details/
声明:如侵犯你的版权,请告知,收到通知会尽快删除的,谢谢!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2424次
排名:千里之外
转载:42篇
(1)(9)(33)(1)python webdriver中对不同下拉框通过文本值的选择
来源:博客园
在自动化中python对下拉框的处理网上相对实例比较少,其它前辈写的教程中对下拉也仅仅是相对与教程来说的,比如下面:

m=driver.find_element_by_id("ShippingMethod")
m.find_element_by_xpath("//option[@value='10.69']").click()

对下拉框后再进行属性定位的点击!
但在实际应用中,不可能通过value值来判断,一般都是通过当前显示的值来判断,所以教程只能教你入门,但应用还得靠自己。
废话少说,开始教程
一、典型的select option格式下接框
比如下面这样一段html代码,在实际自动化测试中不可能通过value值来判断,因为每次都得看value值,更多的时候是通过title值来判断的

&html&
&body&


&div class="menu_bar" style="margin: 0px 5px 0px 135"&
&div style="display: "&
&form style="display:inline" name="productForm" action="lib/general/navBar.php" method="get"&
&input type='hidden' name='CSRFName' id='CSRFName' value='CSRFGuard_' /&
&input type='hidden' name='CSRFToken' id='CSRFToken' value='a1bde48b4ed7adb73737bbdb356ec9ab3efa0cd9def28f2b2ac674d81cdcec7410e1cca36c31e7919c0' /&
测试产品
&select style="font-size: 80%;position: top:-1" name="testproject" onchange="this.form.submit();"&
&option value="2" title="test1:某某某监控系统"
test1:某某某监控系统&/option&
&option value="12810" title="test2:某某能力平台"
test2:某某能力平台&/option&
&option value="1332" title="test3:某某财务系统"
test3:某某财务系统&/option&
&option value="12684" title="test4:公共平台"
test4:公共平台&/option&
&option value="1" title="test5:北京雾霾监控"
selected="selected" &
test5:北京雾霾监控&/option&
&option value="31823" title="test6:QQ对接"
test6:QQ对接&/option&
&option value="32154" title="test7:南方都市报"
test7:南方都市报&/option&
&option value="1528" title="test8:联通平台"
test8:联通平台/option&
&option value="944" title="test9:移动平台"
test9:移动平台&/option&
&/select&
&/form&
&/div&
&/body&
&/html&测试产品test1:某某某监控系统test2:某某能力平台test3:某某财务系统test4:公共平台test5:北京雾霾监控test6:QQ对接test7:南方都市报test8:联通平台/option&test9:移动平台


例如我们要选择 test6:QQ对接
该如何选择呢,
方法一如下:

#遍历下拉框并选择需要的项目
select = browser.find_element_by_name("testproject")
allOptions = select.find_elements_by_tag_name("option")
for option in allOptions:
print "Value is: " + option.get_attribute("value")
print "Text is:" +option.text
if 'test6' in option.text:
option.click()
break

也可用网上的方法二:

Select(driver.find_element_by_name("testproject")).select_by_visible_text("test6:QQ对接")

但方法二必需要将文本写全才对选择,如果写错那也不能选
 
二、用了bootstrap特效的dropdow下拉框
 如下图中的下拉框


类型这种用下面这种方法:

browser.find_element_by_xpath("//div[contains(@class,'chosen-c')]").click()
time.sleep(1)

lis=browser.find_elements_by_xpath("//ul[@class='chosen-results']/li")

for li in lis:
if "行业测试" in li.text:
i.click()
break
time.sleep(2)

也是通过获取元素对像list来遍历,得到想要的数据后就停止,这里注意
find_elements_by_xpath
是elements三、我们在网上填写资料时,经常会遇到下面这种框这种款,不能手工输入,输入后会不识别,是因为后台将值传换为对应的code,所以必须靠手工选,比如深圳出入境申请网页的选择,可以用如下方法:

provides=browser.find_elements(By.XPATH,"//div[starts-with(@class,'x-grid3-row')]")while True:
if [ttd for ttd in provides if "江西" in ttd.text]:
for ttd in provides:
if "江西" in ttd.text:
print 'Click OK'
ttd.click()
break
else:continue
break
else:
browser.find_element_by_xpath("//button[starts-with(@class,'x-btn-text x-tbar-page-next')]").click()
provides=browser.find_elements(By.XPATH,"//div[starts-with(@class,'x-grid3-row')]")
print [provide.text for provide in provides][1]
time.sleep(1)


将元素获取后再将值循环,如果值在内就跳出循环,如果值不在内,就点击下一页
总结:在实际自动化测试中page_object模式中,这就非常方例如将数据提取出来了参考:
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 我的世界神奇宝贝小天 的文章

 

随机推荐